On Thu, 20 Jan 2022 02:45:53 PST (-0800), gcc-patches@gcc.gnu.org wrote:
Hi!

riscv*-*-* are the only modern targets that !HAVE_AS_LEB128 (apparently
due to some aggressive linker optimizations).

I don't really understand the rest of this, but we do have a subset of LEB128 (constant expressions only). I'm not sure exactly what the requirements are here, but one could imagine extending our assembler support to cover them -- we might never have full support for LEB128 expressions (because of linker relaxation), but we might be able to make more stuff work.

I'm not sure if that helps or hurts, though, as we'll still be a special case.

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.

Fixed thusly, tested on the testcase with x86_64 -> riscv64 cross,
bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2022-01-20  Jakub Jelinek  <ja...@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.jj 2022-01-18 11:58:59.000000000 +0100
+++ gcc/dwarf2out.cc    2022-01-19 13:30:08.936008194 +0100
@@ -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)
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c.jj     2022-01-19 
13:35:25.485631843 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr103874.c        2022-01-19 
13:36:53.608413534 +0100
@@ -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 ();
+  }
+}

        Jakub

Reply via email to