Filter: opcode for ref load
[lttng-tools.git] / src / lib / lttng-ctl / filter-visitor-generate-bytecode.c
index 25128b6a2fc6b9f2bd1826f66efbe8909d8f4a23..8c8bf51ce26b07e8dc0576c3f232869c4292a8db 100644 (file)
@@ -200,6 +200,24 @@ int visit_node_load(struct filter_parser_ctx *ctx, struct ir_op *node)
                free(insn);
                return ret;
        }
+       case IR_DATA_FLOAT:
+       {
+               struct load_op *insn;
+               uint32_t insn_len = sizeof(struct load_op)
+                       + sizeof(struct literal_double);
+
+               insn = calloc(insn_len, 1);
+               if (!insn)
+                       return -ENOMEM;
+               insn->op = FILTER_OP_LOAD_DOUBLE;
+               insn->reg = reg_sel(node);
+               if (insn->reg == REG_ERROR)
+                       return -EINVAL;
+               *(double *) insn->data = node->u.load.u.flt;
+               ret = bytecode_push(&ctx->bytecode, insn, 1, insn_len);
+               free(insn);
+               return ret;
+       }
        case IR_DATA_FIELD_REF:
        {
                struct load_op *insn;
@@ -217,9 +235,8 @@ int visit_node_load(struct filter_parser_ctx *ctx, struct ir_op *node)
                memcpy(insn->data, &ref_offset, sizeof(ref_offset));
                if (insn->reg == REG_ERROR)
                        return -EINVAL;
-               /* reloc_offset points to struct field_ref */
+               /* reloc_offset points to struct load_op */
                reloc_offset = bytecode_get_len(&ctx->bytecode->b);
-               reloc_offset += sizeof(struct load_op);
                ret = bytecode_push(&ctx->bytecode, insn, 1, insn_len);
                if (ret) {
                        free(insn);
This page took 0.023944 seconds and 4 git commands to generate.