X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-filter.c;h=60879e1fc73f437e134130b55adce25a3ab08cb2;hb=86cc38052559232f4c868b7ae2ef02d426e68ee5;hp=7fe2a7b5d5642cb3ac92f0de76589448956ea2c6;hpb=6f992ca3cfcdb8f9e272a847328bcd1d9426ef1f;p=lttng-ust.git diff --git a/liblttng-ust/lttng-filter.c b/liblttng-ust/lttng-filter.c index 7fe2a7b5..60879e1f 100644 --- a/liblttng-ust/lttng-filter.c +++ b/liblttng-ust/lttng-filter.c @@ -264,10 +264,12 @@ int lttng_filter_false(void *filter_data, return 0; } -#define INTERPRETER_USE_SWITCH - #ifdef INTERPRETER_USE_SWITCH +/* + * Fallback for compilers that do not support taking address of labels. + */ + #define START_OP \ start_pc = &bytecode->data[0]; \ for (pc = next_pc = start_pc; pc - start_pc < bytecode->len; \ @@ -286,7 +288,25 @@ int lttng_filter_false(void *filter_data, #else -#define OP(name) +/* + * Dispatch-table based interpreter. + */ + +#define START_OP \ + start_pc = &bytecode->data[0]; \ + pc = next_pc = start_pc; \ + if (unlikely(pc - start_pc >= bytecode->len)) \ + goto end; \ + goto *dispatch[*(filter_opcode_t *) pc]; + +#define OP(name) \ +LABEL_##name + +#define PO \ + pc = next_pc; \ + goto *dispatch[*(filter_opcode_t *) pc]; + +#define END_OP #endif @@ -301,7 +321,7 @@ int lttng_filter_interpret_bytecode(void *filter_data, struct reg reg[NR_REG]; #ifndef INTERPRETER_USE_SWITCH static void *dispatch[NR_FILTER_OPS] = { - [ FILTER_OP_UNKNOWN ] = &&LABEL_FILTER_OP_UNKNOWN = 0, + [ FILTER_OP_UNKNOWN ] = &&LABEL_FILTER_OP_UNKNOWN, [ FILTER_OP_RETURN ] = &&LABEL_FILTER_OP_RETURN, @@ -774,6 +794,11 @@ end: return retval; } +#undef START_OP +#undef OP +#undef PO +#undef END_OP + static int bin_op_compare_check(struct vreg reg[NR_REG], const char *str) {