- * This function returns whether or not a given field class `tag_fc`
- * is valid as the tag field class of the variant field class `fc`.
- *
- * CTF 1.8 requires that the tag field class be an enumeration field
- * class and that, for each variant field class option's range set, the
- * tag field class contains a mapping which has the option's name and an
- * equal range set.
- */
-static inline
-bool _is_variant_field_class_tag_valid(
- struct fs_sink_ctf_field_class_variant *fc,
- struct fs_sink_ctf_field_class *tag_fc)
-{
- bool is_valid = true;
- bt_field_class_type ir_tag_fc_type = bt_field_class_get_type(
- tag_fc->ir_fc);
- uint64_t i;
- GString *escaped_opt_name = g_string_new(NULL);
-
- BT_ASSERT(escaped_opt_name);
-
- if (ir_tag_fc_type != BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION &&
- ir_tag_fc_type != BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION) {
- is_valid = false;
- goto end;
- }
-
- for (i = 0; i < bt_field_class_variant_get_option_count(
- fc->base.ir_fc); i++) {
- const bt_field_class_variant_option *var_opt_base =
- bt_field_class_variant_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const char *opt_name = bt_field_class_variant_option_get_name(
- var_opt_base);
-
- /*
- * If the option is named `name` in trace IR, then it
- * was _possibly_ named `_name` originally if it comes
- * from `src.ctf.fs`. This means the corresponding
- * enumeration field class mapping was also named
- * `_name`, but this one didn't change, as enumeration
- * FC mapping names are not escaped; they are literal
- * strings.
- *
- * The `sink.ctf.fs` component escapes all the variant
- * FC option names with `_`. Therefore the
- * _escaped name_ must match the original enumeration
- * FC mapping name.
- */
- g_string_assign(escaped_opt_name, "_");
- g_string_append(escaped_opt_name, opt_name);
-
- if (ir_tag_fc_type == BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION) {
- const bt_field_class_variant_with_selector_unsigned_option *var_opt =
- bt_field_class_variant_with_selector_unsigned_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const bt_field_class_enumeration_unsigned_mapping *mapping;
- const bt_integer_range_set_unsigned *opt_ranges;
- const bt_integer_range_set_unsigned *mapping_ranges;
-
- mapping = bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const(
- tag_fc->ir_fc, escaped_opt_name->str);
- if (!mapping) {
- is_valid = false;
- goto end;
- }
-
- opt_ranges = bt_field_class_variant_with_selector_unsigned_option_borrow_ranges_const(
- var_opt);
- mapping_ranges = bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
- mapping);
- if (!bt_integer_range_set_unsigned_compare(opt_ranges,
- mapping_ranges)) {
- is_valid = false;
- goto end;
- }
- } else {
- const bt_field_class_variant_with_selector_signed_option *var_opt =
- bt_field_class_variant_with_selector_signed_borrow_option_by_index_const(
- fc->base.ir_fc, i);
- const bt_field_class_enumeration_signed_mapping *mapping;
- const bt_integer_range_set_signed *opt_ranges;
- const bt_integer_range_set_signed *mapping_ranges;
-
- mapping = bt_field_class_enumeration_signed_borrow_mapping_by_label_const(
- tag_fc->ir_fc, escaped_opt_name->str);
- if (!mapping) {
- is_valid = false;
- goto end;
- }
-
- opt_ranges = bt_field_class_variant_with_selector_signed_option_borrow_ranges_const(
- var_opt);
- mapping_ranges = bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
- mapping);
- if (!bt_integer_range_set_signed_compare(opt_ranges,
- mapping_ranges)) {
- is_valid = false;
- goto end;
- }
- }
- }
-
-end:
- return is_valid;
-}
-
-/*
- * This function indicates whether or not a given variant FC option name
- * must be protected (with the `_` prefix).