#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#include "align.h"
+#include <common/align.h>
+#include <common/compat/string.h>
+
#include "filter-bytecode.h"
#include "filter-ir.h"
#include "filter-ast.h"
#define max_t(type, a, b) ((type) ((a) > (b) ? (a) : (b)))
#endif
-//#define INIT_ALLOC_SIZE PAGE_SIZE
#define INIT_ALLOC_SIZE 4
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;
+ order = lttng_fls(count) - 1;
if (count & (count - 1))
order++;
return order;
if (!insn)
return -ENOMEM;
insn->op = FILTER_OP_LOAD_S64;
- *(int64_t *) insn->data = node->u.load.u.num;
+ memcpy(insn->data, &node->u.load.u.num, sizeof(int64_t));
ret = bytecode_push(&ctx->bytecode, insn, 1, insn_len);
free(insn);
return ret;
if (!insn)
return -ENOMEM;
insn->op = FILTER_OP_LOAD_DOUBLE;
- *(double *) insn->data = node->u.load.u.flt;
+ memcpy(insn->data, &node->u.load.u.flt, sizeof(double));
ret = bytecode_push(&ctx->bytecode, insn, 1, insn_len);
free(insn);
return ret;
LTTNG_HIDDEN
void filter_bytecode_free(struct filter_parser_ctx *ctx)
{
- free(ctx->bytecode);
- ctx->bytecode = NULL;
- free(ctx->bytecode_reloc);
- ctx->bytecode_reloc = NULL;
+ if (!ctx) {
+ return;
+ }
+
+ if (ctx->bytecode) {
+ free(ctx->bytecode);
+ ctx->bytecode = NULL;
+ }
+
+ if (ctx->bytecode_reloc) {
+ free(ctx->bytecode_reloc);
+ ctx->bytecode_reloc = NULL;
+ }
}
LTTNG_HIDDEN