aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-01-20 11:58:20 +0100
committerJakub Jelinek <jakub@redhat.com>2022-01-20 11:58:20 +0100
commit68f03ac49cb4f585dbce78dc9e4c4a9ec950e83c (patch)
tree7e8a00b4649b3b5bbfeff3b6218965d19ffcb696
parent7b78dee64def7e251a1d0678613c8aaabe7b176c (diff)
downloadgcc-68f03ac49cb4f585dbce78dc9e4c4a9ec950e83c.zip
gcc-68f03ac49cb4f585dbce78dc9e4c4a9ec950e83c.tar.gz
gcc-68f03ac49cb4f585dbce78dc9e4c4a9ec950e83c.tar.bz2
dwarf2out: Fix -gsplit-dwarf on riscv [PR103874]
riscv*-*-* are the only modern targets that !HAVE_AS_LEB128 (apparently due to some aggressive linker optimizations). As the following testcase shows, we mishandle in index_rnglists the !HAVE_AS_LEB128 && !have_multiple_function_sections case. output_rnglists does roughly: FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r) { ... if (block_num > 0) { ... if (HAVE_AS_LEB128) { if (!have_multiple_function_sections) { // code not using r->*_entry continue; } // code that sometimes doesn't use r->*_entry, // sometimes r->begin_entry } else if (dwarf_split_debug_info) { // code that uses both r->begin_entry and r->end_entry } else { // code not using r->*_entry } } else if (block_num < 0) { if (!have_multiple_function_sections) gcc_unreachable (); ... } } and index_rnglists is what sets up those r->{begin,end}_entry members. The code did an early if (!have_multiple_function_sections) continue; which is fine for the HAVE_AS_LEB128 case, because r->*_entry is not used in that case, but not for !HAVE_AS_LEB128 that uses it anyway. 2022-01-20 Jakub Jelinek <jakub@redhat.com> PR debug/103874 * dwarf2out.cc (index_rnglists): For !HAVE_AS_LEB128 and block_num > 0, index entry even if !have_multiple_function_sections. * gcc.dg/debug/dwarf2/pr103874.c: New test.
-rw-r--r--gcc/dwarf2out.cc5
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c12
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index f3bd322..a5a7f63 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -12094,9 +12094,10 @@ index_rnglists (void)
if (r->label && r->idx != DW_RANGES_IDX_SKELETON)
r->idx = rnglist_idx++;
- if (!have_multiple_function_sections)
- continue;
int block_num = r->num;
+ if ((HAVE_AS_LEB128 || block_num < 0)
+ && !have_multiple_function_sections)
+ continue;
if (HAVE_AS_LEB128 && (r->label || r->maybe_new_sec))
base = false;
if (block_num > 0)
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c
new file mode 100644
index 0000000..2f0e2d4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c
@@ -0,0 +1,12 @@
+/* PR debug/103874 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -gsplit-dwarf -dA -Wno-implicit-function-declaration" } */
+
+void
+foo (void)
+{
+ {
+ bar ();
+ baz ();
+ }
+}