Issue
---
According to the CTF specification, the alignment of an enumeration is
that of its container integer field type. However, ctf-ir does not
forward the alignment of an enumeration field type's alignment in
bt_field_type_get_alignment().
This causes babeltrace to fail to read traces produced by lttng-ust
following a fix that causes it to generate extended event headers. The
problem is observed on ARM platforms since lttng-ust will produce
a layout that does not result in unaligned memory accesses.
Solution
---
The alignment of the enumeration field type's container is sampled
when the enumeration field type is frozen.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
ret = (int) type->alignment;
break;
}
ret = (int) type->alignment;
break;
}
+ case BT_FIELD_TYPE_ID_ENUM:
+ {
+ struct bt_field_type *container =
+ bt_field_type_enumeration_get_container_type(type);
+
+ ret = bt_field_type_get_alignment(container);
+ bt_put(container);
+ break;
+ }
case BT_FIELD_TYPE_ID_UNKNOWN:
BT_LOGW("Invalid parameter: unknown field type ID: "
"addr=%p, ft-id=%d", type, type_id);
case BT_FIELD_TYPE_ID_UNKNOWN:
BT_LOGW("Invalid parameter: unknown field type ID: "
"addr=%p, ft-id=%d", type, type_id);
type, struct bt_field_type_enumeration, parent);
BT_LOGD("Freezing enumeration field type object: addr=%p", type);
type, struct bt_field_type_enumeration, parent);
BT_LOGD("Freezing enumeration field type object: addr=%p", type);
+ type->alignment = bt_field_type_get_alignment(type);
set_enumeration_range_overlap(type);
generic_field_type_freeze(type);
BT_LOGD("Freezing enumeration field type object's container field type: int-ft-addr=%p",
set_enumeration_range_overlap(type);
generic_field_type_freeze(type);
BT_LOGD("Freezing enumeration field type object's container field type: int-ft-addr=%p",