Patchwork Fix PR57451 (Incorrect debug ranges emitted for -freorder-blocks-and-partition -g)

login
register
mail settings
Submitter Teresa Johnson
Date Aug. 12, 2013, 4:35 a.m.
Message ID <CAAe5K+X+iEwyuGH3=1nii3YDoni3-XeO_v4RVSL+Mfb=SpQSqA@mail.gmail.com>
Download mbox | patch
Permalink /patch/266414/
State New
Headers show

Comments

Teresa Johnson - Aug. 12, 2013, 4:35 a.m.
This patch fixes PR rtl-optimizations/57451 by preventing scopes and
therefore lexical blocks from crossing split section boundaries.
This will prevent debug info generation from using DW_AT_low_pc/high_pc
pairs across the section boundary.

Bootstrapped and tested on x86_64-unknown-linux-gnu. With this patch,
a profilebootstrap with -freorder-blocks-and-partition force-enabled
also passes. Ok for trunk?

Thanks,
Teresa

2013-08-11  Teresa Johnson  <tejohnson@google.com>

        PR rtl-optimizations/57451
        * final.c (reemit_insn_block_notes): Prevent lexical blocks
        from crossing split section boundaries.
Teresa Johnson - Aug. 19, 2013, 6:34 p.m.
Ping.
Thanks,
Teresa

On Sun, Aug 11, 2013 at 9:35 PM, Teresa Johnson <tejohnson@google.com> wrote:
> This patch fixes PR rtl-optimizations/57451 by preventing scopes and
> therefore lexical blocks from crossing split section boundaries.
> This will prevent debug info generation from using DW_AT_low_pc/high_pc
> pairs across the section boundary.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu. With this patch,
> a profilebootstrap with -freorder-blocks-and-partition force-enabled
> also passes. Ok for trunk?
>
> Thanks,
> Teresa
>
> 2013-08-11  Teresa Johnson  <tejohnson@google.com>
>
>         PR rtl-optimizations/57451
>         * final.c (reemit_insn_block_notes): Prevent lexical blocks
>         from crossing split section boundaries.
>
> Index: final.c
> ===================================================================
> --- final.c     (revision 201644)
> +++ final.c     (working copy)
> @@ -1650,12 +1650,26 @@ reemit_insn_block_notes (void)
>    rtx insn, note;
>
>    insn = get_insns ();
> -  if (!active_insn_p (insn))
> -    insn = next_active_insn (insn);
> -  for (; insn; insn = next_active_insn (insn))
> +  for (; insn; insn = next_insn (insn))
>      {
>        tree this_block;
>
> +      /* Prevent lexical blocks from straddling section boundaries.  */
> +      if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
> +        {
> +          for (tree s = cur_block; s != DECL_INITIAL (cfun->decl);
> +               s = BLOCK_SUPERCONTEXT (s))
> +            {
> +              rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
> +              NOTE_BLOCK (note) = s;
> +              note = emit_note_after (NOTE_INSN_BLOCK_BEG, insn);
> +              NOTE_BLOCK (note) = s;
> +            }
> +        }
> +
> +      if (!active_insn_p (insn))
> +        continue;
> +
>        /* Avoid putting scope notes between jump table and its label.  */
>        if (JUMP_TABLE_DATA_P (insn))
>         continue;
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Jeff Law - Aug. 19, 2013, 6:44 p.m.
On 08/19/2013 12:34 PM, Teresa Johnson wrote:
> Ping.
> Thanks,
> Teresa
>
> On Sun, Aug 11, 2013 at 9:35 PM, Teresa Johnson <tejohnson@google.com> wrote:
>> This patch fixes PR rtl-optimizations/57451 by preventing scopes and
>> therefore lexical blocks from crossing split section boundaries.
>> This will prevent debug info generation from using DW_AT_low_pc/high_pc
>> pairs across the section boundary.
>>
>> Bootstrapped and tested on x86_64-unknown-linux-gnu. With this patch,
>> a profilebootstrap with -freorder-blocks-and-partition force-enabled
>> also passes. Ok for trunk?
>>
>> Thanks,
>> Teresa
>>
>> 2013-08-11  Teresa Johnson  <tejohnson@google.com>
>>
>>          PR rtl-optimizations/57451
>>          * final.c (reemit_insn_block_notes): Prevent lexical blocks
>>          from crossing split section boundaries.
This is fine.  Is there any way you can turn the steps mentioned in 
57451 into a dejagnu testcase?  Clearly it would only work in a native 
configuration due to the need to run the instrumented program.

jeff
Teresa Johnson - Aug. 20, 2013, 12:01 a.m.
On Mon, Aug 19, 2013 at 11:44 AM, Jeff Law <law@redhat.com> wrote:
> On 08/19/2013 12:34 PM, Teresa Johnson wrote:
>>
>> Ping.
>> Thanks,
>> Teresa
>>
>> On Sun, Aug 11, 2013 at 9:35 PM, Teresa Johnson <tejohnson@google.com>
>> wrote:
>>>
>>> This patch fixes PR rtl-optimizations/57451 by preventing scopes and
>>> therefore lexical blocks from crossing split section boundaries.
>>> This will prevent debug info generation from using DW_AT_low_pc/high_pc
>>> pairs across the section boundary.
>>>
>>> Bootstrapped and tested on x86_64-unknown-linux-gnu. With this patch,
>>> a profilebootstrap with -freorder-blocks-and-partition force-enabled
>>> also passes. Ok for trunk?
>>>
>>> Thanks,
>>> Teresa
>>>
>>> 2013-08-11  Teresa Johnson  <tejohnson@google.com>
>>>
>>>          PR rtl-optimizations/57451
>>>          * final.c (reemit_insn_block_notes): Prevent lexical blocks
>>>          from crossing split section boundaries.
>
> This is fine.  Is there any way you can turn the steps mentioned in 57451
> into a dejagnu testcase?  Clearly it would only work in a native
> configuration due to the need to run the instrumented program.

Since this was a compile-time failure (link-time actually), I could
just take the existing test case mentioned there and turn it into a
"-g -freorder-blocks-and-partition" test (probably by cloning as a new
test case the g++.dg/tree-prof testsuite directory). Does that seem
reasonable?

Thanks,
Teresa

>
> jeff
>

Patch

Index: final.c
===================================================================
--- final.c     (revision 201644)
+++ final.c     (working copy)
@@ -1650,12 +1650,26 @@  reemit_insn_block_notes (void)
   rtx insn, note;

   insn = get_insns ();
-  if (!active_insn_p (insn))
-    insn = next_active_insn (insn);
-  for (; insn; insn = next_active_insn (insn))
+  for (; insn; insn = next_insn (insn))
     {
       tree this_block;

+      /* Prevent lexical blocks from straddling section boundaries.  */
+      if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
+        {
+          for (tree s = cur_block; s != DECL_INITIAL (cfun->decl);
+               s = BLOCK_SUPERCONTEXT (s))
+            {
+              rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
+              NOTE_BLOCK (note) = s;
+              note = emit_note_after (NOTE_INSN_BLOCK_BEG, insn);
+              NOTE_BLOCK (note) = s;
+            }
+        }
+
+      if (!active_insn_p (insn))
+        continue;
+
       /* Avoid putting scope notes between jump table and its label.  */
       if (JUMP_TABLE_DATA_P (insn))
        continue;