Don't call compute_and_set_names for partial symbols
authorTom Tromey <tom@tromey.com>
Fri, 24 Apr 2020 21:35:01 +0000 (15:35 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 24 Apr 2020 21:35:03 +0000 (15:35 -0600)
As mentioned in another thread, there's currently no need to call
compute_and_set_names for partial symbols.  Because the DWARF partial
symbol reader constructs demangled names, this call can only demangle
a name by mistake.

So, this patch changes the DWARF reader to simply set the linkage name
on the new symbol.  This is equivalent to what was done before.  There
should be no user-visible change from this patch, aside from gdb
speeding up a bit.

... there *should* be, but this regressed
dw2-namespaceless-anonymous.exp.  However, upon examination, I think
that test is incorrect.  It puts a mangled name into DW_AT_name, and
it puts the variable at the top level, not in a namespace.  This isn't
what C++ compilers ought to do.  So, this patch also updates the test
case.

gdb/ChangeLog
2020-04-24  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (add_partial_symbol): Do not call
compute_and_set_names.

gdb/testsuite/ChangeLog
2020-04-24  Tom Tromey  <tom@tromey.com>

* gdb.dwarf2/dw2-namespaceless-anonymous.S: Remove.
* gdb.dwarf2/dw2-namespaceless-anonymous.c: New file.
* gdb.dwarf2/dw2-namespaceless-anonymous.exp: Use DWARF
assembler.

gdb/ChangeLog
gdb/dwarf2/read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.S [deleted file]
gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.c [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.exp

index bf96cfec4e397e407a5864abfcc74f5c67df6b7d..5544993af803ead775b502f4797d82825600fbb0 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-24  Tom Tromey  <tom@tromey.com>
+
+       * dwarf2/read.c (add_partial_symbol): Do not call
+       compute_and_set_names.
+
 2020-04-24  Tom Tromey  <tom@tromey.com>
 
        * dwarf2/read.c (add_partial_symbol): Use new add_psymbol_to_list
index ddf4b5b1e2842d612c49480a39104e8242194c52..d71bf9173838b245b25a856dc3e78422af685a6b 100644 (file)
@@ -8376,9 +8376,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
 
   if (where.has_value ())
     {
-      psymbol.ginfo.compute_and_set_names (actual_name,
-                                          built_actual_name != nullptr,
-                                          objfile->per_bfd);
+      if (built_actual_name != nullptr)
+       actual_name = objfile->intern (actual_name);
+      psymbol.ginfo.set_linkage_name (actual_name);
       add_psymbol_to_list (psymbol, *where, objfile);
     }
 }
index ba79290e114c8b65a2223fe90bcbd9c7c235711a..5c4dc6efa39cf7cf123312985bafe2525772c854 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-24  Tom Tromey  <tom@tromey.com>
+
+       * gdb.dwarf2/dw2-namespaceless-anonymous.S: Remove.
+       * gdb.dwarf2/dw2-namespaceless-anonymous.c: New file.
+       * gdb.dwarf2/dw2-namespaceless-anonymous.exp: Use DWARF
+       assembler.
+
 2020-04-24  Tom de Vries  <tdevries@suse.de>
 
        * gdb.dwarf2/dw2-bad-mips-linkage-name.exp: Set language of CU to
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.S b/gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.S
deleted file mode 100644 (file)
index e5b1d66..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/* This testcase is part of GDB, the GNU debugger.
-
-   Copyright 2012-2020 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-       .data
-var:   .4byte  1
-
-       .section .debug_info
-.Lcu1_begin:
-       /* CU header */
-       .4byte  .Lcu1_end - .Lcu1_start         /* Length of Compilation Unit */
-.Lcu1_start:
-       .2byte  2                               /* DWARF Version */
-       .4byte  .Labbrev1_begin                 /* Offset into abbrev section */
-       .byte   4                               /* Pointer size */
-
-       /* CU die */
-       .uleb128 1                              /* Abbrev: DW_TAG_compile_unit */
-       .ascii  "file1.txt\0"                   /* DW_AT_name */
-       .ascii  "GNU C 3.3.3\0"                 /* DW_AT_producer */
-       .byte   4                               /* DW_LANG_C_plus_plus (C++) */
-
-.Ltype_myint:
-       .uleb128        2                       /* Abbrev: DW_TAG_base_type */
-       .ascii          "myint\0"                       /* DW_AT_name */
-       .byte           4                       /* DW_AT_byte_size */
-       .byte           5                       /* DW_AT_encoding */
-
-       .uleb128        7                       /* Abbrev: DW_TAG_variable (location) */
-       .ascii          "_ZN12_GLOBAL__N_11vE\0" /* DW_AT_name = "(anonymous namespace)::v" */
-       .byte           2f - 1f                 /* DW_AT_location */
-1:     .byte           3                       /*   DW_OP_addr */
-       .4byte          var                     /*   <addr> */
-2:     .4byte          .Ltype_myint-.Lcu1_begin /* DW_AT_type */
-
-       .byte           0                       /* End of children of CU */
-
-.Lcu1_end:
-
-/* Abbrev table */
-       .section .debug_abbrev
-.Labbrev1_begin:
-       .uleb128        1                       /* Abbrev code */
-       .uleb128        0x11                    /* DW_TAG_compile_unit */
-       .byte           1                       /* has_children */
-       .uleb128        0x3                     /* DW_AT_name */
-       .uleb128        0x8                     /* DW_FORM_string */
-       .uleb128        0x25                    /* DW_AT_producer */
-       .uleb128        0x8                     /* DW_FORM_string */
-       .uleb128        0x13                    /* DW_AT_language */
-       .uleb128        0xb                     /* DW_FORM_data1 */
-       .byte           0x0                     /* Terminator */
-       .byte           0x0                     /* Terminator */
-
-       .uleb128        2                       /* Abbrev code */
-       .uleb128        0x24                    /* DW_TAG_base_type */
-       .byte           0                       /* has_children */
-       .uleb128        0x3                     /* DW_AT_name */
-       .uleb128        0x8                     /* DW_FORM_string */
-       .uleb128        0xb                     /* DW_AT_byte_size */
-       .uleb128        0xb                     /* DW_FORM_data1 */
-       .uleb128        0x3e                    /* DW_AT_encoding */
-       .uleb128        0xb                     /* DW_FORM_data1 */
-       .byte           0x0                     /* Terminator */
-       .byte           0x0                     /* Terminator */
-
-       .uleb128        7                       /* Abbrev code (location) */
-       .uleb128        0x34                    /* DW_TAG_variable */
-       .byte           0                       /* has_children */
-       .uleb128        0x3                     /* DW_AT_name */
-       .uleb128        0x8                     /* DW_FORM_string */
-       .uleb128        0x2                     /* DW_AT_location */
-       .uleb128        0xa                     /* DW_FORM_block1 */
-       .uleb128        0x49                    /* DW_AT_type */
-       .uleb128        0x13                    /* DW_FORM_ref4 */
-       .byte           0x0                     /* Terminator */
-       .byte           0x0                     /* Terminator */
-
-       .byte           0x0                     /* Terminator */
-       .byte           0x0                     /* Terminator */
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.c b/gdb/testsuite/gdb.dwarf2/dw2-namespaceless-anonymous.c
new file mode 100644 (file)
index 0000000..3c5e258
--- /dev/null
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+char _ZN12_GLOBAL__N_11vE = 1;
+
+int main ()
+{
+}
index 1edc468d62f25001e2bc5367877fdce3501d9428..5b61a6ba92889cb3b2c9c9918a803968c0a813e6 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 load_lib dwarf.exp
 
+load_lib dwarf.exp
+
 # This test can only be run on targets which support DWARF-2 and use gas.
 if {![dwarf2_support]} {
     return 0  
 }
 
-standard_testfile .S
+standard_testfile dw2-namespaceless-anonymous.c dw2-namespaceless-anonymous.S
 
-if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" $binfile \
-          object {nodebug}] != "" } {
-    return -1
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    global srcdir subdir srcfile
+
+    cu {} {
+       DW_TAG_compile_unit {
+           {DW_AT_language @DW_LANG_C_plus_plus}
+           {DW_AT_name     dw2-namespaceless-anonymous.c}
+           {DW_AT_comp_dir /tmp}
+       } {
+           declare_labels myint
+
+           myint: DW_TAG_base_type {
+               {DW_AT_byte_size 1 DW_FORM_sdata}
+               {DW_AT_encoding  @DW_ATE_signed}
+               {DW_AT_name      myint}
+           }
+
+           DW_TAG_namespace {} {
+               DW_TAG_variable {
+                   {DW_AT_name v}
+                   {DW_AT_linkage_name _ZN12_GLOBAL__N_11vE}
+                   {DW_AT_location {
+                       DW_OP_addr [gdb_target_symbol _ZN12_GLOBAL__N_11vE]
+                   } SPECIAL_expr}
+                   {DW_AT_type :$myint}
+               }
+           }
+       }
+    }
 }
 
-clean_restart $testfile
+if {[prepare_for_testing ${testfile}.exp ${testfile} \
+        [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
 
 gdb_test "ptype '(anonymous namespace)::v'" "type = myint"
-gdb_test "p '(anonymous namespace)::v'" " = 1"
+gdb_test "p/d '(anonymous namespace)::v'" " = 1"