diff options
author | Mark Wielaard <mjw@redhat.com> | 2012-08-20 20:27:46 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2012-08-20 20:27:46 +0000 |
commit | 413de8e5c791fbeddf93b89394947783a15bf60b (patch) | |
tree | 5c373f6ede262df0f4ea4a327dfc2535f794f13d /gcc | |
parent | ed0ba472c654095656fe1da371ee1a710fce2cf0 (diff) | |
download | gcc-413de8e5c791fbeddf93b89394947783a15bf60b.zip gcc-413de8e5c791fbeddf93b89394947783a15bf60b.tar.gz gcc-413de8e5c791fbeddf93b89394947783a15bf60b.tar.bz2 |
dwarf2out.c: For DWARF 4+, output DW_AT_high_pc as constant offset.
* dwarf2out.h (enum dw_val_class): Add dw_val_class_high_pc.
* dwarf2out.c (dw_val_equal_p): Handle dw_val_class_high_pc.
(add_AT_low_high_pc): New function.
(AT_lbl): Handle dw_val_class_high_pc.
(print_die): Likewise.
(attr_checksum): Likewise.
(attr_checksum_ordered): Likewise.
(same_dw_val_p): Likewise.
(size_of_die): Likewise.
(value_format): Likewise.
(output_die): Likewise.
(gen_subprogram_die): Use add_AT_low_high_pc.
(add_high_low_attributes): Likewise.
(dwarf2out_finish): Likewise.
From-SVN: r190543
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 89 | ||||
-rw-r--r-- | gcc/dwarf2out.h | 3 |
3 files changed, 81 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83cda06..677fc17 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2012-08-20 Mark Wielaard <mjw@redhat.com> + + * dwarf2out.h (enum dw_val_class): Add dw_val_class_high_pc. + * dwarf2out.c (dw_val_equal_p): Handle dw_val_class_high_pc. + (add_AT_low_high_pc): New function. + (AT_lbl): Handle dw_val_class_high_pc. + (print_die): Likewise. + (attr_checksum): Likewise. + (attr_checksum_ordered): Likewise. + (same_dw_val_p): Likewise. + (size_of_die): Likewise. + (value_format): Likewise. + (output_die): Likewise. + (gen_subprogram_die): Use add_AT_low_high_pc. + (add_high_low_attributes): Likewise. + (dwarf2out_finish): Likewise. + 2012-08-20 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/54294 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4bc4cc3..11d925b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1312,6 +1312,7 @@ dw_val_equal_p (dw_val_node *a, dw_val_node *b) case dw_val_class_fde_ref: return a->v.val_fde_index == b->v.val_fde_index; case dw_val_class_lbl_id: + case dw_val_class_high_pc: return strcmp (a->v.val_lbl_id, b->v.val_lbl_id) == 0; case dw_val_class_str: return a->v.val_str == b->v.val_str; @@ -3598,6 +3599,26 @@ add_AT_data8 (dw_die_ref die, enum dwarf_attribute attr_kind, add_dwarf_attr (die, &attr); } +/* 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) +{ + 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.v.val_lbl_id = xstrdup (lbl_low); + add_dwarf_attr (die, &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.v.val_lbl_id = xstrdup (lbl_high); + add_dwarf_attr (die, &attr); +} + /* Hash and equality functions for debug_str_hash. */ static hashval_t @@ -3981,7 +4002,8 @@ AT_lbl (dw_attr_ref a) { gcc_assert (a && (AT_class (a) == dw_val_class_lbl_id || AT_class (a) == dw_val_class_lineptr - || AT_class (a) == dw_val_class_macptr)); + || AT_class (a) == dw_val_class_macptr + || AT_class (a) == dw_val_class_high_pc)); return a->dw_attr_val.v.val_lbl_id; } @@ -4877,6 +4899,7 @@ print_die (dw_die_ref die, FILE *outfile) case dw_val_class_lbl_id: case dw_val_class_lineptr: case dw_val_class_macptr: + case dw_val_class_high_pc: fprintf (outfile, "label: %s", AT_lbl (a)); break; case dw_val_class_str: @@ -5033,6 +5056,7 @@ attr_checksum (dw_attr_ref at, struct md5_ctx *ctx, int *mark) case dw_val_class_lbl_id: case dw_val_class_lineptr: case dw_val_class_macptr: + case dw_val_class_high_pc: break; case dw_val_class_file: @@ -5305,6 +5329,7 @@ attr_checksum_ordered (enum dwarf_tag tag, dw_attr_ref at, case dw_val_class_lbl_id: case dw_val_class_lineptr: case dw_val_class_macptr: + case dw_val_class_high_pc: break; case dw_val_class_file: @@ -5770,6 +5795,7 @@ same_dw_val_p (const dw_val_node *v1, const dw_val_node *v2, int *mark) case dw_val_class_lbl_id: case dw_val_class_lineptr: case dw_val_class_macptr: + case dw_val_class_high_pc: return 1; case dw_val_class_file: @@ -7241,6 +7267,9 @@ size_of_die (dw_die_ref die) case dw_val_class_vms_delta: size += DWARF_OFFSET_SIZE; break; + case dw_val_class_high_pc: + size += DWARF2_ADDR_SIZE; + break; default: gcc_unreachable (); } @@ -7558,6 +7587,17 @@ value_format (dw_attr_ref a) case dw_val_class_data8: return DW_FORM_data8; + case dw_val_class_high_pc: + switch (DWARF2_ADDR_SIZE) + { + case 4: + return DW_FORM_data4; + case 8: + return DW_FORM_data8; + default: + gcc_unreachable (); + } + default: gcc_unreachable (); } @@ -7984,6 +8024,11 @@ output_die (dw_die_ref die) break; } + case dw_val_class_high_pc: + dw2_asm_output_delta (DWARF2_ADDR_SIZE, AT_lbl (a), + get_AT_low_pc (die), "DW_AT_high_pc"); + break; + default: gcc_unreachable (); } @@ -17028,19 +17073,18 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) 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); + add_AT_low_high_pc (subr_die, fde->dw_fde_begin, 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, + char label_id_low[MAX_ARTIFICIAL_LABEL_BYTES]; + char label_id_high[MAX_ARTIFICIAL_LABEL_BYTES]; + ASM_GENERATE_INTERNAL_LABEL (label_id_low, 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, + ASM_GENERATE_INTERNAL_LABEL (label_id_high, FUNC_END_LABEL, current_function_funcdef_no); - add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id); + add_AT_low_high_pc (subr_die, label_id_low, label_id_high); } #if VMS_DEBUGGING_INFO @@ -17104,10 +17148,8 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) 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_AT_low_high_pc (subr_die, fde->dw_fde_begin, + fde->dw_fde_end); /* Build a minimal DIE for the secondary section. */ seg_die = new_die (DW_TAG_subprogram, @@ -17131,20 +17173,15 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) add_AT_flag (seg_die, DW_AT_artificial, 1); name = concat ("__second_sect_of_", name, NULL); - add_AT_lbl_id (seg_die, DW_AT_low_pc, - fde->dw_fde_second_begin); - add_AT_lbl_id (seg_die, DW_AT_high_pc, - fde->dw_fde_second_end); + add_AT_low_high_pc (seg_die, fde->dw_fde_second_begin, + fde->dw_fde_second_end); add_name_attribute (seg_die, name); if (want_pubnames ()) add_pubname_string (name, 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_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end); } cfa_fb_offset = CFA_FRAME_BASE_OFFSET (decl); @@ -17887,12 +17924,12 @@ add_high_low_attributes (tree stmt, dw_die_ref die) } else { + char label_high[MAX_ARTIFICIAL_LABEL_BYTES]; ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL, BLOCK_NUMBER (stmt)); - add_AT_lbl_id (die, DW_AT_low_pc, label); - ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, + ASM_GENERATE_INTERNAL_LABEL (label_high, BLOCK_END_LABEL, BLOCK_NUMBER (stmt)); - add_AT_lbl_id (die, DW_AT_high_pc, label); + add_AT_low_high_pc (die, label, label_high); } } @@ -22365,10 +22402,8 @@ dwarf2out_finish (const char *filename) { /* Don't add if the CU has no associated code. */ if (text_section_used) - { - 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); - } + add_AT_low_high_pc (comp_unit_die (), text_section_label, + text_end_label); } else { diff --git a/gcc/dwarf2out.h b/gcc/dwarf2out.h index a995291..853dce4 100644 --- a/gcc/dwarf2out.h +++ b/gcc/dwarf2out.h @@ -154,7 +154,8 @@ enum dw_val_class dw_val_class_file, dw_val_class_data8, dw_val_class_decl_ref, - dw_val_class_vms_delta + dw_val_class_vms_delta, + dw_val_class_high_pc }; /* Describe a floating point constant value, or a vector constant value. */ |