enum entry_type {
REG_S64,
+ REG_U64,
REG_DOUBLE,
REG_STRING,
REG_STAR_GLOB_STRING,
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;
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 {
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;
#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); \
&(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(struct lttng_event *event,
+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,