* SOFTWARE.
*/
+#include "translate-ctf-ir-to-tsdl.h"
+
#include <babeltrace2/babeltrace.h>
#include "common/macros.h"
#include <stdio.h>
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 *s_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_i;
if (is_signed) {
- s_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(
+ mapping = bt_field_class_enumeration_signed_mapping_as_mapping_const(
s_mapping);
- s_ranges = bt_field_class_signed_enumeration_mapping_borrow_ranges_const(
+ 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_unsigned_enumeration_mapping_borrow_ranges_const(
+ 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);
{
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);
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));
* This is checked in
* translate_trace_trace_ir_to_ctf_ir().
*/
- abort();
+ bt_common_abort();
}
g_string_append(tsdl, ";\n");