This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Introduce dw2_linkage_name and dw2_linkage_name_attr.


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

commit 73b9be8b5301c4ac056e10c38a47414867ee892a
Author: Keith Seitz <keiths@redhat.com>
Date:   Wed Sep 6 12:50:52 2017 -0700

    Introduce dw2_linkage_name and dw2_linkage_name_attr.
    
    The DWARF reader is littered with the following idiom to read a linkage name
    from the debug info:
    
      mangled = dwarf2_string_attr (die, DW_AT_linkage_name, cu);
      if (mangled == NULL)
        mangled = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu);
    
    This patch introduces functions to simplify this to:
    
      mangled = dw2_linkage_name (die, cu);
    
    or
    
      attr = dw2_linkage_name_attr (die, cu);
    
    gdb/ChangeLog:
    
    	* dwarf2read.c (dw2_linkage_name_attr): New function.
    	(dw2_linkage_name): New function.
    	(dwarf2_compute_name, dwarf2_physname, read_call_site_scope)
    	(guess_full_die_structure_name, dwarf2_name): Use dw2_linkage_name.
    	(anonymous_struct_prefix, dwarf2_name): Use dw2_linkage_name_attr.

Diff:
---
 gdb/ChangeLog    |  8 +++++++
 gdb/dwarf2read.c | 64 +++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 46 insertions(+), 26 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ed66547..8080a55 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2017-09-06  Keith Seitz  <keiths@redhat.com>
+
+	* dwarf2read.c (dw2_linkage_name_attr): New function.
+	(dw2_linkage_name): New function.
+	(dwarf2_compute_name, dwarf2_physname, read_call_site_scope)
+	(guess_full_die_structure_name, dwarf2_name): Use dw2_linkage_name.
+	(anonymous_struct_prefix, dwarf2_name): Use dw2_linkage_name_attr.
+
 2017-09-06  Kamil Rytarowski  <n54@gmx.com>
 
 	* config/djgpp/djconfig.sh: Correct shell portability issue.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 6678b33..b3c5fab 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -8732,6 +8732,38 @@ die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu)
     }
 }
 
+/* Return the DIE's linkage name attribute, either DW_AT_linkage_name
+   or DW_AT_MIPS_linkage_name.  Returns NULL if the attribute is not
+   defined for the given DIE.  */
+
+static struct attribute *
+dw2_linkage_name_attr (struct die_info *die, struct dwarf2_cu *cu)
+{
+  struct attribute *attr;
+
+  attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
+  if (attr == NULL)
+    attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
+
+  return attr;
+}
+
+/* Return the DIE's linkage name as a string, either DW_AT_linkage_name
+   or DW_AT_MIPS_linkage_name.  Returns NULL if the attribute is not
+   defined for the given DIE.  */
+
+static const char *
+dw2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
+{
+  const char *linkage_name;
+
+  linkage_name = dwarf2_string_attr (die, DW_AT_linkage_name, cu);
+  if (linkage_name == NULL)
+    linkage_name = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu);
+
+  return linkage_name;
+}
+
 /* Compute the fully qualified name of DIE in CU.  If PHYSNAME is nonzero,
    compute the physname for the object, which include a method's:
    - formal parameters (C++),
@@ -8771,11 +8803,8 @@ dwarf2_compute_name (const char *name,
 	 to be able to reference.  Ideally, we want the user to be able
 	 to reference this entity using either natural or linkage name,
 	 but we haven't started looking at this enhancement yet.  */
-      const char *linkage_name;
+      const char *linkage_name = dw2_linkage_name (die, cu);
 
-      linkage_name = dwarf2_string_attr (die, DW_AT_linkage_name, cu);
-      if (linkage_name == NULL)
-	linkage_name = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu);
       if (linkage_name != NULL)
 	return linkage_name;
     }
@@ -9016,9 +9045,7 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
 
   back_to = make_cleanup (null_cleanup, NULL);
 
-  mangled = dwarf2_string_attr (die, DW_AT_linkage_name, cu);
-  if (mangled == NULL)
-    mangled = dwarf2_string_attr (die, DW_AT_MIPS_linkage_name, cu);
+  mangled = dw2_linkage_name (die, cu);
 
   /* rustc emits invalid values for DW_AT_linkage_name.  Ignore these.
      See https://github.com/rust-lang/rust/issues/32925.  */
@@ -12053,13 +12080,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
 	  const char *target_physname;
 
 	  /* Prefer the mangled name; otherwise compute the demangled one.  */
-	  target_physname = dwarf2_string_attr (target_die,
-						DW_AT_linkage_name,
-						target_cu);
-	  if (target_physname == NULL)
-	    target_physname = dwarf2_string_attr (target_die,
-						 DW_AT_MIPS_linkage_name,
-						 target_cu);
+	  target_physname = dw2_linkage_name (target_die, target_cu);
 	  if (target_physname == NULL)
 	    target_physname = dwarf2_physname (NULL, target_die, target_cu);
 	  if (target_physname == NULL)
@@ -19924,12 +19945,8 @@ guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu)
     {
       if (child->tag == DW_TAG_subprogram)
 	{
-	  const char *linkage_name;
+	  const char *linkage_name = dw2_linkage_name (child, cu);
 
-	  linkage_name = dwarf2_string_attr (child, DW_AT_linkage_name, cu);
-	  if (linkage_name == NULL)
-	    linkage_name = dwarf2_string_attr (child, DW_AT_MIPS_linkage_name,
-	                                       cu);
 	  if (linkage_name != NULL)
 	    {
 	      char *actual_name
@@ -19984,9 +20001,7 @@ anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu)
   if (dwarf2_string_attr (die, DW_AT_name, cu) != NULL)
     return NULL;
 
-  attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
-  if (attr == NULL)
-    attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
+  attr = dw2_linkage_name_attr (die, cu);
   if (attr == NULL || DW_STRING (attr) == NULL)
     return NULL;
 
@@ -20312,10 +20327,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
 	{
 	  char *demangled = NULL;
 
-	  attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
-	  if (attr == NULL)
-	    attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
-
+	  attr = dw2_linkage_name_attr (die, cu);
 	  if (attr == NULL || DW_STRING (attr) == NULL)
 	    return NULL;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]