perf metric: Change expr__get_id to return struct expr_id_data
[linux-2.6-microblaze.git] / tools / perf / util / expr.y
index bf3e898..0d4f5d3 100644 (file)
 #include "smt.h"
 #include <string.h>
 
+static double d_ratio(double val0, double val1)
+{
+       if (val1 == 0) {
+               return 0;
+       }
+       return  val0 / val1;
+}
+
 %}
 
 %define api.pure full
 %token <num> NUMBER
 %token <str> ID
 %destructor { free ($$); } <str>
-%token MIN MAX IF ELSE SMT_ON
+%token MIN MAX IF ELSE SMT_ON D_RATIO
 %left MIN MAX IF
 %left '|'
 %left '^'
 %left '&'
+%left '<' '>'
 %left '-' '+'
 %left '*' '/' '%'
 %left NEG NOT
@@ -60,11 +69,12 @@ all_other: all_other other
 
 other: ID
 {
-       expr__add_id(ctx, $1, 0.0);
+       expr__add_id(ctx, $1);
 }
 |
 MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
-
+|
+'<' | '>' | D_RATIO
 
 all_expr: if_expr                      { *final_val = $1; }
        ;
@@ -75,16 +85,22 @@ if_expr:
        ;
 
 expr:    NUMBER
-       | ID                    { if (expr__get_id(ctx, $1, &$$)) {
-                                       pr_debug("%s not found\n", $1);
+       | ID                    {
+                                       struct expr_id_data *data;
+
+                                       if (expr__get_id(ctx, $1, &data) || !data) {
+                                               pr_debug("%s not found\n", $1);
+                                               free($1);
+                                               YYABORT;
+                                       }
+                                       $$ = data->val;
                                        free($1);
-                                       YYABORT;
-                                 }
-                                 free($1);
                                }
        | expr '|' expr         { $$ = (long)$1 | (long)$3; }
        | expr '&' expr         { $$ = (long)$1 & (long)$3; }
        | expr '^' expr         { $$ = (long)$1 ^ (long)$3; }
+       | expr '<' expr         { $$ = $1 < $3; }
+       | expr '>' expr         { $$ = $1 > $3; }
        | expr '+' expr         { $$ = $1 + $3; }
        | expr '-' expr         { $$ = $1 - $3; }
        | expr '*' expr         { $$ = $1 * $3; }
@@ -105,6 +121,7 @@ expr:         NUMBER
        | MIN '(' expr ',' expr ')' { $$ = $3 < $5 ? $3 : $5; }
        | MAX '(' expr ',' expr ')' { $$ = $3 > $5 ? $3 : $5; }
        | SMT_ON                 { $$ = smt_on() > 0; }
+       | D_RATIO '(' expr ',' expr ')' { $$ = d_ratio($3,$5); }
        ;
 
 %%