bytecode: generalize `struct lttng_filter_bytecode_node`
[lttng-modules.git] / include / lttng / filter.h
index a9477870491d5bace0ee03eadb7be31a9bedd3bc..128339923aead6232f6faffdf90becf5d9e6a5f2 100644 (file)
@@ -47,6 +47,7 @@ struct bytecode_runtime {
 
 enum entry_type {
        REG_S64,
+       REG_U64,
        REG_DOUBLE,
        REG_STRING,
        REG_STAR_GLOB_STRING,
@@ -87,6 +88,13 @@ struct filter_get_index_data {
        uint64_t offset;        /* in bytes */
        size_t ctx_index;
        size_t array_len;
+       /*
+        * Field is only populated for LOAD_ROOT_CONTEXT, LOAD_ROOT_APP_CONTEXT
+        * and LOAD_ROOT_PAYLOAD. Left NULL for LOAD_OBJECT, considering that the
+        * interpreter needs to find it from the event fields and types to
+        * support variants.
+        */
+       const struct lttng_event_field *field;
        struct {
                size_t len;
                enum object_type type;
@@ -167,6 +175,7 @@ struct load_ptr {
        enum load_type type;
        enum object_type object_type;
        const void *ptr;
+       size_t nr_elem;
        bool rev_bo;
        /* Temporary place-holders for contexts. */
        union {
@@ -174,14 +183,11 @@ struct load_ptr {
                uint64_t u64;
                double d;
        } u;
-       /*
-        * "field" is only needed when nested under a variant, in which
-        * case we cannot specialize the nested operations.
-        */
        const struct lttng_event_field *field;
 };
 
 struct estack_entry {
+       enum entry_type type;
        union {
                int64_t v;
 
@@ -204,6 +210,9 @@ struct estack {
 #define estack_ax_v    ax
 #define estack_bx_v    bx
 
+#define estack_ax_t    ax_t
+#define estack_bx_t    bx_t
+
 #define estack_ax(stack, top)                                  \
        ({                                                      \
                BUG_ON((top) <= FILTER_STACK_EMPTY);            \
@@ -216,29 +225,68 @@ struct estack {
                &(stack)->e[(top) - 1];                         \
        })
 
-#define estack_push(stack, top, ax, bx)                                \
+#define estack_push(stack, top, ax, bx, ax_t, bx_t)            \
        do {                                                    \
                BUG_ON((top) >= FILTER_STACK_LEN - 1);          \
                (stack)->e[(top) - 1].u.v = (bx);               \
+               (stack)->e[(top) - 1].type = (bx_t);            \
                (bx) = (ax);                                    \
+               (bx_t) = (ax_t);                                \
                ++(top);                                        \
        } while (0)
 
-#define estack_pop(stack, top, ax, bx)                         \
+#define estack_pop(stack, top, ax, bx, ax_t, bx_t)             \
        do {                                                    \
                BUG_ON((top) <= FILTER_STACK_EMPTY);            \
                (ax) = (bx);                                    \
+               (ax_t) = (bx_t);                                \
                (bx) = (stack)->e[(top) - 2].u.v;               \
+               (bx_t) = (stack)->e[(top) - 2].type;            \
                (top)--;                                        \
        } while (0)
 
+enum lttng_interpreter_type {
+       LTTNG_INTERPRETER_TYPE_S64,
+       LTTNG_INTERPRETER_TYPE_U64,
+       LTTNG_INTERPRETER_TYPE_SIGNED_ENUM,
+       LTTNG_INTERPRETER_TYPE_UNSIGNED_ENUM,
+       LTTNG_INTERPRETER_TYPE_DOUBLE,
+       LTTNG_INTERPRETER_TYPE_STRING,
+       LTTNG_INTERPRETER_TYPE_SEQUENCE,
+};
+
+/*
+ * Represents the output parameter of the lttng interpreter.
+ * Currently capturable field classes are integer, double, string and sequence
+ * of integer.
+ */
+struct lttng_interpreter_output {
+       enum lttng_interpreter_type type;
+       union {
+               int64_t s;
+               uint64_t u;
+
+               struct {
+                       const char *str;
+                       size_t len;
+               } str;
+               struct {
+                       const void *ptr;
+                       size_t nr_elem;
+
+                       /* Inner type. */
+                       const struct lttng_type *nested_type;
+               } sequence;
+       } u;
+};
+
 const char *lttng_filter_print_op(enum filter_op op);
 
 int lttng_filter_validate_bytecode(struct bytecode_runtime *bytecode);
 int lttng_filter_specialize_bytecode(const struct lttng_event_desc *event_desc,
                struct bytecode_runtime *bytecode);
 
-uint64_t lttng_filter_false(void *filter_data,
+uint64_t lttng_filter_interpret_bytecode_false(void *filter_data,
                struct lttng_probe_ctx *lttng_probe_ctx,
                const char *filter_stack_data);
 uint64_t lttng_filter_interpret_bytecode(void *filter_data,
This page took 0.024399 seconds and 4 git commands to generate.