From 831b702b8e8914a3ca3b4905a55aed93c7d30bbf Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 22 Sep 2017 17:38:13 -0400 Subject: [PATCH] Filter: make bitwise and, or, xor higher prio than relational expressions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It seems that the usual use-case for bitwise ops are to apply them on values rather than on the result of equality/inequality. Therefore, move away from the C operator precedence order, and ensure bitwise and, or, xor are higher priority than relational expressions (equality and inequality). Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/lib/lttng-ctl/filter/filter-parser.y | 68 +++++++++---------- .../tools/filtering/test_valid_filter | 28 +++++--- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/lib/lttng-ctl/filter/filter-parser.y b/src/lib/lttng-ctl/filter/filter-parser.y index 2fa41ab40..e9c2e6aab 100644 --- a/src/lib/lttng-ctl/filter/filter-parser.y +++ b/src/lib/lttng-ctl/filter/filter-parser.y @@ -596,22 +596,49 @@ shift_expression } ; -relational_expression +and_expression : shift_expression { $$ = $1; } - | relational_expression LT_OP shift_expression + | and_expression AND_BIN shift_expression + { + $$ = make_op_node(parser_ctx, AST_OP_BIT_AND, $1, $3); + } + ; + +exclusive_or_expression + : and_expression + { $$ = $1; } + | exclusive_or_expression XOR_BIN and_expression + { + $$ = make_op_node(parser_ctx, AST_OP_BIT_XOR, $1, $3); + } + ; + +inclusive_or_expression + : exclusive_or_expression + { $$ = $1; } + | inclusive_or_expression OR_BIN exclusive_or_expression + { + $$ = make_op_node(parser_ctx, AST_OP_BIT_OR, $1, $3); + } + ; + +relational_expression + : inclusive_or_expression + { $$ = $1; } + | relational_expression LT_OP inclusive_or_expression { $$ = make_op_node(parser_ctx, AST_OP_LT, $1, $3); } - | relational_expression GT_OP shift_expression + | relational_expression GT_OP inclusive_or_expression { $$ = make_op_node(parser_ctx, AST_OP_GT, $1, $3); } - | relational_expression LE_OP shift_expression + | relational_expression LE_OP inclusive_or_expression { $$ = make_op_node(parser_ctx, AST_OP_LE, $1, $3); } - | relational_expression GE_OP shift_expression + | relational_expression GE_OP inclusive_or_expression { $$ = make_op_node(parser_ctx, AST_OP_GE, $1, $3); } @@ -630,37 +657,10 @@ equality_expression } ; -and_expression - : equality_expression - { $$ = $1; } - | and_expression AND_BIN equality_expression - { - $$ = make_op_node(parser_ctx, AST_OP_BIT_AND, $1, $3); - } - ; - -exclusive_or_expression - : and_expression - { $$ = $1; } - | exclusive_or_expression XOR_BIN and_expression - { - $$ = make_op_node(parser_ctx, AST_OP_BIT_XOR, $1, $3); - } - ; - -inclusive_or_expression - : exclusive_or_expression - { $$ = $1; } - | inclusive_or_expression OR_BIN exclusive_or_expression - { - $$ = make_op_node(parser_ctx, AST_OP_BIT_OR, $1, $3); - } - ; - logical_and_expression - : inclusive_or_expression + : equality_expression { $$ = $1; } - | logical_and_expression AND_OP inclusive_or_expression + | logical_and_expression AND_OP equality_expression { $$ = make_op_node(parser_ctx, AST_OP_AND, $1, $3); } diff --git a/tests/regression/tools/filtering/test_valid_filter b/tests/regression/tools/filtering/test_valid_filter index 725d82d4a..6503cba24 100755 --- a/tests/regression/tools/filtering/test_valid_filter +++ b/tests/regression/tools/filtering/test_valid_filter @@ -24,8 +24,8 @@ STATS_BIN="$TESTDIR/utils/babelstats.pl" SESSION_NAME="valid_filter" NR_ITER=100 NUM_GLOBAL_TESTS=2 -NUM_UST_TESTS=1098 -NUM_KERNEL_TESTS=1032 +NUM_UST_TESTS=1110 +NUM_KERNEL_TESTS=1044 NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS)) source $TESTDIR/utils/utils.sh @@ -719,10 +719,16 @@ UST_FILTERS=( "(1<<63) < 0" true_statement - "1<<1==2" # C99 operator priority: comparator before bitwise + "(1<<2!=4)==0" # operator priority: shift before equality - has_no_event - "!(1<<1==2)" # C99 operator priority: comparator before bitwise + true_statement + "1&3==1" # operator priority: masks before equality + + true_statement + "(3|1==3)==1" # operator priority: masks before equality + + true_statement + "(2^1==3)==1" # operator priority: masks before equality true_statement "(1 << 32) == 4294967296" @@ -1192,10 +1198,16 @@ KERNEL_FILTERS=( "(1<<63) < 0" true_statement - "1<<1==2" # C99 operator priority: comparator before bitwise + "(1<<2!=4)==0" # operator priority: shift before equality - has_no_event - "!(1<<1==2)" # C99 operator priority: comparator before bitwise + true_statement + "1&3==1" # operator priority: masks before equality + + true_statement + "(3|1==3)==1" # operator priority: masks before equality + + true_statement + "(2^1==3)==1" # operator priority: masks before equality true_statement "(1 << 32) == 4294967296" -- 2.34.1