X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-bytecode-interpreter.c;h=15ce63634030bff71744e920c209e81f8e3c7807;hb=9f5ade14faf36df6429d9c6e1d0360854a5669d0;hp=9def26cd4f0e572b3157cc804bd4475f54c34071;hpb=bf617e2041b908520b7e167b3401f277c9d4b4d4;p=lttng-ust.git diff --git a/liblttng-ust/lttng-bytecode-interpreter.c b/liblttng-ust/lttng-bytecode-interpreter.c index 9def26cd..15ce6363 100644 --- a/liblttng-ust/lttng-bytecode-interpreter.c +++ b/liblttng-ust/lttng-bytecode-interpreter.c @@ -13,6 +13,7 @@ #include #include #include +#include "ust-events-internal.h" #include "lttng-bytecode.h" #include "string-utils.h" @@ -150,14 +151,14 @@ int stack_strcmp(struct estack *stack, int top, const char *cmp_type) uint64_t lttng_bytecode_filter_interpret_false(void *filter_data, const char *filter_stack_data) { - return LTTNG_INTERPRETER_DISCARD; + return LTTNG_UST_BYTECODE_INTERPRETER_DISCARD; } uint64_t lttng_bytecode_capture_interpret_false(void *capture_data, const char *capture_stack_data, struct lttng_interpreter_output *output) { - return LTTNG_INTERPRETER_DISCARD; + return LTTNG_UST_BYTECODE_INTERPRETER_DISCARD; } #ifdef INTERPRETER_USE_SWITCH @@ -216,24 +217,24 @@ LABEL_##name #define IS_INTEGER_REGISTER(reg_type) \ (reg_type == REG_U64 || reg_type == REG_S64) -static int context_get_index(struct lttng_ctx *ctx, +static int context_get_index(struct lttng_ust_ctx *ctx, struct load_ptr *ptr, uint32_t idx) { - struct lttng_ctx_field *ctx_field; - struct lttng_event_field *field; - struct lttng_ctx_value v; + struct lttng_ust_ctx_field *ctx_field; + struct lttng_ust_event_field *field; + struct lttng_ust_ctx_value v; - ctx_field = &ctx->fields[idx]; - field = &ctx_field->event_field; + ctx_field = ctx->fields[idx]; + field = ctx_field->event_field; ptr->type = LOAD_OBJECT; ptr->field = field; - switch (field->type.atype) { - case atype_integer: + switch (field->type->type) { + case lttng_ust_type_integer: ctx_field->get_value(ctx_field, &v); - if (field->type.u.integer.signedness) { + if (lttng_ust_get_type_integer(field->type)->signedness) { ptr->object_type = OBJECT_TYPE_S64; ptr->u.s64 = v.u.s64; ptr->ptr = &ptr->u.s64; @@ -243,16 +244,11 @@ static int context_get_index(struct lttng_ctx *ctx, ptr->ptr = &ptr->u.u64; } break; - case atype_enum: /* Fall-through */ - case atype_enum_nestable: + case lttng_ust_type_enum: { - const struct lttng_integer_type *itype; + const struct lttng_ust_type_integer *itype; - if (field->type.atype == atype_enum) { - itype = &field->type.u.legacy.basic.enumeration.container_type; - } else { - itype = &field->type.u.enum_nestable.container_type->u.integer; - } + itype = lttng_ust_get_type_integer(lttng_ust_get_type_enum(field->type)->container_type); ctx_field->get_value(ctx_field, &v); if (itype->signedness) { ptr->object_type = OBJECT_TYPE_SIGNED_ENUM; @@ -265,25 +261,12 @@ static int context_get_index(struct lttng_ctx *ctx, } break; } - case atype_array: - if (field->type.u.legacy.array.elem_type.atype != atype_integer) { - ERR("Array nesting only supports integer types."); - return -EINVAL; - } - if (field->type.u.legacy.array.elem_type.u.basic.integer.encoding == lttng_encode_none) { - ERR("Only string arrays are supported for contexts."); - return -EINVAL; - } - ptr->object_type = OBJECT_TYPE_STRING; - ctx_field->get_value(ctx_field, &v); - ptr->ptr = v.u.str; - break; - case atype_array_nestable: - if (field->type.u.array_nestable.elem_type->atype != atype_integer) { + case lttng_ust_type_array: + if (lttng_ust_get_type_array(field->type)->elem_type->type != lttng_ust_type_integer) { ERR("Array nesting only supports integer types."); return -EINVAL; } - if (field->type.u.array_nestable.elem_type->u.integer.encoding == lttng_encode_none) { + if (lttng_ust_get_type_array(field->type)->encoding == lttng_ust_string_encoding_none) { ERR("Only string arrays are supported for contexts."); return -EINVAL; } @@ -291,12 +274,12 @@ static int context_get_index(struct lttng_ctx *ctx, ctx_field->get_value(ctx_field, &v); ptr->ptr = v.u.str; break; - case atype_sequence: - if (field->type.u.legacy.sequence.elem_type.atype != atype_integer) { + case lttng_ust_type_sequence: + if (lttng_ust_get_type_sequence(field->type)->elem_type->type != lttng_ust_type_integer) { ERR("Sequence nesting only supports integer types."); return -EINVAL; } - if (field->type.u.legacy.sequence.elem_type.u.basic.integer.encoding == lttng_encode_none) { + if (lttng_ust_get_type_sequence(field->type)->encoding == lttng_ust_string_encoding_none) { ERR("Only string sequences are supported for contexts."); return -EINVAL; } @@ -304,31 +287,18 @@ static int context_get_index(struct lttng_ctx *ctx, ctx_field->get_value(ctx_field, &v); ptr->ptr = v.u.str; break; - case atype_sequence_nestable: - if (field->type.u.sequence_nestable.elem_type->atype != atype_integer) { - ERR("Sequence nesting only supports integer types."); - return -EINVAL; - } - if (field->type.u.sequence_nestable.elem_type->u.integer.encoding == lttng_encode_none) { - ERR("Only string sequences are supported for contexts."); - return -EINVAL; - } + case lttng_ust_type_string: ptr->object_type = OBJECT_TYPE_STRING; ctx_field->get_value(ctx_field, &v); ptr->ptr = v.u.str; break; - case atype_string: - ptr->object_type = OBJECT_TYPE_STRING; - ctx_field->get_value(ctx_field, &v); - ptr->ptr = v.u.str; - break; - case atype_float: + case lttng_ust_type_float: ptr->object_type = OBJECT_TYPE_DOUBLE; ctx_field->get_value(ctx_field, &v); ptr->u.d = v.u.d; ptr->ptr = &ptr->u.d; break; - case atype_dynamic: + case lttng_ust_type_dynamic: ctx_field->get_value(ctx_field, &v); switch (v.sel) { case LTTNG_UST_DYNAMIC_TYPE_NONE: @@ -368,17 +338,14 @@ static int context_get_index(struct lttng_ctx *ctx, return -EINVAL; } break; - case atype_struct: - ERR("Structure type cannot be loaded."); - return -EINVAL; default: - ERR("Unknown type: %d", (int) field->type.atype); + ERR("Unknown type: %d", (int) field->type->type); return -EINVAL; } return 0; } -static int dynamic_get_index(struct lttng_ctx *ctx, +static int dynamic_get_index(struct lttng_ust_ctx *ctx, struct bytecode_runtime *runtime, uint64_t index, struct estack_entry *stack_top) { @@ -400,8 +367,7 @@ static int dynamic_get_index(struct lttng_ctx *ctx, stack_top->u.ptr.ptr = ptr; stack_top->u.ptr.object_type = gid->elem.type; stack_top->u.ptr.rev_bo = gid->elem.rev_bo; - assert(stack_top->u.ptr.field->type.atype == atype_array || - stack_top->u.ptr.field->type.atype == atype_array_nestable); + assert(stack_top->u.ptr.field->type->type == lttng_ust_type_array); stack_top->u.ptr.field = NULL; break; } @@ -420,8 +386,7 @@ static int dynamic_get_index(struct lttng_ctx *ctx, stack_top->u.ptr.ptr = ptr; stack_top->u.ptr.object_type = gid->elem.type; stack_top->u.ptr.rev_bo = gid->elem.rev_bo; - assert(stack_top->u.ptr.field->type.atype == atype_sequence || - stack_top->u.ptr.field->type.atype == atype_sequence_nestable); + assert(stack_top->u.ptr.field->type->type == lttng_ust_type_sequence); stack_top->u.ptr.field = NULL; break; } @@ -699,14 +664,14 @@ again: output->type = LTTNG_INTERPRETER_TYPE_SEQUENCE; output->u.sequence.ptr = *(const char **) (ax->u.ptr.ptr + sizeof(unsigned long)); output->u.sequence.nr_elem = *(unsigned long *) ax->u.ptr.ptr; - output->u.sequence.nested_type = ax->u.ptr.field->type.u.sequence_nestable.elem_type; + output->u.sequence.nested_type = lttng_ust_get_type_sequence(ax->u.ptr.field->type)->elem_type; break; case OBJECT_TYPE_ARRAY: /* Skip count (unsigned long) */ output->type = LTTNG_INTERPRETER_TYPE_SEQUENCE; output->u.sequence.ptr = *(const char **) (ax->u.ptr.ptr + sizeof(unsigned long)); - output->u.sequence.nr_elem = ax->u.ptr.field->type.u.array_nestable.length; - output->u.sequence.nested_type = ax->u.ptr.field->type.u.array_nestable.elem_type; + output->u.sequence.nr_elem = lttng_ust_get_type_array(ax->u.ptr.field->type)->length; + output->u.sequence.nested_type = lttng_ust_get_type_array(ax->u.ptr.field->type)->elem_type; break; case OBJECT_TYPE_SIGNED_ENUM: ret = dynamic_load_field(ax); @@ -735,7 +700,7 @@ again: return -EINVAL; } - return LTTNG_INTERPRETER_RECORD_FLAG; + return LTTNG_UST_BYTECODE_INTERPRETER_RECORD_FLAG; } /* @@ -752,7 +717,7 @@ uint64_t bytecode_interpret(void *interpreter_data, struct lttng_interpreter_output *output) { struct bytecode_runtime *bytecode = interpreter_data; - struct lttng_ctx *ctx = lttng_ust_rcu_dereference(*bytecode->p.pctx); + struct lttng_ust_ctx *ctx = lttng_ust_rcu_dereference(*bytecode->p.priv->pctx); void *pc, *next_pc, *start_pc; int ret = -EINVAL; uint64_t retval = 0; @@ -911,7 +876,7 @@ uint64_t bytecode_interpret(void *interpreter_data, goto end; OP(BYTECODE_OP_RETURN): - /* LTTNG_INTERPRETER_DISCARD or LTTNG_INTERPRETER_RECORD_FLAG */ + /* LTTNG_UST_BYTECODE_INTERPRETER_DISCARD or LTTNG_UST_BYTECODE_INTERPRETER_RECORD_FLAG */ /* Handle dynamic typing. */ switch (estack_ax_t) { case REG_S64: @@ -937,7 +902,7 @@ uint64_t bytecode_interpret(void *interpreter_data, goto end; OP(BYTECODE_OP_RETURN_S64): - /* LTTNG_INTERPRETER_DISCARD or LTTNG_INTERPRETER_RECORD_FLAG */ + /* LTTNG_UST_BYTECODE_INTERPRETER_DISCARD or LTTNG_UST_BYTECODE_INTERPRETER_RECORD_FLAG */ retval = !!estack_ax_v; ret = 0; goto end; @@ -2171,12 +2136,12 @@ uint64_t bytecode_interpret(void *interpreter_data, { struct load_op *insn = (struct load_op *) pc; struct field_ref *ref = (struct field_ref *) insn->data; - struct lttng_ctx_field *ctx_field; - struct lttng_ctx_value v; + struct lttng_ust_ctx_field *ctx_field; + struct lttng_ust_ctx_value v; dbg_printf("get context ref offset %u type dynamic\n", ref->offset); - ctx_field = &ctx->fields[ref->offset]; + ctx_field = ctx->fields[ref->offset]; ctx_field->get_value(ctx_field, &v); estack_push(stack, top, ax, bx, ax_t, bx_t); switch (v.sel) { @@ -2219,12 +2184,12 @@ uint64_t bytecode_interpret(void *interpreter_data, { struct load_op *insn = (struct load_op *) pc; struct field_ref *ref = (struct field_ref *) insn->data; - struct lttng_ctx_field *ctx_field; - struct lttng_ctx_value v; + struct lttng_ust_ctx_field *ctx_field; + struct lttng_ust_ctx_value v; dbg_printf("get context ref offset %u type string\n", ref->offset); - ctx_field = &ctx->fields[ref->offset]; + ctx_field = ctx->fields[ref->offset]; ctx_field->get_value(ctx_field, &v); estack_push(stack, top, ax, bx, ax_t, bx_t); estack_ax(stack, top)->u.s.str = v.u.str; @@ -2246,12 +2211,12 @@ uint64_t bytecode_interpret(void *interpreter_data, { struct load_op *insn = (struct load_op *) pc; struct field_ref *ref = (struct field_ref *) insn->data; - struct lttng_ctx_field *ctx_field; - struct lttng_ctx_value v; + struct lttng_ust_ctx_field *ctx_field; + struct lttng_ust_ctx_value v; dbg_printf("get context ref offset %u type s64\n", ref->offset); - ctx_field = &ctx->fields[ref->offset]; + ctx_field = ctx->fields[ref->offset]; ctx_field->get_value(ctx_field, &v); estack_push(stack, top, ax, bx, ax_t, bx_t); estack_ax_v = v.u.s64; @@ -2265,12 +2230,12 @@ uint64_t bytecode_interpret(void *interpreter_data, { struct load_op *insn = (struct load_op *) pc; struct field_ref *ref = (struct field_ref *) insn->data; - struct lttng_ctx_field *ctx_field; - struct lttng_ctx_value v; + struct lttng_ust_ctx_field *ctx_field; + struct lttng_ust_ctx_value v; dbg_printf("get context ref offset %u type double\n", ref->offset); - ctx_field = &ctx->fields[ref->offset]; + ctx_field = ctx->fields[ref->offset]; ctx_field->get_value(ctx_field, &v); estack_push(stack, top, ax, bx, ax_t, bx_t); memcpy(&estack_ax(stack, top)->u.d, &v.u.d, sizeof(struct literal_double)); @@ -2519,7 +2484,7 @@ uint64_t bytecode_interpret(void *interpreter_data, end: /* Return _DISCARD on error. */ if (ret) - return LTTNG_INTERPRETER_DISCARD; + return LTTNG_UST_BYTECODE_INTERPRETER_DISCARD; if (output) { return lttng_bytecode_interpret_format_output(estack_ax(stack, top),