- * 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.
- */
-int register_struct_declaration(GQuark struct_name,
- struct declaration_struct *struct_declaration,
- struct declaration_scope *scope);
-struct declaration_struct *
- lookup_struct_declaration(GQuark struct_name,
- struct declaration_scope *scope);
-int register_variant_declaration(GQuark variant_name,
- struct declaration_untagged_variant *untagged_variant_declaration,
- struct declaration_scope *scope);
-struct declaration_untagged_variant *lookup_variant_declaration(GQuark variant_name,
- struct declaration_scope *scope);
-int register_enum_declaration(GQuark enum_name,
- struct declaration_enum *enum_declaration,
- struct declaration_scope *scope);
-struct declaration_enum *
- lookup_enum_declaration(GQuark enum_name,
- struct declaration_scope *scope);
-
-struct declaration_scope *
- new_declaration_scope(struct declaration_scope *parent_scope);
-void free_declaration_scope(struct declaration_scope *scope);
-
-/*
- * field_definition is for field definitions. They are registered into
- * definition scopes.
- */
-struct definition *
- lookup_definition(GArray *cur_path, /* array of GQuark */
- GArray *lookup_path, /* array of GQuark */
- struct definition_scope *scope);
-int register_field_definition(GQuark field_name,
- struct definition *definition,
- struct definition_scope *scope);
-struct definition_scope *
- new_definition_scope(struct definition_scope *parent_scope,
- GQuark field_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 declaration_unref(struct declaration *declaration);
-
-void definition_ref(struct definition *definition);
-void definition_unref(struct definition *definition);
-
-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(size_t mantissa_len,
- size_t exp_len, int byte_order,
- size_t alignment);
-
-/*
- * A GQuark can be translated to/from strings with g_quark_from_string() and
- * g_quark_to_string().