int recursive_visit_gen_bytecode(struct filter_parser_ctx *ctx,
struct ir_op *node);
+static inline int fls(unsigned int x)
+{
+ int r = 32;
+
+ if (!x)
+ return 0;
+ if (!(x & 0xFFFF0000U)) {
+ x <<= 16;
+ r -= 16;
+ }
+ if (!(x & 0xFF000000U)) {
+ x <<= 8;
+ r -= 8;
+ }
+ if (!(x & 0xF0000000U)) {
+ x <<= 4;
+ r -= 4;
+ }
+ if (!(x & 0xC0000000U)) {
+ x <<= 2;
+ r -= 2;
+ }
+ if (!(x & 0x80000000U)) {
+ x <<= 1;
+ r -= 1;
+ }
+ return r;
+}
+
+static inline int get_count_order(unsigned int count)
+{
+ int order;
+
+ order = fls(count) - 1;
+ if (count & (count - 1))
+ order++;
+ return order;
+}
+
static
int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
{
if ((*fb)->b.len + padding + len > (*fb)->alloc_len) {
uint32_t new_len =
- max_t(uint32_t, (*fb)->b.len + padding + len,
+ max_t(uint32_t, 1U << get_count_order((*fb)->b.len + padding + len),
(*fb)->alloc_len << 1);
uint32_t old_len = (*fb)->alloc_len;