From 290d8971e6e3b784a88b5c4b6b91b8d77552cb3a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek <jakub@redhat.com> Date: Wed, 31 Mar 2010 17:37:03 +0200 Subject: [PATCH] dwarf2out.c (size_of_die): For -gdwarf-4 use uleb128 size instead of fixed 1 or 2 for dw_val_class_loc and... * dwarf2out.c (size_of_die): For -gdwarf-4 use uleb128 size instead of fixed 1 or 2 for dw_val_class_loc and 0 instead of 1 for dw_val_class_flag. (value_format): For -gdwarf-4 use DW_FORM_sec_offset for dw_val_class_range_list, dw_val_class_loc_list, dw_val_class_lineptr and dw_val_class_macptr, use DW_FORM_flag_present for dw_val_class_flag and DW_FORM_exprloc for dw_val_class_loc. (output_die): For -gdwarf-4 print dw_val_class_loc size as uleb128 instead of 1 or 2 bytes and don't print anything for dw_val_class_flag. From-SVN: r157871 --- gcc/ChangeLog | 12 +++++++++++ gcc/dwarf2out.c | 55 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b06bb6d36d5..d14790c553f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,17 @@ 2010-03-31 Jakub Jelinek <jakub@redhat.com> + * dwarf2out.c (size_of_die): For -gdwarf-4 use + uleb128 size instead of fixed 1 or 2 for dw_val_class_loc + and 0 instead of 1 for dw_val_class_flag. + (value_format): For -gdwarf-4 use DW_FORM_sec_offset for + dw_val_class_range_list, dw_val_class_loc_list, + dw_val_class_lineptr and dw_val_class_macptr, use + DW_FORM_flag_present for dw_val_class_flag and + DW_FORM_exprloc for dw_val_class_loc. + (output_die): For -gdwarf-4 print dw_val_class_loc + size as uleb128 instead of 1 or 2 bytes and don't print + anything for dw_val_class_flag. + * var-tracking.c (vt_init_cfa_base): Use cselib_lookup_from_insn instead of cselib_lookup following by tweaking locs->setting_insn. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 84a5fe72db93..86ae89b69648 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -9920,7 +9920,10 @@ size_of_die (dw_die_ref die) unsigned long lsize = size_of_locs (AT_loc (a)); /* Block length. */ - size += constant_size (lsize); + if (dwarf_version >= 4) + size += size_of_uleb128 (lsize); + else + size += constant_size (lsize); size += lsize; } break; @@ -9948,7 +9951,16 @@ size_of_die (dw_die_ref die) * a->dw_attr_val.v.val_vec.elt_size; /* block */ break; case dw_val_class_flag: - size += 1; + if (dwarf_version >= 4) + /* Currently all add_AT_flag calls pass in 1 as last argument, + so DW_FORM_flag_present can be used. If that ever changes, + we'll need to use DW_FORM_flag and have some optimization + in build_abbrev_table that will change those to + DW_FORM_flag_present if it is set to 1 in all DIEs using + the same abbrev entry. */ + gcc_assert (a->dw_attr_val.v.val_flag == 1); + else + size += 1; break; case dw_val_class_die_ref: if (AT_ref_external (a)) @@ -10142,8 +10154,11 @@ value_format (dw_attr_ref a) gcc_unreachable (); } case dw_val_class_range_list: - case dw_val_class_offset: case dw_val_class_loc_list: + if (dwarf_version >= 4) + return DW_FORM_sec_offset; + /* FALLTHRU */ + case dw_val_class_offset: switch (DWARF_OFFSET_SIZE) { case 4: @@ -10154,6 +10169,8 @@ value_format (dw_attr_ref a) gcc_unreachable (); } case dw_val_class_loc: + if (dwarf_version >= 4) + return DW_FORM_exprloc; switch (constant_size (size_of_locs (AT_loc (a)))) { case 1: @@ -10206,6 +10223,17 @@ value_format (dw_attr_ref a) gcc_unreachable (); } case dw_val_class_flag: + if (dwarf_version >= 4) + { + /* Currently all add_AT_flag calls pass in 1 as last argument, + so DW_FORM_flag_present can be used. If that ever changes, + we'll need to use DW_FORM_flag and have some optimization + in build_abbrev_table that will change those to + DW_FORM_flag_present if it is set to 1 in all DIEs using + the same abbrev entry. */ + gcc_assert (a->dw_attr_val.v.val_flag == 1); + return DW_FORM_flag_present; + } return DW_FORM_flag; case dw_val_class_die_ref: if (AT_ref_external (a)) @@ -10218,7 +10246,7 @@ value_format (dw_attr_ref a) return DW_FORM_addr; case dw_val_class_lineptr: case dw_val_class_macptr: - return DW_FORM_data; + return dwarf_version >= 4 ? DW_FORM_sec_offset : DW_FORM_data; case dw_val_class_str: return AT_string_form (a); case dw_val_class_file: @@ -10450,7 +10478,10 @@ output_die (dw_die_ref die) size = size_of_locs (AT_loc (a)); /* Output the block length for this list of location operations. */ - dw2_asm_output_data (constant_size (size), size, "%s", name); + if (dwarf_version >= 4) + dw2_asm_output_data_uleb128 (size, "%s", name); + else + dw2_asm_output_data (constant_size (size), size, "%s", name); output_loc_sequence (AT_loc (a)); break; @@ -10518,6 +10549,20 @@ output_die (dw_die_ref die) } case dw_val_class_flag: + if (dwarf_version >= 4) + { + /* Currently all add_AT_flag calls pass in 1 as last argument, + so DW_FORM_flag_present can be used. If that ever changes, + we'll need to use DW_FORM_flag and have some optimization + in build_abbrev_table that will change those to + DW_FORM_flag_present if it is set to 1 in all DIEs using + the same abbrev entry. */ + gcc_assert (AT_flag (a) == 1); + if (flag_debug_asm) + fprintf (asm_out_file, "\t\t\t%s %s\n", + ASM_COMMENT_START, name); + break; + } dw2_asm_output_data (1, AT_flag (a), "%s", name); break; -- GitLab