We define "byte-packed" types as aligned on the byte size, namely 8-bit.
We define "bit-packed" types as following on the next bit, as defined by the
-"bitfields" section.
+"Integers" section.
All basic types, except bitfields, are either aligned on an architecture-defined
specific alignment or byte-packed, depending on the architecture preference.
Architectures providing fast unaligned write byte-packed basic types to save
space, aligning each type on byte boundaries (8-bit). Architectures with slow
unaligned writes align types on specific alignment values. If no specific
-alignment is declared for a type nor its parents, it is assumed to be bit-packed
-for bitfields and byte-packed for other types.
+alignment is declared for a type, it is assumed to be bit-packed for
+integers with size not multiple of 8 bits and for gcc bitfields. All
+other types are byte-packed.
Metadata attribute representation of a specific alignment:
size = 32;
signed = false;
align = 32;
-} : uint32_t;
+} typename uint32_t;
Definition of a named 5-bit signed bitfield:
size = 5;
signed = true;
align = 1;
-} : int5_t;
+} typename int5_t;
4.1.6 GNU/C bitfields
exp_dig = 8; /* sizeof(float) * CHAR_BIT - FLT_MANT_DIG */
mant_dig = 24; /* FLT_MANT_DIG */
byte_order = native;
-} : float;
+} typename float;
TODO: define NaN, +inf, -inf behavior.
is in fact a range of size 1. This single-value range is supported without
repeating the start and end values with the value = string declaration.
-If a numeric value is encountered between < >, it represents the integer type
-size used to hold the enumeration, in bits.
-
-enum name <integer_type OR size> {
+enum name <integer_type> {
somestring = start_value1 ... end_value1,
"other string" = start_value2 ... end_value2,
yet_another_string, /* will be assigned to end_value2 + 1 */
If the values are omitted, the enumeration starts at 0 and increment of 1 for
each entry:
-enum name <32> {
+enum name <unsigned int> {
ZERO,
ONE,
TWO,
};
struct {
- enum <integer_type or size> { sel1, sel2, sel3, ... } tag_field;
+ enum <integer_type> { sel1, sel2, sel3, ... } tag_field;
...
variant name <tag_field> v;
}
metadata:
struct {
- enum <integer_type or size> { sel1, sel2, sel3, ... } tag_field;
+ enum <integer_type> { sel1, sel2, sel3, ... } tag_field;
...
variant <tag_field> {
field_type sel1;
typealias string {
encoding = UTF8 OR ASCII;
-} : name;
+} typename name;
A nameless string type can be declared as a field type:
7. Metadata
-The meta-data is located in a stream named "metadata". It is made of "event
-packets", which each start with an event packet header. The event type within
-the metadata stream have no event header nor event context. Each event only
-contains a null-terminated "string" payload, which is a metadata description
-entry. The events are packed one next to another. Each event packet start with
-an event packet header, which contains, amongst other fields, the magic number
-and trace UUID. The trace UUID is represented as a string of hexadecimal digits
-and dashes "-".
-
-The metadata can be parsed by reading through the metadata strings, skipping
-newlines and null-characters. Type names are made of a single identifier, and
-can be surrounded by prefix/postfix. Text contained within "/*" and "*/", as
-well as within "//" and end of line, are treated as comments. Boolean values can
-be represented as true, TRUE, or 1 for true, and false, FALSE, or 0 for false.
+The meta-data is located in a stream identified by its name: "metadata".
+It is made of "event packets", which each start with an event packet
+header. The event type within the metadata stream have no event header
+nor event context. Each event only contains a null-terminated "string"
+payload, which is a metadata description entry. The events are packed
+one next to another. Each event packet start with an event packet
+header, which contains, amongst other fields, the magic number and trace
+UUID. In the event packet header, the trace UUID is represented as an
+array of bytes. Within the string-based metadata description, the trace
+UUID is represented as a string of hexadecimal digits and dashes "-".
+
+The metadata can be parsed by reading through the metadata strings,
+skipping null-characters. Type names are made of a single identifier,
+and can be surrounded by prefix/postfix. Text contained within "/*" and
+"*/", as well as within "//" and end of line, are treated as comments.
+Boolean values can be represented as true, TRUE, or 1 for true, and
+false, FALSE, or 0 for false.
7.1 Declaration vs Definition
(both specified with "<" ">") are part of the type specifier.
A definition associates a type to a location in the event structure
-hierarchy (see Section 6).
+hierarchy (see Section 6). This association is denoted by ":=", as shown
+in Section 7.3.
7.2 Metadata Scopes
readable by accessing the upper dynamic scopes.
-7.2 Metadata Examples
+7.3 Metadata Examples
The grammar representing the CTF metadata is presented in
Appendix C. CTF Metadata Grammar. This section presents a rather ligher
* Type declarations behave similarly to the C standard.
*/
-typedef aliased_type_prefix aliased_type new_type aliased_type_postfix;
+typedef aliased_type_specifiers new_type_declarators;
/* e.g.: typedef struct example new_type_name[10]; */
* typealias
*
* The "typealias" declaration can be used to give a name (including
- * prefix/postfix) to a type. It should also be used to map basic C types
- * (float, int, unsigned long, ...) to a CTF type. Typealias is a superset of
- * "typedef": it also allows assignment of a simple variable identifier to a
- * type.
+ * pointer declarator specifier) to a type. It should also be used to
+ * map basic C types (float, int, unsigned long, ...) to a CTF type.
+ * Typealias is a superset of "typedef": it also allows assignment of a
+ * simple variable identifier to a type. The keyword "typename" is
+ * reserved to separate the aliased type from the newly declared alias
+ * name.
*/
typealias type_class {
...
-} : new_type_prefix new_type new_type_postfix;
+} typename type_specifiers type_declarator;
/*
* e.g.:
* size = 32;
* align = 32;
* signed = false;
- * } : struct page *;
+ * } typename struct page *;
*
* typealias integer {
* size = 32;
* align = 32;
* signed = true;
- * } : int;
+ * } typename int;
*/
struct name {
...
};
-enum name <integer_type or size> {
+enum name <integer_type> {
...
};
...
}
-enum <integer_type or size> {
+enum <integer_type> {
...
}
trace
typealias
typedef
+typename
unsigned
variant
void
assignment-operator:
=
+type-assignment-operator:
+ :=
+
constant-expression:
unary-expression
2.2) Declarations:
declaration:
- declaration-specifiers ;
- declaration-specifiers storage-class-specifier declaration-specifiers declarator-list ;
+ declaration-specifiers declarator-list-opt ;
ctf-specifier ;
declaration-specifiers:
+ storage-class-specifier declaration-specifiers-opt
type-specifier declaration-specifiers-opt
type-qualifier declaration-specifiers-opt
unsigned
_Bool
_Complex
+ _Imaginary
struct-specifier
variant-specifier
enum-specifier
struct-or-variant-declaration:
specifier-qualifier-list struct-or-variant-declarator-list ;
declaration-specifiers storage-class-specifier declaration-specifiers declarator-list ;
- typealias declaration-specifiers abstract-declarator-list : declaration-specifiers abstract-declarator-list ;
- typealias declaration-specifiers abstract-declarator-list : declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list typename declaration-specifiers abstract-declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list typename declarator-list ;
specifier-qualifier-list:
type-specifier specifier-qualifier-list-opt
enum identifier-opt < declaration-specifiers > { enumerator-list }
enum identifier-opt < declaration-specifiers > { enumerator-list , }
enum identifier < declaration-specifiers >
- enum identifier-opt < integer-constant > { enumerator-list }
- enum identifier-opt < integer-constant > { enumerator-list , }
- enum identifier < integer-constant >
enumerator-list:
enumerator
event { ctf-assignment-expression-list-opt }
stream { ctf-assignment-expression-list-opt }
trace { ctf-assignment-expression-list-opt }
- typealias declaration-specifiers abstract-declarator-list : declaration-specifiers abstract-declarator-list ;
- typealias declaration-specifiers abstract-declarator-list : declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list typename declaration-specifiers abstract-declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list typename declarator-list ;
ctf-type-specifier:
floating_point { ctf-assignment-expression-list-opt }
unary-expression assignment-operator unary-expression
unary-expression type-assignment-operator type-specifier
declaration-specifiers storage-class-specifier declaration-specifiers declarator-list
- typealias declaration-specifiers abstract-declarator-list : declaration-specifiers abstract-declarator-list
- typealias declaration-specifiers abstract-declarator-list : declarator-list
+ typealias declaration-specifiers abstract-declarator-list typename declaration-specifiers abstract-declarator-list
+ typealias declaration-specifiers abstract-declarator-list typename declarator-list