* SOFTWARE.
*/
-#define BT_LOG_TAG "PLUGIN/SINK.CTF.FS/TRANSLATE-CTF-IR-TO-TSDL"
-#include "logging.h"
+#include "translate-ctf-ir-to-tsdl.h"
#include <babeltrace2/babeltrace.h>
#include "common/macros.h"
void append_uuid(struct ctx *ctx, bt_uuid uuid)
{
g_string_append_printf(ctx->tsdl,
- "\"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\"",
- (unsigned int) uuid[0],
- (unsigned int) uuid[1],
- (unsigned int) uuid[2],
- (unsigned int) uuid[3],
- (unsigned int) uuid[4],
- (unsigned int) uuid[5],
- (unsigned int) uuid[6],
- (unsigned int) uuid[7],
- (unsigned int) uuid[8],
- (unsigned int) uuid[9],
- (unsigned int) uuid[10],
- (unsigned int) uuid[11],
- (unsigned int) uuid[12],
- (unsigned int) uuid[13],
- (unsigned int) uuid[14],
- (unsigned int) uuid[15]);
+ "\"" BT_UUID_FMT "\"",
+ BT_UUID_FMT_VALUES(uuid));
}
static
g_string_append(ctx->tsdl, "x");
break;
default:
- abort();
+ bt_common_abort();
}
g_string_append_c(ctx->tsdl, ';');
g_string_append_c(ctx->tsdl, '\n');
}
+static
+void append_bool_field_class(struct ctx *ctx,
+ __attribute__((unused)) struct fs_sink_ctf_field_class_bool *fc)
+{
+ /*
+ * CTF 1.8 has no boolean field class type, so this component
+ * translates it to an 8-bit unsigned integer field class.
+ */
+ append_integer_field_class_from_props(ctx, fc->base.size,
+ fc->base.base.alignment, false,
+ BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL,
+ NULL, NULL, false);
+}
+
+static
+void append_bit_array_field_class(struct ctx *ctx,
+ struct fs_sink_ctf_field_class_bit_array *fc)
+{
+ /*
+ * CTF 1.8 has no bit array field class type, so this component
+ * translates it to an unsigned integer field class with an
+ * hexadecimal base.
+ */
+ append_integer_field_class_from_props(ctx, fc->size,
+ fc->base.alignment, false,
+ BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL,
+ NULL, NULL, false);
+}
+
static
void append_integer_field_class(struct ctx *ctx,
struct fs_sink_ctf_field_class_int *fc)
{
const bt_field_class *ir_fc = fc->base.base.ir_fc;
bt_field_class_type type = bt_field_class_get_type(ir_fc);
- bool is_signed = type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION ||
- type == BT_FIELD_CLASS_TYPE_SIGNED_INTEGER;
+ bool is_signed = bt_field_class_type_is(type,
+ BT_FIELD_CLASS_TYPE_SIGNED_INTEGER);
- if (type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION ||
- type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
+ if (bt_field_class_type_is(type, BT_FIELD_CLASS_TYPE_ENUMERATION)) {
g_string_append(ctx->tsdl, "enum : ");
}
bt_field_class_integer_get_preferred_display_base(ir_fc),
NULL, NULL, false);
- if (type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION ||
- type == BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
+ if (bt_field_class_type_is(type, BT_FIELD_CLASS_TYPE_ENUMERATION)) {
uint64_t i;
g_string_append(ctx->tsdl, " {\n");
for (i = 0; i < bt_field_class_enumeration_get_mapping_count(ir_fc); i++) {
const char *label;
const bt_field_class_enumeration_mapping *mapping;
- const bt_field_class_unsigned_enumeration_mapping *u_mapping;
- const bt_field_class_signed_enumeration_mapping *i_mapping;
+ const bt_field_class_enumeration_unsigned_mapping *u_mapping;
+ const bt_field_class_enumeration_signed_mapping *s_mapping;
+ const bt_integer_range_set *ranges;
+ const bt_integer_range_set_unsigned *u_ranges;
+ const bt_integer_range_set_signed *s_ranges;
uint64_t range_count;
uint64_t range_i;
if (is_signed) {
- i_mapping = bt_field_class_signed_enumeration_borrow_mapping_by_index_const(
+ s_mapping = bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
ir_fc, i);
- mapping = bt_field_class_signed_enumeration_mapping_as_mapping_const(
- i_mapping);
+ mapping = bt_field_class_enumeration_signed_mapping_as_mapping_const(
+ s_mapping);
+ s_ranges = bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
+ s_mapping);
+ ranges = bt_integer_range_set_signed_as_range_set_const(
+ s_ranges);
} else {
- u_mapping = bt_field_class_unsigned_enumeration_borrow_mapping_by_index_const(
+ u_mapping = bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
ir_fc, i);
- mapping = bt_field_class_unsigned_enumeration_mapping_as_mapping_const(
+ mapping = bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
+ u_mapping);
+ u_ranges = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
u_mapping);
+ ranges = bt_integer_range_set_unsigned_as_range_set_const(
+ u_ranges);
}
label = bt_field_class_enumeration_mapping_get_label(
mapping);
- range_count =
- bt_field_class_enumeration_mapping_get_range_count(
- mapping);
+ range_count = bt_integer_range_set_get_range_count(
+ ranges);
for (range_i = 0; range_i < range_count; range_i++) {
append_indent(ctx);
-
- /*
- * Systematically prepend `_` to the
- * mapping's label as this could be used
- * as the tag of a subsequent variant
- * field class and variant FC option
- * names are systematically protected
- * with a leading `_`.
- *
- * FIXME: This is temporary as the
- * library's API should change to
- * decouple variant FC option names from
- * selector FC labels. The current
- * drawback is that an original label
- * `HELLO` becomes `_HELLO` in the
- * generated metadata, therefore tools
- * expecting `HELLO` could fail.
- */
- g_string_append(ctx->tsdl, "\"_");
+ g_string_append(ctx->tsdl, "\"");
append_quoted_string_content(ctx, label);
g_string_append(ctx->tsdl, "\" = ");
if (is_signed) {
+ const bt_integer_range_signed *range;
int64_t lower, upper;
- bt_field_class_signed_enumeration_mapping_get_range_by_index(
- i_mapping, range_i,
- &lower, &upper);
+ range = bt_integer_range_set_signed_borrow_range_by_index_const(
+ s_ranges, range_i);
+ lower = bt_integer_range_signed_get_lower(
+ range);
+ upper = bt_integer_range_signed_get_upper(
+ range);
if (lower == upper) {
g_string_append_printf(
lower, upper);
}
} else {
+ const bt_integer_range_unsigned *range;
uint64_t lower, upper;
- bt_field_class_unsigned_enumeration_mapping_get_range_by_index(
- u_mapping, range_i,
- &lower, &upper);
+ range = bt_integer_range_set_unsigned_borrow_range_by_index_const(
+ u_ranges, range_i);
+ lower = bt_integer_range_unsigned_get_lower(
+ range);
+ upper = bt_integer_range_unsigned_get_upper(
+ range);
if (lower == upper) {
g_string_append_printf(
{
unsigned int mant_dig, exp_dig;
- if (bt_field_class_real_is_single_precision(fc->base.base.ir_fc)) {
+ if (bt_field_class_get_type(fc->base.base.ir_fc) ==
+ BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL) {
mant_dig = 24;
exp_dig = 8;
} else {
GString *lengths = NULL;
const char *lengths_str = "";
+ BT_ASSERT(fc);
+
while (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY ||
fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) {
if (!lengths) {
struct_fc, i);
struct fs_sink_ctf_field_class *fc = named_fc->fc;
+ /*
+ * For sequence, option, and variant field classes, if
+ * the length/tag field class is generated before, write
+ * it now before the dependent field class.
+ */
if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) {
struct fs_sink_ctf_field_class_sequence *seq_fc =
(void *) fc;
BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL,
NULL, seq_fc->length_ref->str, true);
}
+ } else if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION) {
+ struct fs_sink_ctf_field_class_option *opt_fc =
+ (void *) fc;
+
+ /*
+ * CTF 1.8 does not support the option field
+ * class type. To write something anyway, this
+ * component translates this type to a variant
+ * field class where the options are:
+ *
+ * * An empty structure field class.
+ * * The optional field class itself.
+ *
+ * The "tag" is always generated/before in that
+ * case (an 8-bit unsigned enumeration field
+ * class).
+ */
+ append_indent(ctx);
+ g_string_append(ctx->tsdl,
+ "/* The enumeration and variant field classes "
+ "below were a trace IR option field class. */\n");
+ append_indent(ctx);
+ g_string_append(ctx->tsdl, "enum : ");
+ append_integer_field_class_from_props(ctx,
+ 8, 8, false,
+ BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL,
+ NULL, NULL, false);
+ g_string_append(ctx->tsdl, " {\n");
+ ctx->indent_level++;
+ append_indent(ctx);
+ g_string_append(ctx->tsdl, "none = 0,\n");
+ append_indent(ctx);
+ g_string_append(ctx->tsdl, "content = 1,\n");
+ append_end_block(ctx);
+ g_string_append_printf(ctx->tsdl, " %s;\n",
+ opt_fc->tag_ref->str);
} else if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT) {
struct fs_sink_ctf_field_class_variant *var_fc =
(void *) fc;
ctx->indent_level++;
for (i = 0; i < var_fc->options->len; i++) {
- struct fs_sink_ctf_named_field_class *named_fc =
+ struct fs_sink_ctf_named_field_class *option_named_fc =
fs_sink_ctf_field_class_variant_borrow_option_by_index(
var_fc, i);
append_indent(ctx);
g_string_append_printf(ctx->tsdl,
"\"%s\" = %" PRIu64 ",\n",
- named_fc->name->str, i);
+ option_named_fc->name->str, i);
}
append_end_block(ctx);
g_string_append_printf(ctx->tsdl, " %s;\n",
var_fc->tag_ref->str);
}
+ } else if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_BOOL) {
+ append_indent(ctx);
+ g_string_append(ctx->tsdl,
+ "/* The integer field class below was a trace IR boolean field class. */\n");
+ } else if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_BIT_ARRAY) {
+ append_indent(ctx);
+ g_string_append(ctx->tsdl,
+ "/* The integer field class below was a trace IR bit array field class. */\n");
}
append_indent(ctx);
fc->base.alignment);
}
+static
+void append_option_field_class(struct ctx *ctx,
+ struct fs_sink_ctf_field_class_option *opt_fc)
+{
+ g_string_append_printf(ctx->tsdl, "variant <%s> {\n",
+ opt_fc->tag_ref->str);
+ ctx->indent_level++;
+ append_indent(ctx);
+ g_string_append(ctx->tsdl, "struct { } none;\n");
+ append_indent(ctx);
+ append_member(ctx, "content", opt_fc->content_fc);
+ append_end_block(ctx);
+}
+
static
void append_variant_field_class(struct ctx *ctx,
struct fs_sink_ctf_field_class_variant *var_fc)
void append_field_class(struct ctx *ctx, struct fs_sink_ctf_field_class *fc)
{
switch (fc->type) {
+ case FS_SINK_CTF_FIELD_CLASS_TYPE_BOOL:
+ append_bool_field_class(ctx, (void *) fc);
+ break;
+ case FS_SINK_CTF_FIELD_CLASS_TYPE_BIT_ARRAY:
+ append_bit_array_field_class(ctx, (void *) fc);
+ break;
case FS_SINK_CTF_FIELD_CLASS_TYPE_INT:
append_integer_field_class(ctx, (void *) fc);
break;
case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT:
append_struct_field_class(ctx, (void *) fc);
break;
+ case FS_SINK_CTF_FIELD_CLASS_TYPE_OPTION:
+ append_option_field_class(ctx, (void *) fc);
+ break;
case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT:
append_variant_field_class(ctx, (void *) fc);
break;
default:
- abort();
+ bt_common_abort();
}
}
level = 14;
break;
default:
- abort();
+ bt_common_abort();
}
g_string_append_printf(ctx->tsdl, "%u;\n", level);
}
BT_HIDDEN
-void translate_trace_class_ctf_ir_to_tsdl(struct fs_sink_ctf_trace_class *tc,
+void translate_trace_ctf_ir_to_tsdl(struct fs_sink_ctf_trace *trace,
GString *tsdl)
{
struct ctx ctx = {
g_string_append(tsdl, "minor = 8;\n");
append_indent(&ctx);
g_string_append(tsdl, "uuid = ");
- append_uuid(&ctx, tc->uuid);
+ append_uuid(&ctx, trace->uuid);
g_string_append(tsdl, ";\n");
append_indent(&ctx);
g_string_append(tsdl, "byte_order = ");
/* End trace class */
append_end_block_semi_nl_nl(&ctx);
- /* Trace class environment */
- count = bt_trace_class_get_environment_entry_count(tc->ir_tc);
+ /* Trace environment */
+ count = bt_trace_get_environment_entry_count(trace->ir_trace);
if (count > 0) {
append_indent(&ctx);
g_string_append(tsdl, "env {\n");
const char *name;
const bt_value *val;
- bt_trace_class_borrow_environment_entry_by_index_const(
- tc->ir_tc, i, &name, &val);
+ bt_trace_borrow_environment_entry_by_index_const(
+ trace->ir_trace, i, &name, &val);
append_indent(&ctx);
g_string_append_printf(tsdl, "%s = ", name);
switch (bt_value_get_type(val)) {
case BT_VALUE_TYPE_SIGNED_INTEGER:
g_string_append_printf(tsdl, "%" PRId64,
- bt_value_signed_integer_get(val));
+ bt_value_integer_signed_get(val));
break;
case BT_VALUE_TYPE_STRING:
append_quoted_string(&ctx, bt_value_string_get(val));
default:
/*
* This is checked in
- * translate_trace_class_trace_ir_to_ctf_ir().
+ * translate_trace_trace_ir_to_ctf_ir().
*/
- abort();
+ bt_common_abort();
}
g_string_append(tsdl, ";\n");
}
/* Stream classes and their event classes */
- for (i = 0; i < tc->stream_classes->len; i++) {
- append_stream_class(&ctx, tc->stream_classes->pdata[i]);
+ for (i = 0; i < trace->stream_classes->len; i++) {
+ append_stream_class(&ctx, trace->stream_classes->pdata[i]);
}
}