dwarf2out: Fix -gsplit-dwarf on riscv [PR103874]
authorJakub Jelinek <jakub@redhat.com>
Thu, 20 Jan 2022 10:58:20 +0000 (11:58 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 20 Jan 2022 10:58:20 +0000 (11:58 +0100)
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.

gcc/dwarf2out.cc
gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c [new file with mode: 0644]

index f3bd322..a5a7f63 100644 (file)
@@ -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 (file)
index 0000000..2f0e2d4
--- /dev/null
@@ -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 ();
+  }
+}