struct ctx_decl_scope *parent_scope;
};
-/*
- * Visitor context (private).
- */
-struct ctf_visitor_generate_ir
-{
- explicit ctf_visitor_generate_ir(ctf_metadata_decoder_config decoderConfig,
- bt2c::Logger loggerParam) :
- decoder_config {std::move(decoderConfig)},
- logger {std::move(loggerParam)}
- {
- }
-
- /* Trace IR trace class being filled (owned by this) */
- bt_trace_class *trace_class = nullptr;
-
- /* CTF meta trace being filled (owned by this) */
- struct ctf_trace_class *ctf_tc = nullptr;
-
- /* Current declaration scope (top of the stack) (owned by this) */
- struct ctx_decl_scope *current_scope = nullptr;
-
- /* True if trace declaration is visited */
- bool is_trace_visited = false;
-
- /* True if this is an LTTng trace */
- bool is_lttng = false;
-
- /* Config passed by the user */
- struct ctf_metadata_decoder_config decoder_config;
-
- bt2c::Logger logger;
-};
-
-/*
- * Visitor (public).
- */
-struct ctf_visitor_generate_ir;
-
/**
* Creates a new declaration scope.
*
* @param trace Associated trace
* @returns New visitor context, or NULL on error
*/
-static struct ctf_visitor_generate_ir *
+static ctf_visitor_generate_ir::UP
ctx_create(const struct ctf_metadata_decoder_config *decoder_config, const bt2c::Logger& logger)
{
BT_ASSERT(decoder_config);
- ctf_visitor_generate_ir *ctx = new ctf_visitor_generate_ir {*decoder_config, logger};
+ ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {*decoder_config, logger}};
if (decoder_config->self_comp) {
ctx->trace_class = bt_trace_class_create(decoder_config->self_comp);
}
/* Root declaration scope */
- ctx->current_scope = ctx_decl_scope_create(ctx, NULL);
+ ctx->current_scope = ctx_decl_scope_create(ctx.get(), NULL);
if (!ctx->current_scope) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(ctx->logger, "Cannot create declaration scope.");
goto error;
goto end;
error:
- ctx_destroy(ctx);
- ctx = NULL;
+ ctx.reset();
end:
return ctx;
static void apply_clock_class_is_absolute(struct ctf_visitor_generate_ir *ctx,
struct ctf_clock_class *clock)
{
- if (ctx->decoder_config.force_clock_class_origin_unix_epoch) {
+ if (ctx->decoder_config.clkClsCfg.forceOriginIsUnixEpoch) {
clock->is_absolute = true;
}
struct ctf_clock_class *clock)
{
uint64_t freq;
- int64_t offset_s_to_apply = ctx->decoder_config.clock_class_offset_s;
+ int64_t offset_s_to_apply = ctx->decoder_config.clkClsCfg.offsetSec;
uint64_t offset_ns_to_apply;
int64_t cur_offset_s;
uint64_t cur_offset_cycles;
- if (ctx->decoder_config.clock_class_offset_s == 0 &&
- ctx->decoder_config.clock_class_offset_ns == 0) {
+ if (ctx->decoder_config.clkClsCfg.offsetSec == 0 &&
+ ctx->decoder_config.clkClsCfg.offsetNanoSec == 0) {
goto end;
}
/* Transfer nanoseconds to seconds as much as possible */
- if (ctx->decoder_config.clock_class_offset_ns < 0) {
- const int64_t abs_ns = -ctx->decoder_config.clock_class_offset_ns;
+ if (ctx->decoder_config.clkClsCfg.offsetNanoSec < 0) {
+ const int64_t abs_ns = -ctx->decoder_config.clkClsCfg.offsetNanoSec;
const int64_t abs_extra_s = abs_ns / INT64_C(1000000000) + 1;
const int64_t extra_s = -abs_extra_s;
const int64_t offset_ns =
- ctx->decoder_config.clock_class_offset_ns - (extra_s * INT64_C(1000000000));
+ ctx->decoder_config.clkClsCfg.offsetNanoSec - (extra_s * INT64_C(1000000000));
BT_ASSERT(offset_ns > 0);
offset_ns_to_apply = (uint64_t) offset_ns;
offset_s_to_apply += extra_s;
} else {
- const int64_t extra_s = ctx->decoder_config.clock_class_offset_ns / INT64_C(1000000000);
+ const int64_t extra_s = ctx->decoder_config.clkClsCfg.offsetNanoSec / INT64_C(1000000000);
const int64_t offset_ns =
- ctx->decoder_config.clock_class_offset_ns - (extra_s * INT64_C(1000000000));
+ ctx->decoder_config.clkClsCfg.offsetNanoSec - (extra_s * INT64_C(1000000000));
BT_ASSERT(offset_ns >= 0);
offset_ns_to_apply = (uint64_t) offset_ns;
return ret;
}
-struct ctf_visitor_generate_ir *
+ctf_visitor_generate_ir::UP
ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *decoder_config)
{
- struct ctf_visitor_generate_ir *ctx = NULL;
-
bt2c::Logger logger {decoder_config->logger, "PLUGIN/CTF/META/IR-VISITOR"};
/* Create visitor's context */
- ctx = ctx_create(decoder_config, logger);
+ ctf_visitor_generate_ir::UP ctx = ctx_create(decoder_config, logger);
+
if (!ctx) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Cannot create visitor's context.");
goto error;
goto end;
error:
- ctx_destroy(ctx);
- ctx = NULL;
+ ctx.reset();
end:
return ctx;
}
-void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor)
+static void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor)
{
ctx_destroy(visitor);
}
+void ctf_visitor_generate_ir_deleter::operator()(ctf_visitor_generate_ir *visitor)
+{
+ ctf_visitor_generate_ir_destroy(visitor);
+}
+
bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *ctx)
{
BT_ASSERT_DBG(ctx);