X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-filter-specialize.c;h=171895b7da722dae9cbd52ff5ef425ec9fc10755;hb=d97f9b785f05c29dbabb57da9a32c8c4317da8d3;hp=d4f8a957f51ff191f348121008a8cc3c9800ceb5;hpb=92495593f8a331d04f993e396de9f2caa748fb6f;p=lttng-ust.git diff --git a/liblttng-ust/lttng-filter-specialize.c b/liblttng-ust/lttng-filter-specialize.c index d4f8a957..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) @@ -599,14 +597,13 @@ end: return ret; } -static int specialize_event_payload_lookup(struct lttng_event *event, +static int specialize_payload_lookup(const struct lttng_event_desc *event_desc, struct bytecode_runtime *runtime, struct load_op *insn, struct vstack_load *load) { const char *name; uint16_t offset; - const struct lttng_event_desc *desc = event->desc; unsigned int i, nr_fields; bool found = false; uint32_t field_offset = 0; @@ -615,11 +612,11 @@ static int specialize_event_payload_lookup(struct lttng_event *event, struct filter_get_index_data gid; ssize_t data_offset; - nr_fields = desc->nr_fields; + nr_fields = event_desc->nr_fields; offset = ((struct get_symbol *) insn->data)->offset; name = runtime->p.bc->bc.data + runtime->p.bc->bc.reloc_offset + offset; for (i = 0; i < nr_fields; i++) { - field = &desc->fields[i]; + field = &event_desc->fields[i]; if (field->u.ext.nofilter) { continue; } @@ -678,7 +675,7 @@ end: return ret; } -int lttng_filter_specialize_bytecode(struct lttng_event *event, +int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc, struct bytecode_runtime *bytecode) { void *pc, *next_pc, *start_pc; @@ -701,13 +698,15 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -750,9 +749,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -760,7 +761,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -802,9 +804,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -812,7 +816,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -850,9 +855,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -860,7 +867,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -898,9 +906,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -908,7 +918,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -946,9 +957,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -956,7 +969,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -969,7 +983,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, ret = -EINVAL; goto end; } - vstack_ax(stack)->type = REG_S64; + vstack_ax(stack)->type = REG_U64; next_pc += sizeof(struct binary_op); break; } @@ -993,9 +1007,11 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -1003,7 +1019,8 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; @@ -1048,6 +1065,17 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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: @@ -1076,6 +1104,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_PLUS_S64; break; case REG_DOUBLE: @@ -1100,6 +1129,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_MINUS_S64; break; case REG_DOUBLE: @@ -1124,6 +1154,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, goto end; case REG_S64: + case REG_U64: insn->op = FILTER_OP_UNARY_NOT_S64; break; case REG_DOUBLE: @@ -1297,6 +1328,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, insn->op = FILTER_OP_CAST_DOUBLE_TO_S64; break; case REG_UNKNOWN: + case REG_U64: break; } /* Pop 1, push 1 */ @@ -1372,13 +1404,20 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, 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; } @@ -1428,7 +1467,7 @@ int lttng_filter_specialize_bytecode(struct lttng_event *event, break; case LOAD_ROOT_PAYLOAD: /* Lookup event payload field. */ - ret = specialize_event_payload_lookup(event, + ret = specialize_payload_lookup(event_desc, bytecode, insn, &vstack_ax(stack)->load); if (ret)