X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-bytecode.c;h=ea5827a447adffb671c879fdf6730e7ac601944f;hb=4e48b5d2debaf6c0c598489c183cc6cb2125c8a3;hp=3fe50c36e707599d79b6e13b41de4fe5444e0bde;hpb=a2e4d05e924d4cb02b47430c2d0f39e6a6a89720;p=lttng-ust.git diff --git a/liblttng-ust/lttng-bytecode.c b/liblttng-ust/lttng-bytecode.c index 3fe50c36..ea5827a4 100644 --- a/liblttng-ust/lttng-bytecode.c +++ b/liblttng-ust/lttng-bytecode.c @@ -174,12 +174,12 @@ const char *lttng_bytecode_print_op(enum bytecode_op op) static int apply_field_reloc(const struct lttng_ust_event_desc *event_desc, struct bytecode_runtime *runtime, - uint32_t runtime_len, + uint32_t runtime_len __attribute__((unused)), uint32_t reloc_offset, const char *field_name, enum bytecode_op bytecode_op) { - struct lttng_ust_event_field **fields, *field = NULL; + const struct lttng_ust_event_field **fields, *field = NULL; unsigned int nr_fields, i; struct load_op *op; uint32_t field_offset = 0; @@ -244,9 +244,23 @@ int apply_field_reloc(const struct lttng_ust_event_desc *event_desc, op->op = BYTECODE_OP_LOAD_FIELD_REF_S64; break; case lttng_ust_type_array: + { + struct lttng_ust_type_array *array = (struct lttng_ust_type_array *) field->type; + + if (array->encoding == lttng_ust_string_encoding_none) + return -EINVAL; + op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE; + break; + } case lttng_ust_type_sequence: + { + struct lttng_ust_type_sequence *sequence = (struct lttng_ust_type_sequence *) field->type; + + if (sequence->encoding == lttng_ust_string_encoding_none) + return -EINVAL; op->op = BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE; break; + } case lttng_ust_type_string: op->op = BYTECODE_OP_LOAD_FIELD_REF_STRING; break; @@ -268,13 +282,13 @@ int apply_field_reloc(const struct lttng_ust_event_desc *event_desc, static int apply_context_reloc(struct bytecode_runtime *runtime, - uint32_t runtime_len, + uint32_t runtime_len __attribute__((unused)), uint32_t reloc_offset, const char *context_name, enum bytecode_op bytecode_op) { struct load_op *op; - struct lttng_ust_ctx_field *ctx_field; + const struct lttng_ust_ctx_field *ctx_field; int idx; struct lttng_ust_ctx **pctx = runtime->p.pctx; @@ -302,7 +316,7 @@ int apply_context_reloc(struct bytecode_runtime *runtime, return -EINVAL; /* Get context return type */ - ctx_field = (*pctx)->fields[idx]; + ctx_field = &(*pctx)->fields[idx]; op = (struct load_op *) &runtime->code[reloc_offset]; switch (bytecode_op) { @@ -316,10 +330,26 @@ int apply_context_reloc(struct bytecode_runtime *runtime, case lttng_ust_type_enum: op->op = BYTECODE_OP_GET_CONTEXT_REF_S64; break; - /* Sequence and array supported as string */ - case lttng_ust_type_string: + /* Sequence and array supported only as string */ case lttng_ust_type_array: + { + struct lttng_ust_type_array *array = (struct lttng_ust_type_array *) ctx_field->event_field->type; + + if (array->encoding == lttng_ust_string_encoding_none) + return -EINVAL; + op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; + break; + } case lttng_ust_type_sequence: + { + struct lttng_ust_type_sequence *sequence = (struct lttng_ust_type_sequence *) ctx_field->event_field->type; + + if (sequence->encoding == lttng_ust_string_encoding_none) + return -EINVAL; + op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; + break; + } + case lttng_ust_type_string: op->op = BYTECODE_OP_GET_CONTEXT_REF_STRING; break; case lttng_ust_type_float: @@ -396,7 +426,7 @@ int bytecode_is_linked(struct lttng_ust_bytecode_node *bytecode, * bytecode runtime. */ static -int link_bytecode(struct lttng_ust_event_desc *event_desc, +int link_bytecode(const struct lttng_ust_event_desc *event_desc, struct lttng_ust_ctx **ctx, struct lttng_ust_bytecode_node *bytecode, struct cds_list_head *bytecode_runtime_head, @@ -489,7 +519,7 @@ void lttng_bytecode_sync_state(struct lttng_ust_bytecode_runtime *runtime) * This function is called after we confirmed that name enabler and the * instance are name matching (or glob pattern matching). */ -void lttng_enabler_link_bytecode(struct lttng_ust_event_desc *event_desc, +void lttng_enabler_link_bytecode(const struct lttng_ust_event_desc *event_desc, struct lttng_ust_ctx **ctx, struct cds_list_head *instance_bytecode_head, struct cds_list_head *enabler_bytecode_head) @@ -547,16 +577,6 @@ void lttng_enabler_link_bytecode(struct lttng_ust_event_desc *event_desc, } } -/* - * We own the bytecode if we return success. - */ -int lttng_filter_enabler_attach_bytecode(struct lttng_enabler *enabler, - struct lttng_ust_bytecode_node *bytecode) -{ - cds_list_add(&bytecode->node, &enabler->filter_bytecode_head); - return 0; -} - static void free_filter_runtime(struct cds_list_head *bytecode_runtime_head) {