public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] [gdb/symtab] Add call_site_eq and call_site_hash
@ 2021-10-04 16:16 Tom de Vries
  0 siblings, 0 replies; only message in thread
From: Tom de Vries @ 2021-10-04 16:16 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0dd8295da24ae58c1e808b906b7c0aafea22a259

commit 0dd8295da24ae58c1e808b906b7c0aafea22a259
Author: Tom de Vries <tdevries@suse.de>
Date:   Mon Oct 4 18:16:40 2021 +0200

    [gdb/symtab] Add call_site_eq and call_site_hash
    
    In commit b4c919f7525 "[gdb/symtab] Fix htab_find_slot call in
    read_call_site_scope" , I removed the comment:
    ...
    It must be the first field as we overload core_addr_hash and core_addr_eq for
    it.
    ...
    for field pc of struct call_site.
    
    However, this was not tested, and when indeed moving field pc to the second
    location, we run into a testsuite failure in gdb.trace/entry-values.exp.
    
    This is caused by core_addr_eq (the eq_f function for the htab) being
    called with a pointer to the pc field (as passed into htab_find_slot) and a
    pointer to a hash table element.  Now that pc is no longer the first field,
    the pointer to hash table element no longer points to the pc field.
    
    This could be fixed by simply reinstating the comment, but we're trying to
    get rid of this kind of tricks that make refactoring more difficult.
    
    Instead, fix this by:
    - reverting commit b4c919f7525, apart from the comment removal, such that
      we're passing a pointer to element to htab_find_slot
    - updating the htab_find_slot call in compunit_symtab::find_call_site
      in a similar manner
    - adding a call_site_eq and call_site_hash, and using these in the hash table
      instead of core_addr_eq and core_addr_hash.
    
    Tested on x86_64-linux, both with and without a trigger patch that moves pc to
    the second location in struct call_site.

Diff:
---
 gdb/dwarf2/read.c |  7 ++++---
 gdb/gdbtypes.h    | 15 +++++++++++++++
 gdb/symtab.c      |  5 ++++-
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 214810da183..f8421aeb344 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -13341,7 +13341,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
   struct gdbarch *gdbarch = objfile->arch ();
   CORE_ADDR pc, baseaddr;
   struct attribute *attr;
-  struct call_site *call_site;
+  struct call_site *call_site, call_site_local;
   void **slot;
   int nparams;
   struct die_info *child_die;
@@ -13366,10 +13366,11 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
   pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc);
 
   if (cu->call_site_htab == NULL)
-    cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, core_addr_eq,
+    cu->call_site_htab = htab_create_alloc_ex (16, call_site_hash, call_site_eq,
 					       NULL, &objfile->objfile_obstack,
 					       hashtab_obstack_allocate, NULL);
-  slot = htab_find_slot (cu->call_site_htab, &pc, INSERT);
+  call_site_local.pc = pc;
+  slot = htab_find_slot (cu->call_site_htab, &call_site_local, INSERT);
   if (*slot != NULL)
     {
       complaint (_("Duplicate PC %s for DW_TAG_call_site "
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 6d09576208d..8021cb21ecc 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -1824,6 +1824,21 @@ struct call_site
     struct call_site_parameter parameter[1];
   };
 
+static inline int
+call_site_eq (const void *a_, const void *b_)
+{
+  const struct call_site *a = (const call_site *)a_;
+  const struct call_site *b = (const call_site *)b_;
+  return core_addr_eq (&a->pc, &b->pc);
+}
+
+static inline hashval_t
+call_site_hash (const void *a_)
+{
+  const struct call_site *a = (const call_site *)a_;
+  return core_addr_hash (&a->pc);
+}
+
 /* The type-specific info for TYPE_CODE_FIXED_POINT types.  */
 
 struct fixed_point_type_info
diff --git a/gdb/symtab.c b/gdb/symtab.c
index e6851c31e27..bd1eb429b94 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -334,10 +334,13 @@ search_domain_name (enum search_domain e)
 call_site *
 compunit_symtab::find_call_site (CORE_ADDR pc) const
 {
+  struct call_site call_site_local;
   if (m_call_site_htab == nullptr)
     return nullptr;
 
-  void **slot = htab_find_slot (m_call_site_htab, &pc, NO_INSERT);
+  call_site_local.pc = pc;
+  void **slot
+    = htab_find_slot (m_call_site_htab, &call_site_local, NO_INSERT);
   if (slot == nullptr)
     return nullptr;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-10-04 16:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-04 16:16 [binutils-gdb] [gdb/symtab] Add call_site_eq and call_site_hash Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).