2 * Copyright 2020 EfficiOS, Inc.
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #ifndef LTTNG_COMMON_BYTECODE_H
9 #define LTTNG_COMMON_BYTECODE_H
11 #include "common/macros.hpp"
12 #include "common/sessiond-comm/sessiond-comm.hpp"
17 * offsets are absolute from start of bytecode.
21 /* Initially, symbol offset. After link, field offset. */
30 struct get_index_u16 {
34 struct get_index_u64 {
38 struct literal_numeric {
42 struct literal_double {
47 BYTECODE_OP_UNKNOWN = 0,
49 BYTECODE_OP_RETURN = 1,
56 BYTECODE_OP_MINUS = 6,
57 BYTECODE_OP_BIT_RSHIFT = 7,
58 BYTECODE_OP_BIT_LSHIFT = 8,
59 BYTECODE_OP_BIT_AND = 9,
60 BYTECODE_OP_BIT_OR = 10,
61 BYTECODE_OP_BIT_XOR = 11,
63 /* binary comparators */
71 /* string binary comparator: apply to */
72 BYTECODE_OP_EQ_STRING = 18,
73 BYTECODE_OP_NE_STRING = 19,
74 BYTECODE_OP_GT_STRING = 20,
75 BYTECODE_OP_LT_STRING = 21,
76 BYTECODE_OP_GE_STRING = 22,
77 BYTECODE_OP_LE_STRING = 23,
79 /* s64 binary comparator */
80 BYTECODE_OP_EQ_S64 = 24,
81 BYTECODE_OP_NE_S64 = 25,
82 BYTECODE_OP_GT_S64 = 26,
83 BYTECODE_OP_LT_S64 = 27,
84 BYTECODE_OP_GE_S64 = 28,
85 BYTECODE_OP_LE_S64 = 29,
87 /* double binary comparator */
88 BYTECODE_OP_EQ_DOUBLE = 30,
89 BYTECODE_OP_NE_DOUBLE = 31,
90 BYTECODE_OP_GT_DOUBLE = 32,
91 BYTECODE_OP_LT_DOUBLE = 33,
92 BYTECODE_OP_GE_DOUBLE = 34,
93 BYTECODE_OP_LE_DOUBLE = 35,
95 /* Mixed S64-double binary comparators */
96 BYTECODE_OP_EQ_DOUBLE_S64 = 36,
97 BYTECODE_OP_NE_DOUBLE_S64 = 37,
98 BYTECODE_OP_GT_DOUBLE_S64 = 38,
99 BYTECODE_OP_LT_DOUBLE_S64 = 39,
100 BYTECODE_OP_GE_DOUBLE_S64 = 40,
101 BYTECODE_OP_LE_DOUBLE_S64 = 41,
103 BYTECODE_OP_EQ_S64_DOUBLE = 42,
104 BYTECODE_OP_NE_S64_DOUBLE = 43,
105 BYTECODE_OP_GT_S64_DOUBLE = 44,
106 BYTECODE_OP_LT_S64_DOUBLE = 45,
107 BYTECODE_OP_GE_S64_DOUBLE = 46,
108 BYTECODE_OP_LE_S64_DOUBLE = 47,
111 BYTECODE_OP_UNARY_PLUS = 48,
112 BYTECODE_OP_UNARY_MINUS = 49,
113 BYTECODE_OP_UNARY_NOT = 50,
114 BYTECODE_OP_UNARY_PLUS_S64 = 51,
115 BYTECODE_OP_UNARY_MINUS_S64 = 52,
116 BYTECODE_OP_UNARY_NOT_S64 = 53,
117 BYTECODE_OP_UNARY_PLUS_DOUBLE = 54,
118 BYTECODE_OP_UNARY_MINUS_DOUBLE = 55,
119 BYTECODE_OP_UNARY_NOT_DOUBLE = 56,
122 BYTECODE_OP_AND = 57,
126 BYTECODE_OP_LOAD_FIELD_REF = 59,
127 BYTECODE_OP_LOAD_FIELD_REF_STRING = 60,
128 BYTECODE_OP_LOAD_FIELD_REF_SEQUENCE = 61,
129 BYTECODE_OP_LOAD_FIELD_REF_S64 = 62,
130 BYTECODE_OP_LOAD_FIELD_REF_DOUBLE = 63,
132 /* load immediate from operand */
133 BYTECODE_OP_LOAD_STRING = 64,
134 BYTECODE_OP_LOAD_S64 = 65,
135 BYTECODE_OP_LOAD_DOUBLE = 66,
138 BYTECODE_OP_CAST_TO_S64 = 67,
139 BYTECODE_OP_CAST_DOUBLE_TO_S64 = 68,
140 BYTECODE_OP_CAST_NOP = 69,
142 /* get context ref */
143 BYTECODE_OP_GET_CONTEXT_REF = 70,
144 BYTECODE_OP_GET_CONTEXT_REF_STRING = 71,
145 BYTECODE_OP_GET_CONTEXT_REF_S64 = 72,
146 BYTECODE_OP_GET_CONTEXT_REF_DOUBLE = 73,
148 /* load userspace field ref */
149 BYTECODE_OP_LOAD_FIELD_REF_USER_STRING = 74,
150 BYTECODE_OP_LOAD_FIELD_REF_USER_SEQUENCE = 75,
153 * load immediate star globbing pattern (literal string)
156 BYTECODE_OP_LOAD_STAR_GLOB_STRING = 76,
158 /* globbing pattern binary operator: apply to */
159 BYTECODE_OP_EQ_STAR_GLOB_STRING = 77,
160 BYTECODE_OP_NE_STAR_GLOB_STRING = 78,
163 * Instructions for recursive traversal through composed types.
165 BYTECODE_OP_GET_CONTEXT_ROOT = 79,
166 BYTECODE_OP_GET_APP_CONTEXT_ROOT = 80,
167 BYTECODE_OP_GET_PAYLOAD_ROOT = 81,
169 BYTECODE_OP_GET_SYMBOL = 82,
170 BYTECODE_OP_GET_SYMBOL_FIELD = 83,
171 BYTECODE_OP_GET_INDEX_U16 = 84,
172 BYTECODE_OP_GET_INDEX_U64 = 85,
174 BYTECODE_OP_LOAD_FIELD = 86,
175 BYTECODE_OP_LOAD_FIELD_S8 = 87,
176 BYTECODE_OP_LOAD_FIELD_S16 = 88,
177 BYTECODE_OP_LOAD_FIELD_S32 = 89,
178 BYTECODE_OP_LOAD_FIELD_S64 = 90,
179 BYTECODE_OP_LOAD_FIELD_U8 = 91,
180 BYTECODE_OP_LOAD_FIELD_U16 = 92,
181 BYTECODE_OP_LOAD_FIELD_U32 = 93,
182 BYTECODE_OP_LOAD_FIELD_U64 = 94,
183 BYTECODE_OP_LOAD_FIELD_STRING = 95,
184 BYTECODE_OP_LOAD_FIELD_SEQUENCE = 96,
185 BYTECODE_OP_LOAD_FIELD_DOUBLE = 97,
187 BYTECODE_OP_UNARY_BIT_NOT = 98,
189 BYTECODE_OP_RETURN_S64 = 99,
194 using bytecode_opcode_t = uint8_t;
197 bytecode_opcode_t op;
200 * data to load. Size known by enum bytecode_opcode_t and null-term
207 bytecode_opcode_t op;
211 bytecode_opcode_t op;
214 /* skip_offset is absolute from start of bytecode */
216 bytecode_opcode_t op;
217 uint16_t skip_offset; /* bytecode insn, if skip second test */
221 bytecode_opcode_t op;
225 bytecode_opcode_t op;
228 struct lttng_bytecode_alloc {
230 struct lttng_bytecode b;
233 int bytecode_init(struct lttng_bytecode_alloc **fb);
234 int bytecode_push(struct lttng_bytecode_alloc **fb, const void *data, uint32_t align, uint32_t len);
235 int bytecode_push_logical(struct lttng_bytecode_alloc **fb,
236 struct logical_op *data,
239 uint16_t *skip_offset);
240 struct lttng_bytecode *lttng_bytecode_copy(const struct lttng_bytecode *orig_f);
242 int bytecode_push_get_payload_root(struct lttng_bytecode_alloc **bytecode);
243 int bytecode_push_get_context_root(struct lttng_bytecode_alloc **bytecode);
244 int bytecode_push_get_app_context_root(struct lttng_bytecode_alloc **bytecode);
245 int bytecode_push_get_index_u64(struct lttng_bytecode_alloc **bytecode, uint64_t index);
246 int bytecode_push_get_symbol(struct lttng_bytecode_alloc **bytecode,
247 struct lttng_bytecode_alloc **bytecode_reloc,
250 static inline unsigned int bytecode_get_len(struct lttng_bytecode *bytecode)
252 return bytecode->len;
255 #endif /* LTTNG_COMMON_BYTECODE_H */