X-Git-Url: http://git.efficios.com/?p=ctf.git;a=blobdiff_plain;f=common-trace-format-proposal.txt;h=60bf972fb695fc8a4c3bd30fcad88cae14fbe51a;hp=ef6739ff114375135fb65eb57bd2eccbd36b97b1;hb=a9b8369547930366da4bd4cf701ebc41320f9431;hpb=80af8ac60b88e28f699d15c28ce44723efdb82ad diff --git a/common-trace-format-proposal.txt b/common-trace-format-proposal.txt index ef6739f..60bf972 100644 --- a/common-trace-format-proposal.txt +++ b/common-trace-format-proposal.txt @@ -186,7 +186,7 @@ typealias integer { size = 32; signed = false; align = 32; -} typename uint32_t; +} := uint32_t; Definition of a named 5-bit signed bitfield: @@ -194,7 +194,7 @@ typealias integer { size = 5; signed = true; align = 1; -} typename int5_t; +} := int5_t; 4.1.6 GNU/C bitfields @@ -253,7 +253,7 @@ typealias floating_point { 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. @@ -271,7 +271,7 @@ this format by having the same start_value and end_value for each element, which 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 { +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 */ @@ -282,7 +282,7 @@ enum name { If the values are omitted, the enumeration starts at 0 and increment of 1 for each entry: -enum name { +enum name : unsigned int { ZERO, ONE, TWO, @@ -294,7 +294,7 @@ Overlapping ranges within a single enumeration are implementation defined. A nameless enumeration can be declared as a field type or as part of a typedef: -enum { +enum : integer_type { ... } @@ -368,7 +368,7 @@ variant name { }; struct { - enum { sel1, sel2, sel3, ... } tag_field; + enum : integer_type { sel1, sel2, sel3, ... } tag_field; ... variant name v; } @@ -377,7 +377,7 @@ An unnamed variant definition within a structure is expressed by the following metadata: struct { - enum { sel1, sel2, sel3, ... } tag_field; + enum : integer_type { sel1, sel2, sel3, ... } tag_field; ... variant { field_type sel1; @@ -396,14 +396,14 @@ variant example { }; struct { - enum { a, b, c } choice; + enum : uint2_t { a, b, c } choice; variant example v[unsigned int]; } Example of an unnamed variant: struct { - enum { 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 { @@ -420,7 +420,7 @@ struct { Example of an unnamed variant within an array: struct { - enum { a, b, c } choice; + enum : uint2_t { a, b, c } choice; variant { uint32_t a; uint64_t b; @@ -435,7 +435,7 @@ type definition referring to the tag "x" uses the closest preceding field from the lexical scope of the type definition. struct { - enum { a, b, c, d } x; + enum : uint2_t { a, b, c, d } x; typedef variant { /* * "x" refers to the preceding "x" enumeration in the @@ -447,9 +447,9 @@ struct { } example_variant; struct { - enum { 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 { a, b, c, d }" + * "v" uses the "enum : uint2_t { a, b, c, d }" * tag. */ } a[10]; @@ -498,7 +498,7 @@ Metadata representation of a named string type: typealias string { encoding = UTF8 OR ASCII; -} typename name; +} := name; A nameless string type can be declared as a field type: @@ -651,7 +651,7 @@ struct event_header_1 { * id: range: 0 - 30. * id 31 is reserved to indicate an extended header. */ - enum { compact = 0 ... 30, extended = 31 } id; + enum : uint5_t { compact = 0 ... 30, extended = 31 } id; variant { struct { uint27_t timestamp; @@ -679,7 +679,7 @@ struct event_header_2 { * id: range: 0 - 65534. * id 65535 is reserved to indicate an extended header. */ - enum { compact = 0 ... 65534, extended = 65535 } id; + enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id; variant { struct { uint32_t timestamp; @@ -788,8 +788,9 @@ variant field), a declaration is followed by a declarator, which specify 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 @@ -907,14 +908,12 @@ typedef aliased_type_specifiers new_type_declarators; * 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.: @@ -922,13 +921,13 @@ typealias type_class { * size = 32; * align = 32; * signed = false; - * } typename struct page *; + * } := struct page *; * * typealias integer { * size = 32; * align = 32; * signed = true; - * } typename int; + * } := int; */ struct name { @@ -939,7 +938,7 @@ variant name { ... }; -enum name { +enum name : integer_type { ... }; @@ -956,7 +955,7 @@ variant { ... } -enum { +enum : integer_type { ... } @@ -1074,7 +1073,6 @@ struct trace typealias typedef -typename unsigned variant void @@ -1309,8 +1307,8 @@ struct-or-variant-declaration-list: 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 @@ -1335,9 +1333,8 @@ enum-specifier: 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 @@ -1387,8 +1384,8 @@ ctf-specifier: 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 } @@ -1403,5 +1400,5 @@ ctf-assignment-expression: 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