- * TODO: The proper structure to hold the range to quark set mapping would be an
- * interval tree, with O(n) size, O(n*log(n)) build time and O(log(n)) query
- * time. Using a simple O(n) list search for now for implementation speed and
- * given that we can expect to have a _relatively_ small number of enumeration
- * ranges. This might become untrue if we are fed with symbol tables often
- * required to lookup function names from instruction pointer value.
- */
-struct enum_table {
- GHashTable *value_to_quark_set; /* (value, GQuark GArray) */
- struct cds_list_head range_to_quark; /* (range, GQuark) */
- GHashTable *quark_to_range_set; /* (GQuark, range GArray) */
-};
-
-struct declaration_enum {
- struct declaration p;
- struct declaration_integer *integer_declaration;
- struct enum_table table;
-};
-
-struct definition_enum {
- struct definition p;
- struct definition_integer *integer;
- struct declaration_enum *declaration;
- /* Last GQuark values read. Keeping a reference on the GQuark array. */
- GArray *value;
-};
-
-enum ctf_string_encoding {
- CTF_STRING_UTF8 = 0,
- CTF_STRING_ASCII,
- CTF_STRING_UNKNOWN,
-};
-
-struct declaration_string {
- struct declaration p;
- enum ctf_string_encoding encoding;
-};
-
-struct definition_string {
- struct definition p;
- struct declaration_string *declaration;
- char *value; /* freed at definition_string teardown */
-};
-
-struct declaration_field {
- GQuark name;
- struct declaration *declaration;
-};
-
-struct field {
- GQuark name;
- struct definition *definition;
-};
-
-struct declaration_struct {
- struct declaration p;
- GHashTable *fields_by_name; /* Tuples (field name, field index) */
- struct declaration_scope *scope;
- GArray *fields; /* Array of declaration_field */
-};
-
-struct definition_struct {
- struct definition p;
- struct declaration_struct *declaration;
- struct definition_scope *scope;
- GArray *fields; /* Array of struct field */
-};
-
-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 */
-};
-
-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 *scope;
- struct definition *enum_tag;
- GArray *fields; /* Array of struct field */
- struct field *current_field; /* Last field read */
-};
-
-struct declaration_array {
- struct declaration p;
- size_t len;
- struct declaration *elem;
- struct declaration_scope *scope;
-};
-
-struct definition_array {
- struct definition p;
- struct declaration_array *declaration;
- struct definition_scope *scope;
- struct field current_element; /* struct field */
-};
-
-struct declaration_sequence {
- struct declaration p;
- struct declaration_integer *len_declaration;
- struct declaration *elem;
- struct declaration_scope *scope;
-};
-
-struct definition_sequence {
- struct definition p;
- struct declaration_sequence *declaration;
- struct definition_scope *scope;
- struct definition_integer *len;
- struct field current_element; /* struct field */
-};
-
-int register_declaration(GQuark declaration_name,
- struct declaration *declaration,
- struct declaration_scope *scope);
-struct declaration *lookup_declaration(GQuark declaration_name,
- struct declaration_scope *scope);
-
-/*
- * Type scopes also contain a separate registry for struct, variant and
- * enum types. Those register types rather than type definitions, so
- * that a named variant can be declared without specifying its target
- * "choice" tag field immediately.