* [google/gcc-4_6] Fix to use correct form for DW_AT_low_pc in compile_unit DIE. (issue6298055)
@ 2012-06-07 6:28 Cary Coutant
2012-06-07 15:37 ` Sterling Augustine
0 siblings, 1 reply; 2+ messages in thread
From: Cary Coutant @ 2012-06-07 6:28 UTC (permalink / raw)
To: reply, saugustine, gcc-patches
This patch is for the google/gcc-4_6 branch.
In porting the earlier patch to use constant forms for DW_AT_high_pc,
the code in dwarf2out_finish was inadvertently changed to use an
indirect form for DW_AT_low_pc in the main compile_unit DIE. This
patch adds the force_direct parameter used in other cases to
distinguish between DIEs in the .o (which should use the normal direct
form) and DIEs in the .dwo (which need to use DW_FORM_addr_index).
Tested with make check-gcc and validate-failures.py.
2012-06-06 Cary Coutant <ccoutant@google.com>
* gcc/dwarf2out.c (add_AT_low_high_pc): Add force_direct parameter;
add DW_FORM_addr_index reference when splitting debug info.
(gen_subprogram_die): Pass FALSE when calling add_AT_low_high_pc.
(add_high_low_attributes): Likewise.
(dwarf2out_finish): Pass TRUE when calling add_AT_low_high_pc.
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 188293)
+++ gcc/dwarf2out.c (working copy)
@@ -7568,22 +7568,30 @@ add_AT_data8 (dw_die_ref die, enum dwarf
/* Add DW_AT_low_pc and DW_AT_high_pc to a DIE. */
static inline void
-add_AT_low_high_pc (dw_die_ref die, const char *lbl_low, const char *lbl_high)
+add_AT_low_high_pc (dw_die_ref die, const char *lbl_low, const char *lbl_high,
+ bool force_direct)
{
dw_attr_node attr;
attr.dw_attr = DW_AT_low_pc;
attr.dw_attr_val.val_class = dw_val_class_lbl_id;
+ attr.dw_attr_val.val_index = -1U;
attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_low);
add_dwarf_attr (die, &attr);
+ if (dwarf_split_debug_info && !force_direct)
+ set_AT_index (get_AT (die, DW_AT_low_pc), add_addr_table_entry (&attr));
attr.dw_attr = DW_AT_high_pc;
if (dwarf_version < 4)
attr.dw_attr_val.val_class = dw_val_class_lbl_id;
else
attr.dw_attr_val.val_class = dw_val_class_high_pc;
+ attr.dw_attr_val.val_index = -1U;
attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_high);
add_dwarf_attr (die, &attr);
+ if (attr.dw_attr_val.val_class == dw_val_class_lbl_id
+ && dwarf_split_debug_info && !force_direct)
+ set_AT_index (get_AT (die, DW_AT_high_pc), add_addr_table_entry (&attr));
}
/* Hash and equality functions for debug_str_hash. */
@@ -19968,7 +19976,8 @@ gen_subprogram_die (tree decl, dw_die_re
if (fde->dw_fde_begin)
{
/* We have already generated the labels. */
- add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end);
+ add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
+ fde->dw_fde_end, false);
}
else
{
@@ -19979,7 +19988,8 @@ gen_subprogram_die (tree decl, dw_die_re
FUNC_LABEL_ID (cfun));
ASM_GENERATE_INTERNAL_LABEL (label_id_high, FUNC_END_LABEL,
FUNC_LABEL_ID (cfun));
- add_AT_low_high_pc (subr_die, label_id_low, label_id_high);
+ add_AT_low_high_pc (subr_die, label_id_low, label_id_high,
+ false);
}
#if VMS_DEBUGGING_INFO
@@ -20045,7 +20055,7 @@ gen_subprogram_die (tree decl, dw_die_re
/* Do the 'primary' section. */
add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
- fde->dw_fde_end);
+ fde->dw_fde_end, false);
/* Build a minimal DIE for the secondary section. */
seg_die = new_die (DW_TAG_subprogram,
@@ -20070,13 +20080,14 @@ gen_subprogram_die (tree decl, dw_die_re
name = concat ("__second_sect_of_", name, NULL);
add_AT_low_high_pc (seg_die, fde->dw_fde_second_begin,
- fde->dw_fde_second_end);
+ fde->dw_fde_second_end, false);
add_name_attribute (seg_die, name);
add_pubname_string (name, seg_die);
}
}
else
- add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end);
+ add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end,
+ false);
}
#ifdef MIPS_DEBUGGING_INFO
@@ -20610,7 +20621,7 @@ add_high_low_attributes (tree stmt, dw_d
BLOCK_NUMBER (stmt));
ASM_GENERATE_INTERNAL_LABEL (label_high, BLOCK_END_LABEL,
BLOCK_NUMBER (stmt));
- add_AT_low_high_pc (die, label, label_high);
+ add_AT_low_high_pc (die, label, label_high, false);
}
}
@@ -24510,7 +24521,7 @@ dwarf2out_finish (const char *filename)
if (!have_multiple_function_sections
|| (dwarf_version < 3 && dwarf_strict))
add_AT_low_high_pc (main_comp_unit_die, text_section_label,
- text_end_label);
+ text_end_label, true);
else
{
unsigned fde_idx = 0;
--
This patch is available for review at http://codereview.appspot.com/6298055
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [google/gcc-4_6] Fix to use correct form for DW_AT_low_pc in compile_unit DIE. (issue6298055)
2012-06-07 6:28 [google/gcc-4_6] Fix to use correct form for DW_AT_low_pc in compile_unit DIE. (issue6298055) Cary Coutant
@ 2012-06-07 15:37 ` Sterling Augustine
0 siblings, 0 replies; 2+ messages in thread
From: Sterling Augustine @ 2012-06-07 15:37 UTC (permalink / raw)
To: Cary Coutant; +Cc: reply, gcc-patches
On Wed, Jun 6, 2012 at 11:23 PM, Cary Coutant <ccoutant@google.com> wrote:
> This patch is for the google/gcc-4_6 branch.
>
> In porting the earlier patch to use constant forms for DW_AT_high_pc,
> the code in dwarf2out_finish was inadvertently changed to use an
> indirect form for DW_AT_low_pc in the main compile_unit DIE. This
> patch adds the force_direct parameter used in other cases to
> distinguish between DIEs in the .o (which should use the normal direct
> form) and DIEs in the .dwo (which need to use DW_FORM_addr_index).
>
> Tested with make check-gcc and validate-failures.py.
>
>
> 2012-06-06 Cary Coutant <ccoutant@google.com>
>
> * gcc/dwarf2out.c (add_AT_low_high_pc): Add force_direct parameter;
> add DW_FORM_addr_index reference when splitting debug info.
> (gen_subprogram_die): Pass FALSE when calling add_AT_low_high_pc.
> (add_high_low_attributes): Likewise.
> (dwarf2out_finish): Pass TRUE when calling add_AT_low_high_pc.
>
>
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c (revision 188293)
> +++ gcc/dwarf2out.c (working copy)
> @@ -7568,22 +7568,30 @@ add_AT_data8 (dw_die_ref die, enum dwarf
>
> /* Add DW_AT_low_pc and DW_AT_high_pc to a DIE. */
> static inline void
> -add_AT_low_high_pc (dw_die_ref die, const char *lbl_low, const char *lbl_high)
> +add_AT_low_high_pc (dw_die_ref die, const char *lbl_low, const char *lbl_high,
> + bool force_direct)
> {
> dw_attr_node attr;
>
> attr.dw_attr = DW_AT_low_pc;
> attr.dw_attr_val.val_class = dw_val_class_lbl_id;
> + attr.dw_attr_val.val_index = -1U;
> attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_low);
> add_dwarf_attr (die, &attr);
> + if (dwarf_split_debug_info && !force_direct)
> + set_AT_index (get_AT (die, DW_AT_low_pc), add_addr_table_entry (&attr));
>
> attr.dw_attr = DW_AT_high_pc;
> if (dwarf_version < 4)
> attr.dw_attr_val.val_class = dw_val_class_lbl_id;
> else
> attr.dw_attr_val.val_class = dw_val_class_high_pc;
> + attr.dw_attr_val.val_index = -1U;
> attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_high);
> add_dwarf_attr (die, &attr);
> + if (attr.dw_attr_val.val_class == dw_val_class_lbl_id
> + && dwarf_split_debug_info && !force_direct)
> + set_AT_index (get_AT (die, DW_AT_high_pc), add_addr_table_entry (&attr));
> }
>
> /* Hash and equality functions for debug_str_hash. */
> @@ -19968,7 +19976,8 @@ gen_subprogram_die (tree decl, dw_die_re
> if (fde->dw_fde_begin)
> {
> /* We have already generated the labels. */
> - add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end);
> + add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
> + fde->dw_fde_end, false);
> }
> else
> {
> @@ -19979,7 +19988,8 @@ gen_subprogram_die (tree decl, dw_die_re
> FUNC_LABEL_ID (cfun));
> ASM_GENERATE_INTERNAL_LABEL (label_id_high, FUNC_END_LABEL,
> FUNC_LABEL_ID (cfun));
> - add_AT_low_high_pc (subr_die, label_id_low, label_id_high);
> + add_AT_low_high_pc (subr_die, label_id_low, label_id_high,
> + false);
> }
>
> #if VMS_DEBUGGING_INFO
> @@ -20045,7 +20055,7 @@ gen_subprogram_die (tree decl, dw_die_re
>
> /* Do the 'primary' section. */
> add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
> - fde->dw_fde_end);
> + fde->dw_fde_end, false);
>
> /* Build a minimal DIE for the secondary section. */
> seg_die = new_die (DW_TAG_subprogram,
> @@ -20070,13 +20080,14 @@ gen_subprogram_die (tree decl, dw_die_re
>
> name = concat ("__second_sect_of_", name, NULL);
> add_AT_low_high_pc (seg_die, fde->dw_fde_second_begin,
> - fde->dw_fde_second_end);
> + fde->dw_fde_second_end, false);
> add_name_attribute (seg_die, name);
> add_pubname_string (name, seg_die);
> }
> }
> else
> - add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end);
> + add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end,
> + false);
> }
>
> #ifdef MIPS_DEBUGGING_INFO
> @@ -20610,7 +20621,7 @@ add_high_low_attributes (tree stmt, dw_d
> BLOCK_NUMBER (stmt));
> ASM_GENERATE_INTERNAL_LABEL (label_high, BLOCK_END_LABEL,
> BLOCK_NUMBER (stmt));
> - add_AT_low_high_pc (die, label, label_high);
> + add_AT_low_high_pc (die, label, label_high, false);
> }
> }
>
> @@ -24510,7 +24521,7 @@ dwarf2out_finish (const char *filename)
> if (!have_multiple_function_sections
> || (dwarf_version < 3 && dwarf_strict))
> add_AT_low_high_pc (main_comp_unit_die, text_section_label,
> - text_end_label);
> + text_end_label, true);
> else
> {
> unsigned fde_idx = 0;
>
> --
> This patch is available for review at http://codereview.appspot.com/6298055
This is OK for Google 4.6
Sterling
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-06-07 15:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-07 6:28 [google/gcc-4_6] Fix to use correct form for DW_AT_low_pc in compile_unit DIE. (issue6298055) Cary Coutant
2012-06-07 15:37 ` Sterling Augustine
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).