This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [google/gcc-4_6] Fix to use correct form for DW_AT_low_pc in compile_unit DIE. (issue6298055)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]