Add `lttng_bytecode_interpret_format_output()` for top of stack extraction
[lttng-ust.git] / liblttng-ust / lttng-filter.h
index d7105aff3008fca75f1d9ac645457f7bda644867..61bc213bf29472093eb89090d54e3f3586463ac0 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <errno.h>
 #include <stdio.h>
+#include <stdbool.h>
 #include <helper.h>
 #include <lttng/ust-events.h>
 #include <lttng/ust-context-provider.h>
@@ -45,6 +46,8 @@
 #define FILTER_STACK_LEN       10      /* includes 2 dummy */
 #define FILTER_STACK_EMPTY     1
 
+#define FILTER_MAX_DATA_LEN    65536
+
 #ifndef min_t
 #define min_t(type, a, b)      \
                ((type) (a) < (type) (b) ? (type) (a) : (type) (b))
@@ -75,21 +78,81 @@ do {                                                                \
 /* Linked bytecode. Child of struct lttng_bytecode_runtime. */
 struct bytecode_runtime {
        struct lttng_bytecode_runtime p;
+       size_t data_len;
+       size_t data_alloc_len;
+       char *data;
        uint16_t len;
-       char data[0];
+       char code[0];
 };
 
 enum entry_type {
        REG_S64,
+       REG_U64,
        REG_DOUBLE,
        REG_STRING,
        REG_STAR_GLOB_STRING,
        REG_UNKNOWN,
+       REG_PTR,
+};
+
+enum load_type {
+       LOAD_ROOT_CONTEXT,
+       LOAD_ROOT_APP_CONTEXT,
+       LOAD_ROOT_PAYLOAD,
+       LOAD_OBJECT,
+};
+
+enum object_type {
+       OBJECT_TYPE_S8,
+       OBJECT_TYPE_S16,
+       OBJECT_TYPE_S32,
+       OBJECT_TYPE_S64,
+       OBJECT_TYPE_U8,
+       OBJECT_TYPE_U16,
+       OBJECT_TYPE_U32,
+       OBJECT_TYPE_U64,
+
+       OBJECT_TYPE_DOUBLE,
+       OBJECT_TYPE_STRING,
+       OBJECT_TYPE_STRING_SEQUENCE,
+
+       OBJECT_TYPE_SEQUENCE,
+       OBJECT_TYPE_ARRAY,
+       OBJECT_TYPE_STRUCT,
+       OBJECT_TYPE_VARIANT,
+
+       OBJECT_TYPE_DYNAMIC,
+};
+
+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;
+               bool rev_bo;    /* reverse byte order */
+       } elem;
 };
 
 /* Validation stack */
+struct vstack_load {
+       enum load_type type;
+       enum object_type object_type;
+       const struct lttng_event_field *field;
+       bool rev_bo;    /* reverse byte order */
+};
+
 struct vstack_entry {
        enum entry_type type;
+       struct vstack_load load;
 };
 
 struct vstack {
@@ -148,6 +211,21 @@ enum estack_string_literal_type {
        ESTACK_STRING_LITERAL_TYPE_STAR_GLOB,
 };
 
+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 {
+               int64_t s64;
+               uint64_t u64;
+               double d;
+       } u;
+       const struct lttng_event_field *field;
+};
+
 struct estack_entry {
        enum entry_type type;   /* For dynamic typing. */
        union {
@@ -159,6 +237,7 @@ struct estack_entry {
                        size_t seq_len;
                        enum estack_string_literal_type literal_type;
                } s;
+               struct load_ptr ptr;
        } u;
 };
 
@@ -214,12 +293,49 @@ struct estack {
                (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;
+               double d;
+
+               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 *print_op(enum filter_op op);
 
 int lttng_filter_validate_bytecode(struct bytecode_runtime *bytecode);
-int lttng_filter_specialize_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,
                const char *filter_stack_data);
 uint64_t lttng_filter_interpret_bytecode(void *filter_data,
                const char *filter_stack_data);
This page took 0.024805 seconds and 4 git commands to generate.