[gdb/symtab] Fix disassembly of non-contiguous functions
authorTom de Vries <tdevries@suse.de>
Thu, 23 Apr 2020 07:07:50 +0000 (09:07 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 23 Apr 2020 07:07:50 +0000 (09:07 +0200)
When running test-case gdb.dwarf2/dw2-ranges-func.exp with target board
readnow, we have:
...
FAIL: gdb.dwarf2/dw2-ranges-func.exp: disassemble foo (pattern 2)
...

The function foo consists of two ranges:
...
 <1><12f>: Abbrev Number: 7 (DW_TAG_subprogram)
    <130>   DW_AT_external    : 1
    <131>   DW_AT_name        : foo
    <135>   DW_AT_ranges      : 0x40
...
which are listed here:
...
    00000040 00000000004004c1 00000000004004dc
    00000040 00000000004004ae 00000000004004ba
...

Normally the disassemble instruction lists both ranges, but with -readnow it
only lists the first.

This is due to function find_pc_partial_function, which only interacts with
partial symtabs, but not with expanded ones.

Fix this by using find_pc_sect_compunit_symtab in find_pc_partial_function.

Tested on x86_64, with native and target board readnow.

This fixes 19 FAILs for target board readnow, in test-cases
gdb.arch/amd64-entry-value.exp, gdb.base/multi-forks.exp,
gdb.dwarf2/dw2-ranges-func.exp and gdb.linespec/skip-two.exp.

gdb/ChangeLog:

2020-04-23  Tom de Vries  <tdevries@suse.de>

* blockframe.c (find_pc_partial_function): Use
find_pc_sect_compunit_symtab rather than
objfile->sf->qf->find_pc_sect_compunit_symtab.

gdb/ChangeLog
gdb/blockframe.c

index c4b92762330e40bed78a45d5d5f9ee108b4e2a1b..571ca4b2120d824ad481008e355d1a3123de24ae 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-23  Tom de Vries  <tdevries@suse.de>
+
+       * blockframe.c (find_pc_partial_function): Use
+       find_pc_sect_compunit_symtab rather than
+       objfile->sf->qf->find_pc_sect_compunit_symtab.
+
 2020-04-22  Tom de Vries  <tdevries@suse.de>
 
        PR symtab/25764
index 4f8fa42dc6bd0508e84d0df96d73f8d5f4e316e4..09c3eed48db9d4d638befa8b39f84ed690ad10c7 100644 (file)
@@ -236,19 +236,7 @@ find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
     goto return_cached_value;
 
   msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
-  for (objfile *objfile : current_program_space->objfiles ())
-    {
-      if (objfile->sf)
-       {
-         compunit_symtab
-           = objfile->sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol,
-                                                            mapped_pc,
-                                                            section,
-                                                            0);
-       }
-      if (compunit_symtab != NULL)
-       break;
-    }
+  compunit_symtab = find_pc_sect_compunit_symtab (mapped_pc, section);
 
   if (compunit_symtab != NULL)
     {