#include "filter-ir.h"
#include "filter-ast.h"
+#include <common/macros.h>
+
#ifndef max_t
#define max_t(type, a, b) ((type) ((a) > (b) ? (a) : (b)))
#endif
static
int bytecode_init(struct lttng_filter_bytecode_alloc **fb)
{
- *fb = calloc(sizeof(struct lttng_filter_bytecode_alloc) + INIT_ALLOC_SIZE, 1);
+ uint32_t alloc_len;
+
+ alloc_len = sizeof(struct lttng_filter_bytecode_alloc) + INIT_ALLOC_SIZE;
+ *fb = calloc(alloc_len, 1);
if (!*fb) {
return -ENOMEM;
} else {
- (*fb)->alloc_len = INIT_ALLOC_SIZE;
+ (*fb)->alloc_len = alloc_len;
return 0;
}
}
int32_t ret;
uint32_t padding = offset_align((*fb)->b.len, align);
uint32_t new_len = (*fb)->b.len + padding + len;
- uint32_t new_alloc_len = sizeof(struct lttng_filter_bytecode) + new_len;
+ uint32_t new_alloc_len = sizeof(struct lttng_filter_bytecode_alloc) + new_len;
uint32_t old_alloc_len = (*fb)->alloc_len;
if (new_len > LTTNG_FILTER_MAX_LEN)
return -EINVAL;
if (new_alloc_len > old_alloc_len) {
+ struct lttng_filter_bytecode_alloc *newptr;
+
new_alloc_len =
max_t(uint32_t, 1U << get_count_order(new_alloc_len), old_alloc_len << 1);
- *fb = realloc(*fb, new_alloc_len);
- if (!*fb)
+ newptr = realloc(*fb, new_alloc_len);
+ if (!newptr)
return -ENOMEM;
+ *fb = newptr;
+ /* We zero directly the memory from start of allocation. */
memset(&((char *) *fb)[old_alloc_len], 0, new_alloc_len - old_alloc_len);
(*fb)->alloc_len = new_alloc_len;
}
}
}
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
void filter_bytecode_free(struct filter_parser_ctx *ctx)
{
free(ctx->bytecode);
ctx->bytecode_reloc = NULL;
}
-__attribute__((visibility("hidden")))
+LTTNG_HIDDEN
int filter_visitor_bytecode_generate(struct filter_parser_ctx *ctx)
{
int ret;