[gdb/testsuite] Fix psymtab expansion postponement in c-linkage-name.exp

Message ID 20200228121132.GA23227@delia
State New, archived
Headers

Commit Message

Tom de Vries Feb. 28, 2020, 12:11 p.m. UTC
  Hi,

The test-case gdb.base/c-linkage-name.exp starts with the following test:
...
gdb_test "print symada__cS" \
         " = {a = 100829103}" \
         "print symada__cS before partial symtab expansion"
...

However, printing the state of the partial symtabs using maint info psymtabs
show that in fact the symtab has already been expanded:
...
  { psymtab c-linkage-name.c ((struct partial_symtab *) 0x1e27b40)^M
    readin yes^M
...

This is due to set_initial_language, which looks up the main symbol, which
expands the psymtab containing main.

Fix this by moving all but main into a separate source file c-linkage-name-2.c.

Tested on x86_64-linux.

OK for trunk?

Thanks,
- Tom

[gdb/testsuite] Fix psymtab expansion postponement in c-linkage-name.exp

gdb/testsuite/ChangeLog:

2020-02-28  Tom de Vries  <tdevries@suse.de>

	* gdb.base/c-linkage-name.c (main): Call do_something_other_cu.
	(struct wrapper, do_something, mundane/symada__cS): Move ...
	* gdb.base/c-linkage-name-2.c: ... here.  New source file.
	* gdb.base/c-linkage-name.exp: Add verification of psymtab expansion.
	Update "print symada__cS before partial symtab expansion" regexp.
	Update breakpoint location.  Flush symbol cache after expansion.

---
 gdb/testsuite/gdb.base/c-linkage-name-2.c | 45 +++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.base/c-linkage-name.c   | 23 ++--------------
 gdb/testsuite/gdb.base/c-linkage-name.exp | 38 ++++++++++++++++++++++----
 3 files changed, 80 insertions(+), 26 deletions(-)
  

Comments

Tom Tromey Feb. 28, 2020, 2:50 p.m. UTC | #1
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> This is due to set_initial_language, which looks up the main symbol, which
Tom> expands the psymtab containing main.

Tom> Fix this by moving all but main into a separate source file c-linkage-name-2.c.

Tom> Tested on x86_64-linux.

Tom> OK for trunk?

Yes, thank you.

Tom
  

Patch

diff --git a/gdb/testsuite/gdb.base/c-linkage-name-2.c b/gdb/testsuite/gdb.base/c-linkage-name-2.c
new file mode 100644
index 0000000000..da56fc1e09
--- /dev/null
+++ b/gdb/testsuite/gdb.base/c-linkage-name-2.c
@@ -0,0 +1,45 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2018-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/>.  */
+
+struct wrapper
+{
+  int a;
+};
+
+/* Create a global variable whose name in the assembly code
+   (aka the "linkage name") is different from the name in
+   the source code.  The goal is to create a symbol described
+   in DWARF using a DW_AT_linkage_name attribute, with a name
+   which follows the C++ mangling.
+
+   In this particular case, we chose "symada__cS" which, if it were
+   demangled, would translate to "symada (char, signed)".  */
+struct wrapper mundane asm ("symada__cS") = {0x060287af};
+
+void
+do_something (struct wrapper *w)
+{
+  w->a++;
+}
+
+extern void do_something_other_cu (void);
+
+void
+do_something_other_cu (void)
+{
+  do_something (&mundane);
+}
diff --git a/gdb/testsuite/gdb.base/c-linkage-name.c b/gdb/testsuite/gdb.base/c-linkage-name.c
index 490b698a6c..40f00cce7a 100644
--- a/gdb/testsuite/gdb.base/c-linkage-name.c
+++ b/gdb/testsuite/gdb.base/c-linkage-name.c
@@ -15,30 +15,11 @@ 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-struct wrapper
-{
-  int a;
-};
-
-/* Create a global variable whose name in the assembly code
-   (aka the "linkage name") is different from the name in
-   the source code.  The goal is to create a symbol described
-   in DWARF using a DW_AT_linkage_name attribute, with a name
-   which follows the C++ mangling.
-
-   In this particular case, we chose "symada__cS" which, if it were
-   demangled, would translate to "symada (char, signed)".  */
-struct wrapper mundane asm ("symada__cS") = {0x060287af};
-
-void
-do_something (struct wrapper *w)
-{
-  w->a++;
-}
+extern void do_something_other_cu (void);
 
 int
 main (void)
 {
-  do_something (&mundane);
+  do_something_other_cu ();
   return 0;
 }
diff --git a/gdb/testsuite/gdb.base/c-linkage-name.exp b/gdb/testsuite/gdb.base/c-linkage-name.exp
index 235ca605e7..4551c8dcac 100644
--- a/gdb/testsuite/gdb.base/c-linkage-name.exp
+++ b/gdb/testsuite/gdb.base/c-linkage-name.exp
@@ -17,27 +17,55 @@ 
 # gdb can correctly print arrays with indexes for each element of the
 # array.
 
-standard_testfile .c
+standard_testfile c-linkage-name.c c-linkage-name-2.c
 
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+set sources "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile2}"
+if { [gdb_compile "${sources}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     return -1
 }
 
 clean_restart ${binfile}
 
+# Verify that partial symtab expansion for $filename has state $readin
+
+proc verify_psymtab_expanded { filename readin } {
+    set cmd "maint info psymtab"
+    set test "$cmd: $filename: $readin"
+    set re [multi_line \
+		"  \{ psymtab \[^\r\n\]*$filename\[^\r\n\]*" \
+		"    readin $readin" \
+		".*"]
+
+    gdb_test $cmd $re $test
+}
+
+# Verify that partial symtab expansion has not taken place for
+# c-linkage-name-2.c.
+
+verify_psymtab_expanded c-linkage-name-2.c no
+
 # Try to print MUNDANE, but using its linkage name.
 
 gdb_test "print symada__cS" \
-         " = {a = 100829103}" \
+         "'symada__cS' has unknown type; cast it to its declared type" \
          "print symada__cS before partial symtab expansion"
 
 # Force the symbols to be expanded for the unit that contains
 # our symada__cS symbol by, e.g. inserting a breakpoint on one
 # of the founction also provided by the same using.
 
-gdb_test "break main" \
-         "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal\\."
+gdb_test "break do_something_other_cu" \
+         "Breakpoint $decimal at $hex: file .*$srcfile2, line $decimal\\."
+
+# Verify that partial symtab expansion has taken place for
+# c-linkage-name-2.c.
+
+verify_psymtab_expanded c-linkage-name-2.c yes
+
+# Flush the symbol cache to prevent the lookup to return the same as before.
+
+gdb_test "maint flush-symbol-cache"
 
 # Try to print MUNDANE using its linkage name again, after partial
 # symtab expansion.