diff options
-rw-r--r-- | gdb/dwarf2/call-site.h | 3 | ||||
-rw-r--r-- | gdb/dwarf2/cu.h | 2 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 27 | ||||
-rw-r--r-- | gdb/symtab.c | 30 | ||||
-rw-r--r-- | gdb/symtab.h | 5 |
5 files changed, 27 insertions, 40 deletions
diff --git a/gdb/dwarf2/call-site.h b/gdb/dwarf2/call-site.h index 0a0c7e8..bbf4597 100644 --- a/gdb/dwarf2/call-site.h +++ b/gdb/dwarf2/call-site.h @@ -25,6 +25,7 @@ #include "dwarf2/types.h" #include "../frame.h" #include "gdbsupport/function-view.h" +#include "gdbsupport/unordered_map.h" struct dwarf2_locexpr_baton; struct dwarf2_per_cu_data; @@ -241,4 +242,6 @@ public: struct call_site_parameter parameter[]; }; +using call_site_htab_t = gdb::unordered_map<unrelocated_addr, call_site *>; + #endif /* CALL_SITE_H */ diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h index dc11be0..e917ae1 100644 --- a/gdb/dwarf2/cu.h +++ b/gdb/dwarf2/cu.h @@ -172,7 +172,7 @@ public: std::vector<delayed_method_info> method_list; /* To be copied to symtab->call_site_htab. */ - htab_up call_site_htab; + call_site_htab_t call_site_htab; /* Non-NULL if this CU came from a DWO file. There is an invariant here that is important to remember: diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 4813dc2..227ad19 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -10183,7 +10183,6 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) struct objfile *objfile = per_objfile->objfile; struct gdbarch *gdbarch = objfile->arch (); struct attribute *attr; - void **slot; int nparams; struct die_info *child_die; @@ -10203,21 +10202,6 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) } unrelocated_addr pc = attr->as_address (); - if (cu->call_site_htab == nullptr) - cu->call_site_htab.reset (htab_create_alloc (16, call_site::hash, - call_site::eq, nullptr, - xcalloc, xfree)); - struct call_site call_site_local (pc, nullptr, nullptr); - slot = htab_find_slot (cu->call_site_htab.get (), &call_site_local, INSERT); - if (*slot != NULL) - { - complaint (_("Duplicate PC %s for DW_TAG_call_site " - "DIE %s [in module %s]"), - paddress (gdbarch, (CORE_ADDR) pc), sect_offset_str (die->sect_off), - objfile_name (objfile)); - return; - } - /* Count parameters at the caller. */ nparams = 0; @@ -10242,7 +10226,16 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) struct call_site, sizeof (*call_site) + sizeof (call_site->parameter[0]) * nparams)) struct call_site (pc, cu->per_cu, per_objfile); - *slot = call_site; + + bool inserted = cu->call_site_htab.emplace (pc, call_site).second; + if (!inserted) + { + complaint (_("Duplicate PC %s for DW_TAG_call_site " + "DIE %s [in module %s]"), + paddress (gdbarch, (CORE_ADDR) pc), sect_offset_str (die->sect_off), + objfile_name (objfile)); + return; + } /* We never call the destructor of call_site, so we must ensure it is trivially destructible. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index ce5e252..bde5371 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -396,17 +396,10 @@ linetable_entry::pc (const struct objfile *objfile) const call_site * compunit_symtab::find_call_site (CORE_ADDR pc) const { - if (m_call_site_htab == nullptr) - return nullptr; - CORE_ADDR delta = this->objfile ()->text_section_offset (); - unrelocated_addr unrelocated_pc = (unrelocated_addr) (pc - delta); - - struct call_site call_site_local (unrelocated_pc, nullptr, nullptr); - void **slot - = htab_find_slot (m_call_site_htab, &call_site_local, NO_INSERT); - if (slot != nullptr) - return (call_site *) *slot; + auto it = m_call_site_htab->find (static_cast<unrelocated_addr> (pc - delta)); + if (it != m_call_site_htab->end ()) + return it->second; /* See if the arch knows another PC we should try. On some platforms, GCC emits a DWARF call site that is offset from the @@ -416,22 +409,20 @@ compunit_symtab::find_call_site (CORE_ADDR pc) const if (pc == new_pc) return nullptr; - unrelocated_pc = (unrelocated_addr) (new_pc - delta); - call_site new_call_site_local (unrelocated_pc, nullptr, nullptr); - slot = htab_find_slot (m_call_site_htab, &new_call_site_local, NO_INSERT); - if (slot == nullptr) - return nullptr; + it = m_call_site_htab->find (static_cast<unrelocated_addr> (new_pc - delta)); + if (it != m_call_site_htab->end ()) + return it->second; - return (call_site *) *slot; + return nullptr; } /* See symtab.h. */ void -compunit_symtab::set_call_site_htab (htab_up call_site_htab) +compunit_symtab::set_call_site_htab (call_site_htab_t &&call_site_htab) { gdb_assert (m_call_site_htab == nullptr); - m_call_site_htab = call_site_htab.release (); + m_call_site_htab = new call_site_htab_t (std::move (call_site_htab)); } /* See symtab.h. */ @@ -500,8 +491,7 @@ void compunit_symtab::finalize () { this->forget_cached_source_info (); - if (m_call_site_htab != nullptr) - htab_delete (m_call_site_htab); + delete m_call_site_htab; } /* The relocated address of the minimal symbol, using the section diff --git a/gdb/symtab.h b/gdb/symtab.h index 4197a3a..68df6ab 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -24,6 +24,7 @@ #include <vector> #include <string> #include <set> +#include "dwarf2/call-site.h" #include "gdbsupport/gdb_vecs.h" #include "gdbtypes.h" #include "gdbsupport/gdb_obstack.h" @@ -1957,7 +1958,7 @@ struct compunit_symtab symtab *primary_filetab () const; /* Set m_call_site_htab. */ - void set_call_site_htab (htab_up call_site_htab); + void set_call_site_htab (call_site_htab_t &&call_site_htab); /* Find call_site info for PC. */ call_site *find_call_site (CORE_ADDR pc) const; @@ -2024,7 +2025,7 @@ struct compunit_symtab unsigned int m_epilogue_unwind_valid : 1; /* struct call_site entries for this compilation unit or NULL. */ - htab_t m_call_site_htab; + call_site_htab_t *m_call_site_htab; /* The macro table for this symtab. Like the blockvector, this is shared between different symtabs in a given compilation unit. |