projects
/
lttng-tools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e3ee8bb
)
Filter: Implement rshift, lshift, bit not operators
author
Mathieu Desnoyers
<mathieu.desnoyers@efficios.com>
Fri, 22 Sep 2017 00:13:17 +0000
(20:13 -0400)
committer
Mathieu Desnoyers
<mathieu.desnoyers@efficios.com>
Mon, 25 Sep 2017 21:51:10 +0000
(17:51 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/lib/lttng-ctl/filter/filter-ast.h
patch
|
blob
|
blame
|
history
src/lib/lttng-ctl/filter/filter-bytecode.h
patch
|
blob
|
blame
|
history
src/lib/lttng-ctl/filter/filter-parser.y
patch
|
blob
|
blame
|
history
src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
patch
|
blob
|
blame
|
history
src/lib/lttng-ctl/filter/filter-visitor-generate-ir.c
patch
|
blob
|
blame
|
history
src/lib/lttng-ctl/filter/filter-visitor-xml.c
patch
|
blob
|
blame
|
history
tests/regression/tools/filtering/test_invalid_filter
patch
|
blob
|
blame
|
history
tests/regression/tools/filtering/test_unsupported_op
patch
|
blob
|
blame
|
history
tests/regression/tools/filtering/test_valid_filter
patch
|
blob
|
blame
|
history
diff --git
a/src/lib/lttng-ctl/filter/filter-ast.h
b/src/lib/lttng-ctl/filter/filter-ast.h
index 4bf42fd3fa915f0abf93a7c083a6c15c8fff9183..c5c73b69e8b9ee18281e33bd1f47ccf05d2dfe95 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-ast.h
+++ b/
src/lib/lttng-ctl/filter/filter-ast.h
@@
-67,8
+67,8
@@
enum op_type {
AST_OP_MOD,
AST_OP_PLUS,
AST_OP_MINUS,
AST_OP_MOD,
AST_OP_PLUS,
AST_OP_MINUS,
- AST_OP_RSHIFT,
- AST_OP_LSHIFT,
+ AST_OP_
BIT_
RSHIFT,
+ AST_OP_
BIT_
LSHIFT,
AST_OP_AND,
AST_OP_OR,
AST_OP_BIT_AND,
AST_OP_AND,
AST_OP_OR,
AST_OP_BIT_AND,
diff --git
a/src/lib/lttng-ctl/filter/filter-bytecode.h
b/src/lib/lttng-ctl/filter/filter-bytecode.h
index a86963f73274dcb94ed3e26277dee940d9417b0f..a0913af8b28f2004e3e1f9ae708cbc9f195fc42f 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-bytecode.h
+++ b/
src/lib/lttng-ctl/filter/filter-bytecode.h
@@
-71,8
+71,8
@@
enum filter_op {
FILTER_OP_MOD = 4,
FILTER_OP_PLUS = 5,
FILTER_OP_MINUS = 6,
FILTER_OP_MOD = 4,
FILTER_OP_PLUS = 5,
FILTER_OP_MINUS = 6,
- FILTER_OP_
RSHIFT
= 7,
- FILTER_OP_
LSHIFT
= 8,
+ FILTER_OP_
BIT_RSHIFT
= 7,
+ FILTER_OP_
BIT_LSHIFT
= 8,
FILTER_OP_BIT_AND = 9,
FILTER_OP_BIT_OR = 10,
FILTER_OP_BIT_XOR = 11,
FILTER_OP_BIT_AND = 9,
FILTER_OP_BIT_OR = 10,
FILTER_OP_BIT_XOR = 11,
@@
-201,6
+201,8
@@
enum filter_op {
FILTER_OP_LOAD_FIELD_SEQUENCE = 96,
FILTER_OP_LOAD_FIELD_DOUBLE = 97,
FILTER_OP_LOAD_FIELD_SEQUENCE = 96,
FILTER_OP_LOAD_FIELD_DOUBLE = 97,
+ FILTER_OP_UNARY_BIT_NOT = 98,
+
NR_FILTER_OPS,
};
NR_FILTER_OPS,
};
diff --git
a/src/lib/lttng-ctl/filter/filter-parser.y
b/src/lib/lttng-ctl/filter/filter-parser.y
index 7c4aebe8db3807ed4a2034bbccd95da625e0544d..2fa41ab405259d9eec1533ff47793a5d54cc3a26 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-parser.y
+++ b/
src/lib/lttng-ctl/filter/filter-parser.y
@@
-588,11
+588,11
@@
shift_expression
{ $$ = $1; }
| shift_expression LEFT_OP additive_expression
{
{ $$ = $1; }
| shift_expression LEFT_OP additive_expression
{
- $$ = make_op_node(parser_ctx, AST_OP_LSHIFT, $1, $3);
+ $$ = make_op_node(parser_ctx, AST_OP_
BIT_
LSHIFT, $1, $3);
}
| shift_expression RIGHT_OP additive_expression
{
}
| shift_expression RIGHT_OP additive_expression
{
- $$ = make_op_node(parser_ctx, AST_OP_RSHIFT, $1, $3);
+ $$ = make_op_node(parser_ctx, AST_OP_
BIT_
RSHIFT, $1, $3);
}
;
}
;
diff --git
a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
index 386734472b41ec12fce66389bba8b546afa69aba..bdf6bd4b5e013b082aa10735c880ce22ee3ce4b0 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
+++ b/
src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c
@@
-587,6
+587,9
@@
int visit_node_unary(struct filter_parser_ctx *ctx, struct ir_op *node)
case AST_UNARY_NOT:
insn.op = FILTER_OP_UNARY_NOT;
return bytecode_push(&ctx->bytecode, &insn, 1, sizeof(insn));
case AST_UNARY_NOT:
insn.op = FILTER_OP_UNARY_NOT;
return bytecode_push(&ctx->bytecode, &insn, 1, sizeof(insn));
+ case AST_UNARY_BIT_NOT:
+ insn.op = FILTER_OP_UNARY_BIT_NOT;
+ return bytecode_push(&ctx->bytecode, &insn, 1, sizeof(insn));
}
}
}
}
@@
-636,11
+639,11
@@
int visit_node_binary(struct filter_parser_ctx *ctx, struct ir_op *node)
case AST_OP_MINUS:
insn.op = FILTER_OP_MINUS;
break;
case AST_OP_MINUS:
insn.op = FILTER_OP_MINUS;
break;
- case AST_OP_RSHIFT:
- insn.op = FILTER_OP_RSHIFT;
+ case AST_OP_
BIT_
RSHIFT:
+ insn.op = FILTER_OP_
BIT_
RSHIFT;
break;
break;
- case AST_OP_LSHIFT:
- insn.op = FILTER_OP_LSHIFT;
+ case AST_OP_
BIT_
LSHIFT:
+ insn.op = FILTER_OP_
BIT_
LSHIFT;
break;
case AST_OP_BIT_AND:
insn.op = FILTER_OP_BIT_AND;
break;
case AST_OP_BIT_AND:
insn.op = FILTER_OP_BIT_AND;
diff --git
a/src/lib/lttng-ctl/filter/filter-visitor-generate-ir.c
b/src/lib/lttng-ctl/filter/filter-visitor-generate-ir.c
index d613b5dcdaa55ef8959d62c121a97c1b1e2dd6bc..187691847129c0f24b6e9f2c1c43e0b05e613a08 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-visitor-generate-ir.c
+++ b/
src/lib/lttng-ctl/filter/filter-visitor-generate-ir.c
@@
-384,6
+384,13
@@
struct ir_op *make_op_unary_not(struct ir_op *child, enum ir_side side)
child, side);
}
child, side);
}
+static
+struct ir_op *make_op_unary_bit_not(struct ir_op *child, enum ir_side side)
+{
+ return make_op_unary(AST_UNARY_BIT_NOT, "~", child->signedness,
+ child, side);
+}
+
static
struct ir_op *make_op_binary_compare(enum op_type bin_op_type,
const char *op_str, struct ir_op *left, struct ir_op *right,
static
struct ir_op *make_op_binary_compare(enum op_type bin_op_type,
const char *op_str, struct ir_op *left, struct ir_op *right,
@@
-564,6
+571,20
@@
struct ir_op *make_op_binary_logical_or(struct ir_op *left, struct ir_op *right,
return make_op_binary_logical(AST_OP_OR, "||", left, right, side);
}
return make_op_binary_logical(AST_OP_OR, "||", left, right, side);
}
+static
+struct ir_op *make_op_binary_bitwise_rshift(struct ir_op *left, struct ir_op *right,
+ enum ir_side side)
+{
+ return make_op_binary_bitwise(AST_OP_BIT_RSHIFT, ">>", left, right, side);
+}
+
+static
+struct ir_op *make_op_binary_bitwise_lshift(struct ir_op *left, struct ir_op *right,
+ enum ir_side side)
+{
+ return make_op_binary_bitwise(AST_OP_BIT_LSHIFT, "<<", left, right, side);
+}
+
static
struct ir_op *make_op_binary_bitwise_and(struct ir_op *left, struct ir_op *right,
enum ir_side side)
static
struct ir_op *make_op_binary_bitwise_and(struct ir_op *left, struct ir_op *right,
enum ir_side side)
@@
-742,13
+763,9
@@
struct ir_op *make_op(struct filter_parser_ctx *ctx,
case AST_OP_MINUS:
op_str = "-";
goto error_not_supported;
case AST_OP_MINUS:
op_str = "-";
goto error_not_supported;
- case AST_OP_RSHIFT:
- op_str = ">>";
- goto error_not_supported;
- case AST_OP_LSHIFT:
- op_str = "<<";
- goto error_not_supported;
+ case AST_OP_BIT_RSHIFT:
+ case AST_OP_BIT_LSHIFT:
case AST_OP_BIT_AND:
case AST_OP_BIT_OR:
case AST_OP_BIT_XOR:
case AST_OP_BIT_AND:
case AST_OP_BIT_OR:
case AST_OP_BIT_XOR:
@@
-820,6
+837,12
@@
struct ir_op *make_op(struct filter_parser_ctx *ctx,
case AST_OP_LE:
op = make_op_binary_le(lchild, rchild, side);
break;
case AST_OP_LE:
op = make_op_binary_le(lchild, rchild, side);
break;
+ case AST_OP_BIT_RSHIFT:
+ op = make_op_binary_bitwise_rshift(lchild, rchild, side);
+ break;
+ case AST_OP_BIT_LSHIFT:
+ op = make_op_binary_bitwise_lshift(lchild, rchild, side);
+ break;
case AST_OP_BIT_AND:
op = make_op_binary_bitwise_and(lchild, rchild, side);
break;
case AST_OP_BIT_AND:
op = make_op_binary_bitwise_and(lchild, rchild, side);
break;
@@
-849,8
+872,6
@@
static
struct ir_op *make_unary_op(struct filter_parser_ctx *ctx,
struct filter_node *node, enum ir_side side)
{
struct ir_op *make_unary_op(struct filter_parser_ctx *ctx,
struct filter_node *node, enum ir_side side)
{
- const char *op_str = "?";
-
switch (node->u.unary_op.type) {
case AST_UNARY_UNKNOWN:
default:
switch (node->u.unary_op.type) {
case AST_UNARY_UNKNOWN:
default:
@@
-904,14
+925,21
@@
struct ir_op *make_unary_op(struct filter_parser_ctx *ctx,
}
case AST_UNARY_BIT_NOT:
{
}
case AST_UNARY_BIT_NOT:
{
- op_str = "~";
- goto error_not_supported;
+ struct ir_op *op, *child;
+
+ child = generate_ir_recursive(ctx, node->u.unary_op.child,
+ side);
+ if (!child)
+ return NULL;
+ op = make_op_unary_bit_not(child, side);
+ if (!op) {
+ filter_free_ir_recursive(child);
+ return NULL;
+ }
+ return op;
}
}
}
}
-error_not_supported:
- fprintf(stderr, "[error] %s: unary operation '%s' not supported\n",
- __func__, op_str);
return NULL;
}
return NULL;
}
diff --git
a/src/lib/lttng-ctl/filter/filter-visitor-xml.c
b/src/lib/lttng-ctl/filter/filter-visitor-xml.c
index 1e5812015d7237798dd459c09b2a3fb8a9205171..9352742a51c50d8c81a0afce2fe60973912682c0 100644
(file)
--- a/
src/lib/lttng-ctl/filter/filter-visitor-xml.c
+++ b/
src/lib/lttng-ctl/filter/filter-visitor-xml.c
@@
-157,10
+157,10
@@
int recursive_visit_print(struct filter_node *node, FILE *stream, int indent)
case AST_OP_MINUS:
fprintf(stream, "\"-\"");
break;
case AST_OP_MINUS:
fprintf(stream, "\"-\"");
break;
- case AST_OP_RSHIFT:
+ case AST_OP_
BIT_
RSHIFT:
fprintf(stream, "\">>\"");
break;
fprintf(stream, "\">>\"");
break;
- case AST_OP_LSHIFT:
+ case AST_OP_
BIT_
LSHIFT:
fprintf(stream, "\"<<\"");
break;
case AST_OP_AND:
fprintf(stream, "\"<<\"");
break;
case AST_OP_AND:
diff --git
a/tests/regression/tools/filtering/test_invalid_filter
b/tests/regression/tools/filtering/test_invalid_filter
index 2c45ee09e75170b0738bec630cb8d6a8d409f893..bea17340797bf94fab2df9ff9ff93599b4e76eda 100755
(executable)
--- a/
tests/regression/tools/filtering/test_invalid_filter
+++ b/
tests/regression/tools/filtering/test_invalid_filter
@@
-25,8
+25,8
@@
EVENT_NAME="bogus"
ENABLE_EVENT_STDERR="/tmp/invalid-filters-stderr"
TRACE_PATH=$(mktemp -d)
NUM_GLOBAL_TESTS=2
ENABLE_EVENT_STDERR="/tmp/invalid-filters-stderr"
TRACE_PATH=$(mktemp -d)
NUM_GLOBAL_TESTS=2
-NUM_UST_TESTS=1
44
-NUM_KERNEL_TESTS=1
44
+NUM_UST_TESTS=1
35
+NUM_KERNEL_TESTS=1
35
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
@@
-101,9
+101,6
@@
INVALID_FILTERS=(
"intfield/1"
"intfield+1"
"intfield-1"
"intfield/1"
"intfield+1"
"intfield-1"
- "intfield>>1"
- "intfield<<1"
- "~intfield"
"1+11111-3333+1"
"(1+2)*(55*666)"
"1+2*55*666"
"1+11111-3333+1"
"(1+2)*(55*666)"
"1+2*55*666"
diff --git
a/tests/regression/tools/filtering/test_unsupported_op
b/tests/regression/tools/filtering/test_unsupported_op
index 7395da0dd8043a9a679c5e6b827ba001982ef4e7..357e81c683187eca1c8a4adf342b1ff0afcb9262 100755
(executable)
--- a/
tests/regression/tools/filtering/test_unsupported_op
+++ b/
tests/regression/tools/filtering/test_unsupported_op
@@
-25,8
+25,8
@@
EVENT_NAME="bogus"
ENABLE_EVENT_STDERR="/tmp/unsupported-ops-enable"
TRACE_PATH=$(mktemp -d)
NUM_GLOBAL_TESTS=2
ENABLE_EVENT_STDERR="/tmp/unsupported-ops-enable"
TRACE_PATH=$(mktemp -d)
NUM_GLOBAL_TESTS=2
-NUM_UST_TESTS=
32
-NUM_KERNEL_TESTS=
32
+NUM_UST_TESTS=
20
+NUM_KERNEL_TESTS=
20
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
@@
-93,10
+93,9
@@
plan_tests $NUM_TESTS
print_test_banner "$TEST_DESC"
# Unsupported operators
print_test_banner "$TEST_DESC"
# Unsupported operators
-OP_STR=("MUL" "DIV" "MOD" "PLUS" "MINUS" "LSHIFT" "RSHIFT"
- "UNARY_BIN_NOT")
+OP_STR=("MUL" "DIV" "MOD" "PLUS" "MINUS")
-OP_TKN=("*" "/" "%" "+" "-"
"<<" ">>" "~"
)
+OP_TKN=("*" "/" "%" "+" "-")
OP_COUNT=${#OP_STR[@]}
OP_COUNT=${#OP_STR[@]}
diff --git
a/tests/regression/tools/filtering/test_valid_filter
b/tests/regression/tools/filtering/test_valid_filter
index a916b188441b8f97eaae026d085fc532227488d1..722a6f6ad94e6bcc7a6eb3e73d24dac86032d3d5 100755
(executable)
--- 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
SESSION_NAME="valid_filter"
NR_ITER=100
NUM_GLOBAL_TESTS=2
-NUM_UST_TESTS=10
02
-NUM_KERNEL_TESTS=
936
+NUM_UST_TESTS=10
74
+NUM_KERNEL_TESTS=
1008
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
NUM_TESTS=$(($NUM_UST_TESTS+$NUM_KERNEL_TESTS+$NUM_GLOBAL_TESTS))
source $TESTDIR/utils/utils.sh
@@
-682,6
+682,42
@@
UST_FILTERS=(
true_statement
"0xF00F0F ^ 0xFF0F00 == 0x0F000F"
true_statement
"0xF00F0F ^ 0xFF0F00 == 0x0F000F"
+ true_statement
+ "(1 << 1) == 2"
+
+ true_statement
+ "(4 >> 1) == 2"
+
+ true_statement
+ "(1 << 8) == 256"
+
+ true_statement
+ "(262144 >> 16) == 4"
+
+ true_statement
+ "(~0 & 0xffff) == 0xffff"
+
+ true_statement
+ "(~0 & 0xffffffff) == 0xffffffff"
+
+ true_statement
+ "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
+
+ true_statement
+ "-1==~0"
+
+ true_statement
+ "1<<1==2" # C99 operator priority: comparator before bitwise
+
+ has_no_event
+ "!(1<<1==2)" # C99 operator priority: comparator before bitwise
+
+ true_statement
+ "(1 << 32) == 4294967296"
+
+ true_statement
+ "(1 << 63) == 9223372036854775808"
+
true_statement
"arrfield1[2] & 1 == 1"
true_statement
"arrfield1[2] & 1 == 1"
@@
-1107,6
+1143,42
@@
KERNEL_FILTERS=(
true_statement
"0xF00F0F ^ 0xFF0F00 == 0x0F000F"
true_statement
"0xF00F0F ^ 0xFF0F00 == 0x0F000F"
+ true_statement
+ "(1 << 1) == 2"
+
+ true_statement
+ "(4 >> 1) == 2"
+
+ true_statement
+ "(1 << 8) == 256"
+
+ true_statement
+ "(262144 >> 16) == 4"
+
+ true_statement
+ "(~0 & 0xffff) == 0xffff"
+
+ true_statement
+ "(~0 & 0xffffffff) == 0xffffffff"
+
+ true_statement
+ "(~0 & 0xffffffffffffffff) == 0xffffffffffffffff"
+
+ true_statement
+ "-1==~0"
+
+ true_statement
+ "1<<1==2" # C99 operator priority: comparator before bitwise
+
+ has_no_event
+ "!(1<<1==2)" # C99 operator priority: comparator before bitwise
+
+ true_statement
+ "(1 << 32) == 4294967296"
+
+ true_statement
+ "(1 << 63) == 9223372036854775808"
+
true_statement
"arrfield1[2] & 1 == 1"
true_statement
"arrfield1[2] & 1 == 1"
This page took
0.033626 seconds
and
5
git commands to generate.