X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-filter-specialize.c;h=171895b7da722dae9cbd52ff5ef425ec9fc10755;hb=d97f9b785f05c29dbabb57da9a32c8c4317da8d3;hp=b7ab6158cb4f8cbff6001095a927f1f16eeb9a7d;hpb=d8d2416dab454962b90222ba46c82cdce0c666a4;p=lttng-ust.git diff --git a/liblttng-ust/lttng-filter-specialize.c b/liblttng-ust/lttng-filter-specialize.c index b7ab6158..171895b7 100644 --- a/liblttng-ust/lttng-filter-specialize.c +++ b/liblttng-ust/lttng-filter-specialize.c @@ -157,24 +157,24 @@ static int specialize_load_field(struct vstack_entry *stack_top, break; case OBJECT_TYPE_U8: dbg_printf("op load field u8\n"); - stack_top->type = REG_S64; + stack_top->type = REG_U64; insn->op = FILTER_OP_LOAD_FIELD_U8; break; case OBJECT_TYPE_U16: dbg_printf("op load field u16\n"); - stack_top->type = REG_S64; + stack_top->type = REG_U64; if (!stack_top->load.rev_bo) insn->op = FILTER_OP_LOAD_FIELD_U16; break; case OBJECT_TYPE_U32: dbg_printf("op load field u32\n"); - stack_top->type = REG_S64; + stack_top->type = REG_U64; if (!stack_top->load.rev_bo) insn->op = FILTER_OP_LOAD_FIELD_U32; break; case OBJECT_TYPE_U64: dbg_printf("op load field u64\n"); - stack_top->type = REG_S64; + stack_top->type = REG_U64; if (!stack_top->load.rev_bo) insn->op = FILTER_OP_LOAD_FIELD_U64; break; @@ -396,9 +396,7 @@ static int specialize_load_object(const struct lttng_event_field *field, struct vstack_load *load, bool is_context) { load->type = LOAD_OBJECT; - /* - * LTTng-UST layout all integer fields as s64 on the stack for the filter. - */ + switch (field->type.atype) { case atype_integer: if (field->type.u.integer.signedness) @@ -700,13 +698,15 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, goto end; case FILTER_OP_RETURN: - if (vstack_ax(stack)->type == REG_S64) + if (vstack_ax(stack)->type == REG_S64 || + vstack_ax(stack)->type == REG_U64) *(filter_opcode_t *) pc = FILTER_OP_RETURN_S64; ret = 0; goto end; case FILTER_OP_RETURN_S64: - if (vstack_ax(stack)->type != REG_S64) { + if (vstack_ax(stack)->type != REG_S64 && + vstack_ax(stack)->type != REG_U64) { ERR("Unexpected register type\n"); ret = -EINVAL; goto end; @@ -749,9 +749,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_EQ_STAR_GLOB_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_EQ_S64; else insn->op = FILTER_OP_EQ_DOUBLE_S64; @@ -759,7 +761,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_EQ_S64_DOUBLE; else insn->op = FILTER_OP_EQ_DOUBLE; @@ -801,9 +804,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_NE_STAR_GLOB_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_NE_S64; else insn->op = FILTER_OP_NE_DOUBLE_S64; @@ -811,7 +816,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_NE_S64_DOUBLE; else insn->op = FILTER_OP_NE_DOUBLE; @@ -849,9 +855,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_GT_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_GT_S64; else insn->op = FILTER_OP_GT_DOUBLE_S64; @@ -859,7 +867,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_GT_S64_DOUBLE; else insn->op = FILTER_OP_GT_DOUBLE; @@ -897,9 +906,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_LT_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_LT_S64; else insn->op = FILTER_OP_LT_DOUBLE_S64; @@ -907,7 +918,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_LT_S64_DOUBLE; else insn->op = FILTER_OP_LT_DOUBLE; @@ -945,9 +957,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_GE_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_GE_S64; else insn->op = FILTER_OP_GE_DOUBLE_S64; @@ -955,7 +969,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_GE_S64_DOUBLE; else insn->op = FILTER_OP_GE_DOUBLE; @@ -968,7 +983,7 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, ret = -EINVAL; goto end; } - vstack_ax(stack)->type = REG_S64; + vstack_ax(stack)->type = REG_U64; next_pc += sizeof(struct binary_op); break; } @@ -992,9 +1007,11 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_LE_STRING; break; case REG_S64: + case REG_U64: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_LE_S64; else insn->op = FILTER_OP_LE_DOUBLE_S64; @@ -1002,7 +1019,8 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case REG_DOUBLE: if (vstack_bx(stack)->type == REG_UNKNOWN) break; - if (vstack_bx(stack)->type == REG_S64) + if (vstack_bx(stack)->type == REG_S64 || + vstack_bx(stack)->type == REG_U64) insn->op = FILTER_OP_LE_S64_DOUBLE; else insn->op = FILTER_OP_LE_DOUBLE; @@ -1047,6 +1065,17 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case FILTER_OP_LT_S64_DOUBLE: case FILTER_OP_GE_S64_DOUBLE: case FILTER_OP_LE_S64_DOUBLE: + { + /* Pop 2, push 1 */ + if (vstack_pop(stack)) { + ret = -EINVAL; + goto end; + } + vstack_ax(stack)->type = REG_S64; + next_pc += sizeof(struct binary_op); + break; + } + case FILTER_OP_BIT_RSHIFT: case FILTER_OP_BIT_LSHIFT: case FILTER_OP_BIT_AND: @@ -1075,6 +1104,7 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_PLUS_S64; break; case REG_DOUBLE: @@ -1099,6 +1129,7 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_MINUS_S64; break; case REG_DOUBLE: @@ -1123,6 +1154,7 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_NOT_S64; break; case REG_DOUBLE: @@ -1296,6 +1328,7 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, insn->op = FILTER_OP_CAST_DOUBLE_TO_S64; break; case REG_UNKNOWN: + case REG_U64: break; } /* Pop 1, push 1 */ @@ -1371,13 +1404,20 @@ int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, case FILTER_OP_LOAD_FIELD_S16: case FILTER_OP_LOAD_FIELD_S32: case FILTER_OP_LOAD_FIELD_S64: + { + /* Pop 1, push 1 */ + vstack_ax(stack)->type = REG_S64; + next_pc += sizeof(struct load_op); + break; + } + case FILTER_OP_LOAD_FIELD_U8: case FILTER_OP_LOAD_FIELD_U16: case FILTER_OP_LOAD_FIELD_U32: case FILTER_OP_LOAD_FIELD_U64: { /* Pop 1, push 1 */ - vstack_ax(stack)->type = REG_S64; + vstack_ax(stack)->type = REG_U64; next_pc += sizeof(struct load_op); break; }