From 86cc38052559232f4c868b7ae2ef02d426e68ee5 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 13 Jul 2012 18:10:34 -0400 Subject: [PATCH] Implement dispatch-table based interpretor Signed-off-by: Mathieu Desnoyers --- liblttng-ust/lttng-filter.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) 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) { -- 2.34.1