/* type scope */
struct declaration_scope {
/* Hash table mapping type name GQuark to "struct declaration" */
+ /* Used for both typedef and typealias. */
GHashTable *typedef_declarations;
/* Hash table mapping struct name GQuark to "struct declaration_struct" */
GHashTable *struct_declarations;
CTF_TYPE_ENUM,
CTF_TYPE_STRING,
CTF_TYPE_STRUCT,
+ CTF_TYPE_UNTAGGED_VARIANT,
CTF_TYPE_VARIANT,
CTF_TYPE_ARRAY,
CTF_TYPE_SEQUENCE,
GArray *fields; /* Array of struct field */
};
-struct declaration_variant {
+struct declaration_untagged_variant {
struct declaration p;
GHashTable *fields_by_tag; /* Tuples (field tag, field index) */
struct declaration_scope *scope;
GArray *fields; /* Array of declaration_field */
- GQuark tag_name; /* TODO */
- /* Tag name must be nonzero and must exist when defining the variant */
};
+struct declaration_variant {
+ struct declaration p;
+ struct declaration_untagged_variant *untagged_variant;
+ GArray *tag_name; /* Array of GQuark */
+};
+
+/* A variant needs to be tagged to be defined. */
struct definition_variant {
struct definition p;
struct declaration_variant *declaration;
struct definition_scope *
new_definition_scope(struct definition_scope *parent_scope,
GQuark field_name);
-void set_dynamic_definition_scope(struct definition_scope *scope,
- GQuark root_name);
+void set_dynamic_definition_scope(struct definition *definition,
+ struct definition_scope *scope,
+ const char *root_name);
void free_definition_scope(struct definition_scope *scope);
void declaration_ref(struct declaration *declaration);
void definition_ref(struct definition *definition);
void definition_unref(struct definition *definition);
-/* Nameless declarations can be created by passing a NULL name */
-
-struct declaration_integer *integer_declaration_new(const char *name,
- size_t len, int byte_order,
+struct declaration_integer *integer_declaration_new(size_t len, int byte_order,
int signedness, size_t alignment);
/*
* mantissa_len is the length of the number of bytes represented by the mantissa
* (e.g. result of DBL_MANT_DIG). It includes the leading 1.
*/
-struct declaration_float *float_declaration_new(const char *name,
- size_t mantissa_len,
+struct declaration_float *float_declaration_new(size_t mantissa_len,
size_t exp_len, int byte_order,
size_t alignment);
* from numeric values to a single tag. Overlapping tag value ranges are
* therefore forbidden.
*/
-struct declaration_variant *variant_declaration_new(const char *name,
+struct declaration_untagged_variant *untagged_variant_declaration_new(const char *name,
struct declaration_scope *parent_scope);
-void variant_declaration_add_field(struct declaration_variant *variant_declaration,
- const char *tag_name,
- struct declaration *tag_declaration);
+struct declaration_variant *variant_declaration_new(struct declaration_untagged_variant *untagged_variant,
+ const char *tag);
+
+void untagged_variant_declaration_add_field(struct declaration_untagged_variant *untagged_variant_declaration,
+ const char *field_name,
+ struct declaration *field_declaration);
struct declaration_field *
- variant_declaration_get_field_from_tag(struct declaration_variant *variant_declaration,
+ untagged_variant_declaration_get_field_from_tag(struct declaration_untagged_variant *untagged_variant_declaration,
GQuark tag);
/*
* Returns 0 on success, -EPERM on error.
struct declaration *elem_declaration,
struct declaration_scope *parent_scope);
+/*
+ * in: path (dot separated), out: q (GArray of GQuark)
+ */
+void append_scope_path(const char *path, GArray *q);
+
#endif /* _BABELTRACE_declarationS_H */