* [Patch Debug] Emit pubnames for reorder & partition case.
@ 2010-12-20 14:40 IainS
2010-12-20 21:45 ` Richard Henderson
2010-12-23 20:55 ` Mike Stump
0 siblings, 2 replies; 11+ messages in thread
From: IainS @ 2010-12-20 14:40 UTC (permalink / raw)
To: GCC Patches; +Cc: Mike Stump, Jakub Jelinek
[-- Attachment #1: Type: text/plain, Size: 685 bytes --]
At present, pubnames are not emitted when -freorder-blocks-and-
partition is active.
This causes debug linking to fail on Darwin.
The following patch outputs code ranges for Dwarf >=3 and produces a
work-around for Dwarf-2.
With this patch [and the one in http://gcc.gnu.org/ml/gcc-patches/2010-12/msg01553.html
] we can re-enable -freorder-blocks-and-partition on Darwin and debug
works (at least for the partition cases in the test-suite).
OK for trunk?
Iain
gcc:
* dwarf2out.c (gen_subprogram_die): Add pubnames with code ranges for
DWARF >= 3. Add pubnames for the primary section and a reduced DIE for
the secondary code fragment when outputting for DWARF == 2.
[-- Attachment #2: 168084-pub-names.txt --]
[-- Type: text/plain, Size: 6270 bytes --]
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 168084)
+++ gcc/dwarf2out.c (working copy)
@@ -18897,7 +18897,6 @@
static void
gen_subprogram_die (tree decl, dw_die_ref context_die)
{
- char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
tree origin = decl_ultimate_origin (decl);
dw_die_ref subr_die;
tree fn_arg_types;
@@ -19067,12 +19066,24 @@
if (!flag_reorder_blocks_and_partition)
{
- ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
- current_function_funcdef_no);
- add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
- ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
- current_function_funcdef_no);
- add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
+ dw_fde_ref fde = &fde_table[current_funcdef_fde];
+ if (fde->dw_fde_begin)
+ {
+ /* We have already generated the labels. */
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, fde->dw_fde_end);
+ }
+ else
+ {
+ /* Create start/end labels and add the range. */
+ char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
+ ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
+ current_function_funcdef_no);
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
+ ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
+ current_function_funcdef_no);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
+ }
#if VMS_DEBUGGING_INFO
/* HP OpenVMS Industry Standard 64: DWARF Extensions
@@ -19088,8 +19099,6 @@
attributes allow a compiler to communicate the location(s) to use. */
{
- dw_fde_ref fde = &fde_table[current_funcdef_fde];
-
if (fde->dw_fde_vms_end_prologue)
add_AT_vms_delta (subr_die, DW_AT_HP_prologue,
fde->dw_fde_begin, fde->dw_fde_vms_end_prologue);
@@ -19104,19 +19113,116 @@
add_arange (decl, subr_die);
}
else
- { /* Do nothing for now; maybe need to duplicate die, one for
- hot section and one for cold section, then use the hot/cold
- section begin/end labels to generate the aranges... */
- /*
- add_AT_lbl_id (subr_die, DW_AT_low_pc, hot_section_label);
- add_AT_lbl_id (subr_die, DW_AT_high_pc, hot_section_end_label);
- add_AT_lbl_id (subr_die, DW_AT_lo_user, unlikely_section_label);
- add_AT_lbl_id (subr_die, DW_AT_hi_user, cold_section_end_label);
+ { /* Generate pubnames entries for the split function code
+ ranges. */
+ dw_fde_ref fde = &fde_table[current_funcdef_fde];
- add_pubname (decl, subr_die);
- add_arange (decl, subr_die);
- add_arange (decl, subr_die);
- */
+ if (fde->dw_fde_switched_sections)
+ {
+ if (dwarf_version >= 3 || !dwarf_strict)
+ {
+ /* We should use ranges for non-contiguous code section
+ addresses. Use the actual code range for the initial
+ section, since the HOT/COLD labels might precede an
+ alignment offset. */
+ bool range_list_added = false;
+ if (fde->in_std_section)
+ {
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_begin,
+ fde->dw_fde_end,
+ &range_list_added);
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_unlikely_section_label,
+ fde->dw_fde_unlikely_section_end_label,
+ &range_list_added);
+ }
+ else
+ {
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_begin,
+ fde->dw_fde_end,
+ &range_list_added);
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_hot_section_label,
+ fde->dw_fde_hot_section_end_label,
+ &range_list_added);
+ }
+ add_pubname (decl, subr_die);
+ if (range_list_added)
+ add_ranges (NULL);
+ }
+ else
+ {
+ /* There is no real support in DW2 for this .. so we make
+ a work-around. First, emit the pub name for the segment
+ containing the function label. Then make and emit a
+ simplified subprogram DIE for the second segment with the
+ name post-fixed with _$hot$ or _$cold$. We use the same
+ linkage name for the second die so that gdb will find both
+ sections when given "b foo". */
+ const char *name = NULL;
+ tree decl_name = DECL_NAME (decl);
+ dw_die_ref seg_die;
+
+ /* Do the 'primary' section. */
+ add_AT_lbl_id (subr_die, DW_AT_low_pc,
+ fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc,
+ fde->dw_fde_end);
+ /* Add it. */
+ add_pubname (decl, subr_die);
+ add_arange (decl, subr_die);
+
+ /* Build a minimal DIE for the secondary section. */
+ seg_die = new_die (DW_TAG_subprogram,
+ subr_die->die_parent, decl);
+
+ if (TREE_PUBLIC (decl))
+ add_AT_flag (seg_die, DW_AT_external, 1);
+
+ if (decl_name != NULL
+ && IDENTIFIER_POINTER (decl_name) != NULL)
+ {
+ name = dwarf2_name (decl, 1);
+ if (! DECL_ARTIFICIAL (decl))
+ add_src_coords_attributes (seg_die, decl);
+
+ add_linkage_name (seg_die, decl);
+ }
+ gcc_assert (name!=NULL);
+ add_pure_or_virtual_attribute (seg_die, decl);
+ if (DECL_ARTIFICIAL (decl))
+ add_AT_flag (seg_die, DW_AT_artificial, 1);
+
+ if (fde->in_std_section)
+ {
+ name = concat (name, "_$cold$", NULL);
+ add_AT_lbl_id (seg_die, DW_AT_low_pc,
+ fde->dw_fde_unlikely_section_label);
+ add_AT_lbl_id (seg_die, DW_AT_high_pc,
+ fde->dw_fde_unlikely_section_end_label);
+ }
+ else
+ {
+ name = concat (name, "_$hot$", NULL);
+ add_AT_lbl_id (seg_die, DW_AT_low_pc,
+ fde->dw_fde_hot_section_label);
+ add_AT_lbl_id (seg_die, DW_AT_high_pc,
+ fde->dw_fde_hot_section_end_label);
+ }
+ add_name_attribute (seg_die, name);
+ add_pubname_string (name, seg_die);
+ add_arange (decl, seg_die);
+ }
+ }
+ else
+ {
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, fde->dw_fde_end);
+ add_pubname (decl, subr_die);
+ add_arange (decl, subr_die);
+ }
}
#ifdef MIPS_DEBUGGING_INFO
[-- Attachment #3: Type: text/plain, Size: 3 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 14:40 [Patch Debug] Emit pubnames for reorder & partition case IainS
@ 2010-12-20 21:45 ` Richard Henderson
2010-12-20 22:06 ` IainS
2010-12-23 20:55 ` Mike Stump
1 sibling, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2010-12-20 21:45 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 12/20/2010 03:18 AM, IainS wrote:
> + /* There is no real support in DW2 for this .. so we make
> + a work-around. First, emit the pub name for the segment
> + containing the function label. Then make and emit a
> + simplified subprogram DIE for the second segment with the
> + name post-fixed with _$hot$ or _$cold$. We use the same
> + linkage name for the second die so that gdb will find both
> + sections when given "b foo". */
This doesn't work when $ is not allowed, aka NO_DOLLAR_IN_LABEL.
Presumably we need this workaround since Darwin is strict dwarf2?
r~
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 21:45 ` Richard Henderson
@ 2010-12-20 22:06 ` IainS
2010-12-20 22:29 ` Richard Henderson
0 siblings, 1 reply; 11+ messages in thread
From: IainS @ 2010-12-20 22:06 UTC (permalink / raw)
To: Richard Henderson; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 20 Dec 2010, at 21:15, Richard Henderson wrote:
> On 12/20/2010 03:18 AM, IainS wrote:
>> + /* There is no real support in DW2 for this .. so we make
>> + a work-around. First, emit the pub name for the segment
>> + containing the function label. Then make and emit a
>> + simplified subprogram DIE for the second segment with the
>> + name post-fixed with _$hot$ or _$cold$. We use the same
>> + linkage name for the second die so that gdb will find both
>> + sections when given "b foo". */
>
> This doesn't work when $ is not allowed, aka NO_DOLLAR_IN_LABEL.
> Presumably we need this workaround since Darwin is strict dwarf2?
Yes, we need the work-around ..
but I'm not massively attached to $ (or even £ ;-))
is it OK apart from that?
cheers
Iain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 22:06 ` IainS
@ 2010-12-20 22:29 ` Richard Henderson
2010-12-20 22:37 ` IainS
0 siblings, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2010-12-20 22:29 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 12/20/2010 01:20 PM, IainS wrote:
>
> On 20 Dec 2010, at 21:15, Richard Henderson wrote:
>
>> On 12/20/2010 03:18 AM, IainS wrote:
>>> + /* There is no real support in DW2 for this .. so we make
>>> + a work-around. First, emit the pub name for the segment
>>> + containing the function label. Then make and emit a
>>> + simplified subprogram DIE for the second segment with the
>>> + name post-fixed with _$hot$ or _$cold$. We use the same
>>> + linkage name for the second die so that gdb will find both
>>> + sections when given "b foo". */
>>
>> This doesn't work when $ is not allowed, aka NO_DOLLAR_IN_LABEL.
>> Presumably we need this workaround since Darwin is strict dwarf2?
>
> Yes, we need the work-around ..
> but I'm not massively attached to $ (or even £ ;-))
>
> is it OK apart from that?
Yeah, and I suppose you're after matching the symbols here with
the symbols from that previous patch.
Ok with an extra bit akin to the use in clone_function_name:
#ifndef NO_DOT_IN_LABEL
prefix[len] = '.';
#elif !defined NO_DOLLAR_IN_LABEL
prefix[len] = '$';
#else
prefix[len] = '_';
#endif
though of course you may swap the preferencing of [$.] to match
what you already have in darwin.c.
r~
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 22:29 ` Richard Henderson
@ 2010-12-20 22:37 ` IainS
2010-12-20 22:43 ` Richard Henderson
0 siblings, 1 reply; 11+ messages in thread
From: IainS @ 2010-12-20 22:37 UTC (permalink / raw)
To: Richard Henderson; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 20 Dec 2010, at 21:38, Richard Henderson wrote:
> On 12/20/2010 01:20 PM, IainS wrote:
>>
>> On 20 Dec 2010, at 21:15, Richard Henderson wrote:
>>
>>> On 12/20/2010 03:18 AM, IainS wrote:
>>>> + /* There is no real support in DW2 for this .. so we
>>>> make
>>>> + a work-around. First, emit the pub name for the
>>>> segment
>>>> + containing the function label. Then make and emit a
>>>> + simplified subprogram DIE for the second segment
>>>> with the
>>>> + name post-fixed with _$hot$ or _$cold$. We use the
>>>> same
>>>> + linkage name for the second die so that gdb will
>>>> find both
>>>> + sections when given "b foo". */
>>>
>>> This doesn't work when $ is not allowed, aka NO_DOLLAR_IN_LABEL.
>>> Presumably we need this workaround since Darwin is strict dwarf2?
>>
>> Yes, we need the work-around ..
FWIW, the problem is that we support only a sub-set of DW3 - so if you
try gcc -gdwarf-3 either the linker or dsymutil dies.
so, we're stuck with DW2/strict.
>> but I'm not massively attached to $ (or even £ ;-))
>>
>> is it OK apart from that?
>
> Yeah, and I suppose you're after matching the symbols here with
> the symbols from that previous patch.
>
> Ok with an extra bit akin to the use in clone_function_name:
>
> #ifndef NO_DOT_IN_LABEL
> prefix[len] = '.';
> #elif !defined NO_DOLLAR_IN_LABEL
> prefix[len] = '$';
> #else
> prefix[len] = '_';
> #endif
>
> though of course you may swap the preferencing of [$.] to match
> what you already have in darwin.c.
what I'm after is
(a) avoiding a name clash.
(b) having a generated tag which is clearly understandable to the
person debugging ..
If I prefix (rather than the current post-fix) with "__hot_" and
"__cold_" (or even __hot_partition_) that should be safe and not
require the extra hoops?
(I"m happy to do what you've suggested above, of course, if that's the
best solution).
thanks,
Iain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 22:37 ` IainS
@ 2010-12-20 22:43 ` Richard Henderson
2010-12-21 6:13 ` IainS
0 siblings, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2010-12-20 22:43 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 12/20/2010 01:49 PM, IainS wrote:
> what I'm after is
> (a) avoiding a name clash.
> (b) having a generated tag which is clearly understandable to the person debugging ..
>
> If I prefix (rather than the current post-fix) with "__hot_" and
> "__cold_" (or even __hot_partition_) that should be safe and not
> require the extra hoops?
Yes, that should work. I do question whether you want this symbol
to match up with the name generated in the "atom" patch though.
r~
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 22:43 ` Richard Henderson
@ 2010-12-21 6:13 ` IainS
2010-12-21 14:11 ` IainS
0 siblings, 1 reply; 11+ messages in thread
From: IainS @ 2010-12-21 6:13 UTC (permalink / raw)
To: Richard Henderson; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On 20 Dec 2010, at 22:06, Richard Henderson wrote:
> On 12/20/2010 01:49 PM, IainS wrote:
>> what I'm after is
>> (a) avoiding a name clash.
>> (b) having a generated tag which is clearly understandable to the
>> person debugging ..
>>
>> If I prefix (rather than the current post-fix) with "__hot_" and
>> "__cold_" (or even __hot_partition_) that should be safe and not
>> require the extra hoops?
>
> Yes, that should work. I do question whether you want this symbol
> to match up with the name generated in the "atom" patch though.
Yes, I think that is a good idea - I will amend the other patch to
match this one, assuming Mike also OKs it,
thanks, for your reviews,
Iain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-21 6:13 ` IainS
@ 2010-12-21 14:11 ` IainS
2010-12-21 17:10 ` Richard Henderson
0 siblings, 1 reply; 11+ messages in thread
From: IainS @ 2010-12-21 14:11 UTC (permalink / raw)
To: Richard Henderson; +Cc: GCC Patches, Mike Stump
On 20 Dec 2010, at 22:43, IainS wrote:
>
> On 20 Dec 2010, at 22:06, Richard Henderson wrote:
>
>> On 12/20/2010 01:49 PM, IainS wrote:
>>> what I'm after is
>>> (a) avoiding a name clash.
>>> (b) having a generated tag which is clearly understandable to the
>>> person debugging ..
>>>
>>> If I prefix (rather than the current post-fix) with "__hot_" and
>>> "__cold_" (or even __hot_partition_) that should be safe and not
>>> require the extra hoops?
>>
>> Yes, that should work. I do question whether you want this symbol
>> to match up with the name generated in the "atom" patch though.
>
>
> Yes, I think that is a good idea - I will amend the other patch to
> match this one, assuming Mike also OKs it,
> thanks, for your reviews,
I've now amended the darwf2 patch thus:
/* There is no real support in DW2 for this .. so we make
a work-around. First, emit the pub name for the segment
containing the function label. Then make and emit a
simplified subprogram DIE for the second segment with the
name pre-fixed by __hot/cold_sect_of_. We use the same
linkage name for the second die so that gdb will find both
sections when given "b foo". */
<snip>
if (fde->in_std_section)
{
name = concat ("__cold_sect_of_", name, NULL);
etc.
and the config/darwin.c patch to match this.
FAOD, are the two patches now OK to apply, assuming Mike is happy with
the Darwin aspects?
thanks
Iain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-21 14:11 ` IainS
@ 2010-12-21 17:10 ` Richard Henderson
0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2010-12-21 17:10 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump
On 12/21/2010 04:45 AM, IainS wrote:
> name = concat ("__cold_sect_of_", name, NULL);
Yes, this is fine.
r~
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-20 14:40 [Patch Debug] Emit pubnames for reorder & partition case IainS
2010-12-20 21:45 ` Richard Henderson
@ 2010-12-23 20:55 ` Mike Stump
2011-01-07 14:12 ` IainS
1 sibling, 1 reply; 11+ messages in thread
From: Mike Stump @ 2010-12-23 20:55 UTC (permalink / raw)
To: IainS; +Cc: GCC Patches, Mike Stump, Jakub Jelinek
On Dec 20, 2010, at 3:18 AM, IainS <developer@sandoe-acoustics.co.uk> wrote:
> At present, pubnames are not emitted when -freorder-blocks-and-partition is active.
Ok with the change to not use . or $ in the label.
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Patch Debug] Emit pubnames for reorder & partition case.
2010-12-23 20:55 ` Mike Stump
@ 2011-01-07 14:12 ` IainS
0 siblings, 0 replies; 11+ messages in thread
From: IainS @ 2011-01-07 14:12 UTC (permalink / raw)
Cc: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 309 bytes --]
On 23 Dec 2010, at 19:27, Mike Stump wrote:
> On Dec 20, 2010, at 3:18 AM, IainS <developer@sandoe-
> acoustics.co.uk> wrote:
>> At present, pubnames are not emitted when -freorder-blocks-and-
>> partition is active.
>
> Ok with the change to not use . or $ in the label.
>>
ci r168570 as attached.
Iain
[-- Attachment #2: 168562-dw2-part.txt --]
[-- Type: text/plain, Size: 7511 bytes --]
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog (revision 168568)
+++ gcc/ChangeLog (working copy)
@@ -1,3 +1,9 @@
+2011-01-07 Iain Sandoe <iains@gcc.gnu.org>
+
+ * dwarf2out.c (gen_subprogram_die): Add pubnames with code ranges for
+ DWARF >= 3. Add pubnames for the primary section and a reduced DIE for
+ the secondary code fragment when outputting for DWARF == 2.
+
2011-01-07 Anatoly Sokolov <aesok@post.ru>
* config/xtensa/xtensa.h (OUTPUT_ADDR_CONST_EXTRA): Remove.
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 168568)
+++ gcc/dwarf2out.c (working copy)
@@ -18902,7 +18902,6 @@ premark_types_used_by_global_vars (void)
static void
gen_subprogram_die (tree decl, dw_die_ref context_die)
{
- char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
tree origin = decl_ultimate_origin (decl);
dw_die_ref subr_die;
tree outer_scope;
@@ -19071,12 +19070,24 @@ gen_subprogram_die (tree decl, dw_die_ref context_
if (!flag_reorder_blocks_and_partition)
{
- ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
- current_function_funcdef_no);
- add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
- ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
- current_function_funcdef_no);
- add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
+ dw_fde_ref fde = &fde_table[current_funcdef_fde];
+ if (fde->dw_fde_begin)
+ {
+ /* We have already generated the labels. */
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, fde->dw_fde_end);
+ }
+ else
+ {
+ /* Create start/end labels and add the range. */
+ char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
+ ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
+ current_function_funcdef_no);
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
+ ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
+ current_function_funcdef_no);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
+ }
#if VMS_DEBUGGING_INFO
/* HP OpenVMS Industry Standard 64: DWARF Extensions
@@ -19092,8 +19103,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_
attributes allow a compiler to communicate the location(s) to use. */
{
- dw_fde_ref fde = &fde_table[current_funcdef_fde];
-
if (fde->dw_fde_vms_end_prologue)
add_AT_vms_delta (subr_die, DW_AT_HP_prologue,
fde->dw_fde_begin, fde->dw_fde_vms_end_prologue);
@@ -19108,19 +19117,116 @@ gen_subprogram_die (tree decl, dw_die_ref context_
add_arange (decl, subr_die);
}
else
- { /* Do nothing for now; maybe need to duplicate die, one for
- hot section and one for cold section, then use the hot/cold
- section begin/end labels to generate the aranges... */
- /*
- add_AT_lbl_id (subr_die, DW_AT_low_pc, hot_section_label);
- add_AT_lbl_id (subr_die, DW_AT_high_pc, hot_section_end_label);
- add_AT_lbl_id (subr_die, DW_AT_lo_user, unlikely_section_label);
- add_AT_lbl_id (subr_die, DW_AT_hi_user, cold_section_end_label);
+ { /* Generate pubnames entries for the split function code
+ ranges. */
+ dw_fde_ref fde = &fde_table[current_funcdef_fde];
- add_pubname (decl, subr_die);
- add_arange (decl, subr_die);
- add_arange (decl, subr_die);
- */
+ if (fde->dw_fde_switched_sections)
+ {
+ if (dwarf_version >= 3 || !dwarf_strict)
+ {
+ /* We should use ranges for non-contiguous code section
+ addresses. Use the actual code range for the initial
+ section, since the HOT/COLD labels might precede an
+ alignment offset. */
+ bool range_list_added = false;
+ if (fde->in_std_section)
+ {
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_begin,
+ fde->dw_fde_end,
+ &range_list_added);
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_unlikely_section_label,
+ fde->dw_fde_unlikely_section_end_label,
+ &range_list_added);
+ }
+ else
+ {
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_begin,
+ fde->dw_fde_end,
+ &range_list_added);
+ add_ranges_by_labels (subr_die,
+ fde->dw_fde_hot_section_label,
+ fde->dw_fde_hot_section_end_label,
+ &range_list_added);
+ }
+ add_pubname (decl, subr_die);
+ if (range_list_added)
+ add_ranges (NULL);
+ }
+ else
+ {
+ /* There is no real support in DW2 for this .. so we make
+ a work-around. First, emit the pub name for the segment
+ containing the function label. Then make and emit a
+ simplified subprogram DIE for the second segment with the
+ name pre-fixed by __hot/cold_sect_of_. We use the same
+ linkage name for the second die so that gdb will find both
+ sections when given "b foo". */
+ const char *name = NULL;
+ tree decl_name = DECL_NAME (decl);
+ dw_die_ref seg_die;
+
+ /* Do the 'primary' section. */
+ add_AT_lbl_id (subr_die, DW_AT_low_pc,
+ fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc,
+ fde->dw_fde_end);
+ /* Add it. */
+ add_pubname (decl, subr_die);
+ add_arange (decl, subr_die);
+
+ /* Build a minimal DIE for the secondary section. */
+ seg_die = new_die (DW_TAG_subprogram,
+ subr_die->die_parent, decl);
+
+ if (TREE_PUBLIC (decl))
+ add_AT_flag (seg_die, DW_AT_external, 1);
+
+ if (decl_name != NULL
+ && IDENTIFIER_POINTER (decl_name) != NULL)
+ {
+ name = dwarf2_name (decl, 1);
+ if (! DECL_ARTIFICIAL (decl))
+ add_src_coords_attributes (seg_die, decl);
+
+ add_linkage_name (seg_die, decl);
+ }
+ gcc_assert (name!=NULL);
+ add_pure_or_virtual_attribute (seg_die, decl);
+ if (DECL_ARTIFICIAL (decl))
+ add_AT_flag (seg_die, DW_AT_artificial, 1);
+
+ if (fde->in_std_section)
+ {
+ name = concat ("__cold_sect_of_", name, NULL);
+ add_AT_lbl_id (seg_die, DW_AT_low_pc,
+ fde->dw_fde_unlikely_section_label);
+ add_AT_lbl_id (seg_die, DW_AT_high_pc,
+ fde->dw_fde_unlikely_section_end_label);
+ }
+ else
+ {
+ name = concat ("__hot_sect_of_", name, NULL);
+ add_AT_lbl_id (seg_die, DW_AT_low_pc,
+ fde->dw_fde_hot_section_label);
+ add_AT_lbl_id (seg_die, DW_AT_high_pc,
+ fde->dw_fde_hot_section_end_label);
+ }
+ add_name_attribute (seg_die, name);
+ add_pubname_string (name, seg_die);
+ add_arange (decl, seg_die);
+ }
+ }
+ else
+ {
+ add_AT_lbl_id (subr_die, DW_AT_low_pc, fde->dw_fde_begin);
+ add_AT_lbl_id (subr_die, DW_AT_high_pc, fde->dw_fde_end);
+ add_pubname (decl, subr_die);
+ add_arange (decl, subr_die);
+ }
}
#ifdef MIPS_DEBUGGING_INFO
@@ -23164,8 +23270,8 @@ dwarf2out_finish (const char *filename)
/* We can only use the low/high_pc attributes if all of the code was
in .text. */
- if (!have_multiple_function_sections
- || !(dwarf_version >= 3 || !dwarf_strict))
+ if (!have_multiple_function_sections
+ || (dwarf_version < 3 && dwarf_strict))
{
add_AT_lbl_id (comp_unit_die (), DW_AT_low_pc, text_section_label);
add_AT_lbl_id (comp_unit_die (), DW_AT_high_pc, text_end_label);
[-- Attachment #3: Type: text/plain, Size: 3 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-01-07 14:01 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-20 14:40 [Patch Debug] Emit pubnames for reorder & partition case IainS
2010-12-20 21:45 ` Richard Henderson
2010-12-20 22:06 ` IainS
2010-12-20 22:29 ` Richard Henderson
2010-12-20 22:37 ` IainS
2010-12-20 22:43 ` Richard Henderson
2010-12-21 6:13 ` IainS
2010-12-21 14:11 ` IainS
2010-12-21 17:10 ` Richard Henderson
2010-12-23 20:55 ` Mike Stump
2011-01-07 14:12 ` IainS
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).