X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Ffilter%2Ffilter-visitor-generate-bytecode.c;h=71da21c8a5108a8f0114aa9389c16d92bc54240a;hp=36d35c558727e6df654a55b3bebc1bee4fb069de;hb=01a204f0f7a1e2070826804c142a456af21867a0;hpb=36907cb5a542b8eb01d95e1990894abd45e98bc0 diff --git a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c index 36d35c558..71da21c8a 100644 --- a/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c +++ b/src/lib/lttng-ctl/filter/filter-visitor-generate-bytecode.c @@ -38,6 +38,45 @@ static 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) { @@ -58,7 +97,7 @@ int32_t bytecode_reserve(struct lttng_filter_bytecode_alloc **fb, uint32_t align 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;