#include "common/assert.h"
#include "common/list.h"
+#include "cpp-common/bt2/self-component-port.hpp"
#include "cpp-common/bt2/trace-ir.hpp"
+#include "cpp-common/bt2c/logging.hpp"
#include "cpp-common/vendor/fmt/format.h" /* IWYU pragma: keep */
+#include "../../clk-cls-cfg.hpp"
#include "ctf-meta.hpp"
-#include "decoder.hpp"
// the parameter name (of the reentrant 'yyparse' function)
// data is a pointer to a 'SParserParam' structure
{
using UP = std::unique_ptr<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)}
+ explicit ctf_visitor_generate_ir(
+ const ctf::src::ClkClsCfg& clkClsCfgParam,
+ const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfCompParam,
+ bt2c::Logger loggerParam) noexcept :
+
+ logger {std::move(loggerParam)},
+ selfComp {selfCompParam}, clkClsCfg {clkClsCfgParam}
{
}
~ctf_visitor_generate_ir();
+ bt2c::Logger logger;
+
+ bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp;
+
/* Trace IR trace class being filled (owned by this) */
bt2::TraceClass::Shared trace_class;
/* 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;
+ ctf::src::ClkClsCfg clkClsCfg;
};
ctf_visitor_generate_ir::UP
-ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *config);
+ctf_visitor_generate_ir_create(const ctf::src::ClkClsCfg& clkClsCfg,
+ bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const bt2c::Logger& parentLogger);
bt2::TraceClass::Shared
ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *visitor);
const bt2c::Logger& parentLogger) :
MetadataStreamParser {selfComp, clkClsCfg},
_mLogger {parentLogger, "PLUGIN/CTF/CTF-1-META-STREAM-PARSER"},
+ _mOrigCtfIrGenerator {ctf_visitor_generate_ir_create(clkClsCfg, selfComp, _mLogger)},
_mScanner {ctf_scanner_alloc(_mLogger)}, _mStreamDecoder {_mLogger}
{
- ctf_metadata_decoder_config metadataCfg {_mLogger};
-
- metadataCfg.clkClsCfg = clkClsCfg;
- _mOrigCtfIrGenerator = ctf_visitor_generate_ir_create(&metadataCfg);
}
MetadataStreamParser::ParseRet
struct MetaTranslateCtx
{
- bt_self_component *self_comp;
+ bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp;
bt_trace_class *ir_tc;
bt_stream_class *ir_sc;
struct ctf_trace_class *tc;
for (i = 0; i < ctx->tc->clock_classes->len; i++) {
ctf_clock_class *cc = (ctf_clock_class *) ctx->tc->clock_classes->pdata[i];
- cc->ir_cc = bt_clock_class_create(ctx->self_comp);
+ cc->ir_cc = bt_clock_class_create(ctx->selfComp->libObjPtr());
ctf_clock_class_to_ir(cc->ir_cc, cc);
}
return ret;
}
-int ctf_trace_class_translate(bt_self_component *self_comp, bt_trace_class *ir_tc,
- struct ctf_trace_class *tc)
+int ctf_trace_class_translate(const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ bt_trace_class *ir_tc, struct ctf_trace_class *tc)
{
int ret = 0;
uint64_t i;
ctf::MetaTranslateCtx ctx = {};
- ctx.self_comp = self_comp;
+ ctx.selfComp = selfComp;
ctx.tc = tc;
ctx.ir_tc = ir_tc;
ret = ctf_trace_class_to_ir(&ctx);
#include <babeltrace2/babeltrace.h>
+#include "cpp-common/bt2/optional-borrowed-object.hpp"
+#include "cpp-common/bt2/self-component-port.hpp"
+
#include "ctf-meta.hpp"
namespace bt2c {
int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc,
const bt2c::Logger& parentLogger);
-int ctf_trace_class_translate(bt_self_component *self_comp, bt_trace_class *ir_tc,
- struct ctf_trace_class *tc);
+int ctf_trace_class_translate(bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ bt_trace_class *ir_tc, struct ctf_trace_class *tc);
int ctf_trace_class_update_default_clock_classes(struct ctf_trace_class *ctf_tc,
const bt2c::Logger& parentLogger);
mdec->bo = -1;
mdec->config = *config;
- mdec->visitor = ctf_visitor_generate_ir_create(config);
+ mdec->visitor =
+ ctf_visitor_generate_ir_create(config->clkClsCfg, config->self_comp, config->logger);
if (!mdec->visitor) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(mdec->logger,
"Failed to create a CTF IR metadata AST visitor: "
#include "ast.hpp"
#include "ctf-meta-visitors.hpp"
#include "ctf-meta.hpp"
-#include "decoder.hpp"
/* Bit value (left shift) */
#define _BV(_val) (1 << (_val))
* @returns New visitor context, or NULL on error
*/
static ctf_visitor_generate_ir::UP
-ctx_create(const struct ctf_metadata_decoder_config *decoder_config, const bt2c::Logger& logger)
+ctx_create(const ctf::src::ClkClsCfg clkClsCfg,
+ const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const bt2c::Logger& logger)
{
- BT_ASSERT(decoder_config);
+ ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {clkClsCfg, selfComp, logger}};
- ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {*decoder_config, logger}};
-
- if (decoder_config->self_comp) {
- bt_trace_class *trace_class = bt_trace_class_create(decoder_config->self_comp);
+ if (selfComp) {
+ bt_trace_class *trace_class = bt_trace_class_create(selfComp->libObjPtr());
if (!trace_class) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(ctx->logger, "Cannot create empty trace class.");
goto error;
static void apply_clock_class_is_absolute(struct ctf_visitor_generate_ir *ctx,
struct ctf_clock_class *clock)
{
- if (ctx->decoder_config.clkClsCfg.forceOriginIsUnixEpoch) {
+ if (ctx->clkClsCfg.forceOriginIsUnixEpoch) {
clock->is_absolute = true;
}
struct ctf_clock_class *clock)
{
uint64_t freq;
- int64_t offset_s_to_apply = ctx->decoder_config.clkClsCfg.offsetSec;
+ int64_t offset_s_to_apply = ctx->clkClsCfg.offsetSec;
uint64_t offset_ns_to_apply;
int64_t cur_offset_s;
uint64_t cur_offset_cycles;
long long offsetSecLL;
unsigned long long offsetCyclesULL;
- if (ctx->decoder_config.clkClsCfg.offsetSec == 0 &&
- ctx->decoder_config.clkClsCfg.offsetNanoSec == 0) {
+ if (ctx->clkClsCfg.offsetSec == 0 && ctx->clkClsCfg.offsetNanoSec == 0) {
goto end;
}
/* Transfer nanoseconds to seconds as much as possible */
- if (ctx->decoder_config.clkClsCfg.offsetNanoSec < 0) {
- const int64_t abs_ns = -ctx->decoder_config.clkClsCfg.offsetNanoSec;
+ if (ctx->clkClsCfg.offsetNanoSec < 0) {
+ const int64_t abs_ns = -ctx->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.clkClsCfg.offsetNanoSec - (extra_s * INT64_C(1000000000));
+ const int64_t offset_ns = ctx->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.clkClsCfg.offsetNanoSec / INT64_C(1000000000);
- const int64_t offset_ns =
- ctx->decoder_config.clkClsCfg.offsetNanoSec - (extra_s * INT64_C(1000000000));
+ const int64_t extra_s = ctx->clkClsCfg.offsetNanoSec / INT64_C(1000000000);
+ const int64_t offset_ns = ctx->clkClsCfg.offsetNanoSec - (extra_s * INT64_C(1000000000));
BT_ASSERT(offset_ns >= 0);
offset_ns_to_apply = (uint64_t) offset_ns;
}
ctf_visitor_generate_ir::UP
-ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *decoder_config)
+ctf_visitor_generate_ir_create(const ctf::src::ClkClsCfg& clkClsCfg,
+ const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const bt2c::Logger& parentLogger)
{
- bt2c::Logger logger {decoder_config->logger, "PLUGIN/CTF/META/IR-VISITOR"};
+ bt2c::Logger logger {parentLogger, "PLUGIN/CTF/META/IR-VISITOR"};
/* Create visitor's context */
- ctf_visitor_generate_ir::UP ctx = ctx_create(decoder_config, logger);
-
+ ctf_visitor_generate_ir::UP ctx = ctx_create(clkClsCfg, selfComp, logger);
if (!ctx) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Cannot create visitor's context.");
goto error;
if (ctx->trace_class) {
/* Copy new CTF metadata -> new IR metadata */
- ret = ctf_trace_class_translate(ctx->decoder_config.self_comp,
- ctx->trace_class->libObjPtr(), ctx->ctf_tc);
+ ret = ctf_trace_class_translate(ctx->selfComp, ctx->trace_class->libObjPtr(), ctx->ctf_tc);
if (ret) {
ret = -EINVAL;
goto end;