diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-11-04 13:27:44 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2024-11-25 22:07:04 -0500 |
commit | c4b94535295625fe259868899b7cae54c40e60c3 (patch) | |
tree | 2949958c819408f3222bfa5ffd8cc7eeb0898157 /gdb | |
parent | 5a616f1cf6c68e98d47f702aceaf8c535210f166 (diff) | |
download | binutils-c4b94535295625fe259868899b7cae54c40e60c3.zip binutils-c4b94535295625fe259868899b7cae54c40e60c3.tar.gz binutils-c4b94535295625fe259868899b7cae54c40e60c3.tar.bz2 |
Convert compile/compile.c to new hash table
This converts compile/compile.c to use the new hash table.
Change-Id: I7df3b8d791ece731ae0d1d64cdc91a2e372f5d4f
Co-Authored-By: Tom Tromey <tom@tromey.com>
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/compile/compile.c | 154 | ||||
-rw-r--r-- | gdb/compile/compile.h | 11 |
2 files changed, 19 insertions, 146 deletions
diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c index 89f9790..d6bcc1f 100644 --- a/gdb/compile/compile.c +++ b/gdb/compile/compile.c @@ -60,112 +60,15 @@ static struct cmd_list_element *compile_command_list; bool compile_debug; -/* Object of this type are stored in the compiler's symbol_err_map. */ - -struct symbol_error -{ - /* The symbol. */ - - const struct symbol *sym; - - /* The error message to emit. This is malloc'd and owned by the - hash table. */ - - char *message; -}; - -/* An object that maps a gdb type to a gcc type. */ - -struct type_map_instance -{ - /* The gdb type. */ - - struct type *type; - - /* The corresponding gcc type handle. */ - - gcc_type gcc_type_handle; -}; - -/* Hash a type_map_instance. */ - -static hashval_t -hash_type_map_instance (const void *p) -{ - const struct type_map_instance *inst = (const struct type_map_instance *) p; - - return htab_hash_pointer (inst->type); -} - -/* Check two type_map_instance objects for equality. */ - -static int -eq_type_map_instance (const void *a, const void *b) -{ - const struct type_map_instance *insta = (const struct type_map_instance *) a; - const struct type_map_instance *instb = (const struct type_map_instance *) b; - - return insta->type == instb->type; -} - -/* Hash function for struct symbol_error. */ - -static hashval_t -hash_symbol_error (const void *a) -{ - const struct symbol_error *se = (const struct symbol_error *) a; - - return htab_hash_pointer (se->sym); -} - -/* Equality function for struct symbol_error. */ - -static int -eq_symbol_error (const void *a, const void *b) -{ - const struct symbol_error *sea = (const struct symbol_error *) a; - const struct symbol_error *seb = (const struct symbol_error *) b; - - return sea->sym == seb->sym; -} - -/* Deletion function for struct symbol_error. */ - -static void -del_symbol_error (void *a) -{ - struct symbol_error *se = (struct symbol_error *) a; - - xfree (se->message); - xfree (se); -} - -/* Constructor for compile_instance. */ - -compile_instance::compile_instance (struct gcc_base_context *gcc_fe, - const char *options) - : m_gcc_fe (gcc_fe), m_gcc_target_options (options), - m_type_map (htab_create_alloc (10, hash_type_map_instance, - eq_type_map_instance, - xfree, xcalloc, xfree)), - m_symbol_err_map (htab_create_alloc (10, hash_symbol_error, - eq_symbol_error, del_symbol_error, - xcalloc, xfree)) -{ -} - /* See compile-internal.h. */ bool compile_instance::get_cached_type (struct type *type, gcc_type *ret) const { - struct type_map_instance inst, *found; - - inst.type = type; - found = (struct type_map_instance *) htab_find (m_type_map.get (), &inst); - if (found != NULL) + if (auto iter = m_type_map.find (type); + iter != m_type_map.end ()) { - *ret = found->gcc_type_handle; + *ret = iter->second; return true; } @@ -177,25 +80,12 @@ compile_instance::get_cached_type (struct type *type, gcc_type *ret) const void compile_instance::insert_type (struct type *type, gcc_type gcc_type) { - struct type_map_instance inst, *add; - void **slot; - - inst.type = type; - inst.gcc_type_handle = gcc_type; - slot = htab_find_slot (m_type_map.get (), &inst, INSERT); + auto [it, inserted] = m_type_map.emplace (type, gcc_type); - add = (struct type_map_instance *) *slot; /* The type might have already been inserted in order to handle recursive types. */ - if (add != NULL && add->gcc_type_handle != gcc_type) + if (!inserted && it->second != gcc_type) error (_("Unexpected type id from GCC, check you use recent enough GCC.")); - - if (add == NULL) - { - add = XNEW (struct type_map_instance); - *add = inst; - *slot = add; - } } /* See compile-internal.h. */ @@ -204,19 +94,7 @@ void compile_instance::insert_symbol_error (const struct symbol *sym, const char *text) { - struct symbol_error e; - void **slot; - - e.sym = sym; - slot = htab_find_slot (m_symbol_err_map.get (), &e, INSERT); - if (*slot == NULL) - { - struct symbol_error *ep = XNEW (struct symbol_error); - - ep->sym = sym; - ep->message = xstrdup (text); - *slot = ep; - } + m_symbol_err_map.emplace (sym, text); } /* See compile-internal.h. */ @@ -224,20 +102,12 @@ compile_instance::insert_symbol_error (const struct symbol *sym, void compile_instance::error_symbol_once (const struct symbol *sym) { - struct symbol_error search; - struct symbol_error *err; - - if (m_symbol_err_map == NULL) - return; - - search.sym = sym; - err = (struct symbol_error *) htab_find (m_symbol_err_map.get (), &search); - if (err == NULL || err->message == NULL) - return; - - gdb::unique_xmalloc_ptr<char> message (err->message); - err->message = NULL; - error (_("%s"), message.get ()); + if (auto iter = m_symbol_err_map.find (sym); + iter != m_symbol_err_map.end () && !iter->second.empty ()) + { + std::string message = std::move (iter->second); + error (_("%s"), message.c_str ()); + } } /* Implement "show debug compile". */ diff --git a/gdb/compile/compile.h b/gdb/compile/compile.h index 4be6f50..1f57d67 100644 --- a/gdb/compile/compile.h +++ b/gdb/compile/compile.h @@ -19,7 +19,7 @@ #define COMPILE_COMPILE_H #include "gcc-c-interface.h" -#include "gdbsupport/gdb-hashtab.h" +#include "gdbsupport/unordered_map.h" struct ui_file; struct gdbarch; @@ -61,7 +61,10 @@ enum compile_i_scope_types class compile_instance { public: - compile_instance (struct gcc_base_context *gcc_fe, const char *options); + compile_instance (struct gcc_base_context *gcc_fe, const char *options) + : m_gcc_fe (gcc_fe), + m_gcc_target_options (options) + {} virtual ~compile_instance () { @@ -163,10 +166,10 @@ protected: std::string m_gcc_target_options; /* Map from gdb types to gcc types. */ - htab_up m_type_map; + gdb::unordered_map<type *, gcc_type> m_type_map; /* Map from gdb symbols to gcc error messages to emit. */ - htab_up m_symbol_err_map; + gdb::unordered_map<const symbol *, std::string> m_symbol_err_map; }; /* Public function that is called from compile_control case in the |