[6/8] Use std::unordered_map instead of htab_t.
Commit Message
On 07/11/2018 04:21 AM, Pedro Alves wrote:
> Yeah, it's not whether or not I _want_ you to revert. Instead, data rules.
Ha ha. Indeed, it (data) does rule. I apologize for being so vague...
> I really have no awareness of whether that map ends up with a hundred entries
> or a hundred million entries, and thus whether the difference ends up
> significant. So if after considering that you're not concerned, then
> neither am I.
I've revisited this topic a bit on the my C++ compile branch, and
there is sufficient evidence there to suggest that the type cache
could grow quite large -- especially for non-trivial compilations such
as compiling a file (or perhaps in the future if/when we support code
replacement or other advanced uses of this feature.
IIRC, I originally wrote this before the move to C++11 had been
proposed. Consequently unique_ptr was not available. Of course, it is
now, and it makes sense to me to move to using htab_up instead.
[The underlying storage for the error map doesn't really matter. That
map seldom has any entries in it.]
WDYT of the below patch?
Keith
Subject: [PATCH] Use unique_ptr for htabs
This patch updates the type-conversion caching in C compile to use
unique pointers. This patch also removes the on-demand allocation of the
symbol error map in favor of initialization, simplifying the code.
gdb/ChangeLog
YYYY-MM-DD Keith Seitz <keiths@redhat.com>
* compile/compile-internal.h (compile_instance::~compile_instance):
Remove calls to htab_delete.
<m_type_map, m_symbol_err_map>: Switch type to htab_up.
* compile.c (compile_instance::compile_instance): Initialize
htab unique pointers.
(compile_instance::get_cached_type, compile_instance::insert_type)
(compile_instance::error_symbol_once): Update for unique_ptr.
---
gdb/compile/compile-internal.h | 7 ++-----
gdb/compile/compile.c | 28 ++++++++++------------------
2 files changed, 12 insertions(+), 23 deletions(-)
Comments
On 08/07/2018 03:57 PM, Keith Seitz wrote:
> WDYT of the below patch?
>
LGTM.
Thanks,
Pedro Alves
On 08/08/2018 05:28 AM, Pedro Alves wrote:
> On 08/07/2018 03:57 PM, Keith Seitz wrote:
>
>> WDYT of the below patch?
>>
> LGTM.
And with that, I've pushed the entire series.
Thank you for reviewing and your advice!
Keith
@@ -49,9 +49,6 @@ public:
virtual ~compile_instance ()
{
m_gcc_fe->ops->destroy (m_gcc_fe);
- htab_delete (m_type_map);
- if (m_symbol_err_map != NULL)
- htab_delete (m_symbol_err_map);
}
/* Returns the GCC options to be passed during compilation. */
@@ -148,10 +145,10 @@ protected:
std::string m_gcc_target_options;
/* Map from gdb types to gcc types. */
- htab_t m_type_map;
+ htab_up m_type_map;
/* Map from gdb symbols to gcc error messages to emit. */
- htab_t m_symbol_err_map;
+ htab_up m_symbol_err_map;
};
/* Define header and footers for different scopes. */
@@ -129,11 +129,13 @@ del_symbol_error (void *a)
compile_instance::compile_instance (struct gcc_base_context *gcc_fe,
const char *options)
: m_gcc_fe (gcc_fe), m_gcc_target_options (options),
- m_symbol_err_map (NULL)
+ 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))
{
- m_type_map = htab_create_alloc (10, hash_type_map_instance,
- eq_type_map_instance,
- xfree, xcalloc, xfree);
}
/* See compile-internal.h. */
@@ -144,7 +146,7 @@ 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, &inst);
+ found = (struct type_map_instance *) htab_find (m_type_map.get (), &inst);
if (found != NULL)
{
ret = found->gcc_type_handle;
@@ -164,7 +166,7 @@ compile_instance::insert_type (struct type *type, gcc_type gcc_type)
inst.type = type;
inst.gcc_type_handle = gcc_type;
- slot = htab_find_slot (m_type_map, &inst, INSERT);
+ slot = htab_find_slot (m_type_map.get (), &inst, INSERT);
add = (struct type_map_instance *) *slot;
/* The type might have already been inserted in order to handle
@@ -189,18 +191,8 @@ compile_instance::insert_symbol_error (const struct symbol *sym,
struct symbol_error e;
void **slot;
- if (m_symbol_err_map == NULL)
- {
- m_symbol_err_map = htab_create_alloc (10,
- hash_symbol_error,
- eq_symbol_error,
- del_symbol_error,
- xcalloc,
- xfree);
- }
-
e.sym = sym;
- slot = htab_find_slot (m_symbol_err_map, &e, INSERT);
+ slot = htab_find_slot (m_symbol_err_map.get (), &e, INSERT);
if (*slot == NULL)
{
struct symbol_error *e = XNEW (struct symbol_error);
@@ -223,7 +215,7 @@ compile_instance::error_symbol_once (const struct symbol *sym)
return;
search.sym = sym;
- err = (struct symbol_error *) htab_find (m_symbol_err_map, &search);
+ err = (struct symbol_error *) htab_find (m_symbol_err_map.get (), &search);
if (err == NULL || err->message == NULL)
return;