public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
From: "vries at gcc dot gnu.org" <sourceware-bugzilla@sourceware.org>
To: gdb-prs@sourceware.org
Subject: [Bug symtab/28200] New: DW_AT_ranges handling in partial_die_info::read does not handle discontinuous ranges
Date: Fri, 06 Aug 2021 11:03:49 +0000	[thread overview]
Message-ID: <bug-28200-4717@http.sourceware.org/bugzilla/> (raw)

https://sourceware.org/bugzilla/show_bug.cgi?id=28200

            Bug ID: 28200
           Summary: DW_AT_ranges handling in partial_die_info::read does
                    not handle discontinuous ranges
           Product: gdb
           Version: HEAD
            Status: NEW
          Severity: normal
          Priority: P2
         Component: symtab
          Assignee: unassigned at sourceware dot org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

Created attachment 13596
  --> https://sourceware.org/bugzilla/attachment.cgi?id=13596&action=edit
Test-case patch

[ Spinoff from PR28004. ]

Consider test-case dw2-ranges-psym/dw2-ranges-psym.exp.

Say we split up the range $foo_low_start $foo_low_end in two ranges:
...
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-psym.exp
b/gdb/testsuite/gdb.dwarf2/dw2-ranges-
psym.exp
index 3ad2d1c567c..84c9d87adfd 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ranges-psym.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-psym.exp
@@ -109,11 +109,13 @@ Dwarf::assemble $asm_file {
     ranges {is_64 [is_64_target]} {
        func_ranges_label: sequence {
            range $foo_start $foo_end
-           range $foo_low_start $foo_low_end
+           range $foo_low_start "$foo_low_start + 1"
+           range "$foo_low_start + 1" $foo_low_end
        }
        cu_ranges_label: sequence {
            range $foo_start $foo_end
-           range $foo_low_start $foo_low_end
+           range $foo_low_start "$foo_low_start + 1"
+           range "$foo_low_start + 1" $foo_low_end
            range $bar_start $bar_end
            range $baz_start $baz_end
        }
...

When printing the partial symbols:
...
$ gdb -q -batch outputs/gdb.dwarf2/dw2-ranges-psym/dw2-ranges-psym -ex "maint
print psymbols"
...
we find for CU dw-ranges-psym.c the address map, a single range:
...
  Address map:
    0x4004b2 0x383f140
    0x4004e7 <ends here>
...

Now say we remove the range range "$foo_low_start + 1" $foo_low_end from the cu
ranges.  Consequently the CU address map changes:
...
  Address map:
    0x4004b2 0x2c65140
    0x4004ba <ends here>
    0x4004c5 0x2c65140
    0x4004e7 <ends here>
...
and there's a hole at [0x4004ba - 0x4004c5).

Now say we remove the DW_AT_ranges for the CU, we get back:
...
  Address map:
    0x4004b2 0x391df20
    0x4004e7 <ends here>
...
What happens here, is that gdb puts together the address map from the
functions, triggered by this code in process_psymtab_comp_unit_reader being
called with cu_bounds_kind == PC_BOUNDS_INVALID, which sets the set_addrmap
argument to 1:
...
          scan_partial_symbols (first_die, &lowpc, &highpc,
                                cu_bounds_kind <= PC_BOUNDS_INVALID, cu);
...

Now say we remove the same range from the ranges for the function someothername
(an alias for foo). We get the address map:
...
  Address map:
    0x4004b2 0x3b69140
    0x4004e7 <ends here>
...

This is incorrect, the hole is missing.

This is caused by this code in partial_die_info::read:
...
            if (dwarf2_ranges_read (ranges_offset, &lowpc, &highpc, cu,
                                    nullptr, tag))
              has_pc_info = 1;
...
which pretends that the function is located at addresses lowpc...highpc, which
is indeed not the case.

Using attached test-case patch, we modify the test-case a bit more to get:
...
(gdb) bt
warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

#0  0x00000000004004bb in baz ()
warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x4004c6 in read in psymtab, but not in symtab.)

#1  0x00000000004004c7 in foo_low (warning: (Internal error: pc 0x4004c6 in
read in psymtab, but not in symtab.)

)
#2  0x00000000004004e9 in someothername ()
#3  0x00000000004004b0 in main ()
(gdb) PASS: gdb.dwarf2/dw2-ranges-psym.exp: bt
...

The warning complains about the fact that a pc in the range that was removed
can be found in the psymtab (due to the bug described above) but cannot be
found in the corresponding symtab (because that one accurately handles
discontinuous ranges).

-- 
You are receiving this mail because:
You are on the CC list for the bug.

             reply	other threads:[~2021-08-06 11:03 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-06 11:03 vries at gcc dot gnu.org [this message]
2021-08-06 11:04 ` [Bug symtab/28200] " vries at gcc dot gnu.org
2021-08-06 11:18 ` vries at gcc dot gnu.org
2021-08-06 11:57 ` vries at gcc dot gnu.org
2021-08-06 13:18 ` simark at simark dot ca
2021-08-06 14:23 ` vries at gcc dot gnu.org
2021-08-06 14:28 ` vries at gcc dot gnu.org
2021-08-06 15:44 ` simark at simark dot ca
2021-08-06 15:57 ` vries at gcc dot gnu.org
2021-08-06 16:46 ` simark at simark dot ca
2021-08-10 13:38 ` vries at gcc dot gnu.org
2021-08-10 15:06 ` vries at gcc dot gnu.org
2021-08-10 15:06 ` vries at gcc dot gnu.org
2021-08-24 14:29 ` brobecker at gnat dot com
2021-08-24 14:58 ` vries at gcc dot gnu.org
2021-09-14 12:41 ` cvs-commit at gcc dot gnu.org
2021-09-14 12:56 ` vries at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-28200-4717@http.sourceware.org/bugzilla/ \
    --to=sourceware-bugzilla@sourceware.org \
    --cc=gdb-prs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).