size = 32;
signed = false;
align = 32;
-} typename uint32_t;
+} := uint32_t;
Definition of a named 5-bit signed bitfield:
size = 5;
signed = true;
align = 1;
-} typename int5_t;
+} := 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;
-} typename float;
+} := 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.
-enum name <integer_type> {
+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 <unsigned int> {
+enum name : unsigned int {
ZERO,
ONE,
TWO,
A nameless enumeration can be declared as a field type or as part of a typedef:
-enum <integer_type> {
+enum : integer_type {
...
}
};
struct {
- enum <integer_type> { sel1, sel2, sel3, ... } tag_field;
+ enum : integer_type { sel1, sel2, sel3, ... } tag_field;
...
variant name <tag_field> v;
}
metadata:
struct {
- enum <integer_type> { sel1, sel2, sel3, ... } tag_field;
+ enum : integer_type { sel1, sel2, sel3, ... } tag_field;
...
variant <tag_field> {
field_type sel1;
};
struct {
- enum <uint2_t> { a, b, c } choice;
+ enum : uint2_t { a, b, c } choice;
variant example <choice> v[unsigned int];
}
Example of an unnamed variant:
struct {
- enum <uint2_t> { a, b, c, d } choice;
+ enum : uint2_t { a, b, c, d } choice;
/* Unrelated fields can be added between the variant and its tag */
int32_t somevalue;
variant <choice> {
Example of an unnamed variant within an array:
struct {
- enum <uint2_t> { a, b, c } choice;
+ enum : uint2_t { a, b, c } choice;
variant <choice> {
uint32_t a;
uint64_t b;
the lexical scope of the type definition.
struct {
- enum <uint2_t> { a, b, c, d } x;
+ enum : uint2_t { a, b, c, d } x;
typedef variant <x> { /*
* "x" refers to the preceding "x" enumeration in the
} example_variant;
struct {
- enum <int> { x, y, z } x; /* This enumeration is not used by "v". */
+ enum : int { x, y, z } x; /* This enumeration is not used by "v". */
example_variant v; /*
- * "v" uses the "enum <uint2_t> { a, b, c, d }"
+ * "v" uses the "enum : uint2_t { a, b, c, d }"
* tag.
*/
} a[10];
typealias string {
encoding = UTF8 OR ASCII;
-} typename name;
+} := name;
A nameless string type can be declared as a field type:
* id: range: 0 - 30.
* id 31 is reserved to indicate an extended header.
*/
- enum <uint5_t> { compact = 0 ... 30, extended = 31 } id;
+ enum : uint5_t { compact = 0 ... 30, extended = 31 } id;
variant <id> {
struct {
uint27_t timestamp;
* id: range: 0 - 65534.
* id 65535 is reserved to indicate an extended header.
*/
- enum <uint16_t> { compact = 0 ... 65534, extended = 65535 } id;
+ enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;
variant <id> {
struct {
uint32_t timestamp;
the newly defined type name (for typedef), or the field name (for
declarations located within structure and variants). Array and sequence,
declared with square brackets ("[" "]"), are part of the declarator,
-similarly to C99. The enumeration type specifier and variant tag name
-(both specified with "<" ">") are part of the type specifier.
+similarly to C99. The enumeration base type is specified by
+": base_type", which is part of the type specifier. The variant tag
+name, specified between "<" ">", is also part of the type specifier.
A definition associates a type to a location in the event structure
hierarchy (see Section 6). This association is denoted by ":=", as shown
* 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.
+ * simple variable identifier to a type.
*/
typealias type_class {
...
-} typename type_specifiers type_declarator;
+} := type_specifiers type_declarator;
/*
* e.g.:
* size = 32;
* align = 32;
* signed = false;
- * } typename struct page *;
+ * } := struct page *;
*
* typealias integer {
* size = 32;
* align = 32;
* signed = true;
- * } typename int;
+ * } := int;
*/
struct name {
...
};
-enum name <integer_type> {
+enum name : integer_type {
...
};
...
}
-enum <integer_type> {
+enum : integer_type {
...
}
trace
typealias
typedef
-typename
unsigned
variant
void
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 typename declaration-specifiers abstract-declarator-list ;
- typealias declaration-specifiers abstract-declarator-list typename declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list := declaration-specifiers abstract-declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list := declarator-list ;
specifier-qualifier-list:
type-specifier specifier-qualifier-list-opt
enum identifier-opt { enumerator-list }
enum identifier-opt { enumerator-list , }
enum identifier
- enum identifier-opt < declaration-specifiers > { enumerator-list }
- enum identifier-opt < declaration-specifiers > { enumerator-list , }
- enum identifier < declaration-specifiers >
+ enum identifier-opt : declaration-specifiers { enumerator-list }
+ enum identifier-opt : declaration-specifiers { enumerator-list , }
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 typename declaration-specifiers abstract-declarator-list ;
- typealias declaration-specifiers abstract-declarator-list typename declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list := declaration-specifiers abstract-declarator-list ;
+ typealias declaration-specifiers abstract-declarator-list := 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 typename declaration-specifiers abstract-declarator-list
- typealias declaration-specifiers abstract-declarator-list typename declarator-list
+ typealias declaration-specifiers abstract-declarator-list := declaration-specifiers abstract-declarator-list
+ typealias declaration-specifiers abstract-declarator-list := declarator-list