diff options
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 88 |
1 files changed, 65 insertions, 23 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 6e98a4f..9308cce 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -158,6 +158,7 @@ static GTY(()) section *debug_loc_section; static GTY(()) section *debug_pubnames_section; static GTY(()) section *debug_str_section; static GTY(()) section *debug_ranges_section; +static GTY(()) section *debug_frame_section; /* How to start an assembler comment. */ #ifndef ASM_COMMENT_START @@ -2212,7 +2213,7 @@ output_call_frame_info (int for_eh) if (for_eh) switch_to_eh_frame_section (); else - switch_to_section (get_section (DEBUG_FRAME_SECTION, SECTION_DEBUG, NULL)); + switch_to_section (debug_frame_section); ASM_GENERATE_INTERNAL_LABEL (section_start_label, FRAME_BEGIN_LABEL, for_eh); ASM_OUTPUT_LABEL (asm_out_file, section_start_label); @@ -2360,7 +2361,7 @@ output_call_frame_info (int for_eh) dw2_asm_output_delta (4, l1, section_start_label, "FDE CIE offset"); else dw2_asm_output_offset (DWARF_OFFSET_SIZE, section_start_label, - "FDE CIE offset"); + debug_frame_section, "FDE CIE offset"); if (for_eh) { @@ -2655,8 +2656,9 @@ enum dw_val_class dw_val_class_die_ref, dw_val_class_fde_ref, dw_val_class_lbl_id, - dw_val_class_lbl_offset, - dw_val_class_str + dw_val_class_lineptr, + dw_val_class_str, + dw_val_class_macptr }; /* Describe a double word constant value. */ @@ -3984,7 +3986,8 @@ static inline dw_loc_list_ref AT_loc_list (dw_attr_ref); static void add_AT_addr (dw_die_ref, enum dwarf_attribute, rtx); static inline rtx AT_addr (dw_attr_ref); static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *); -static void add_AT_lbl_offset (dw_die_ref, enum dwarf_attribute, const char *); +static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *); +static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *); static void add_AT_offset (dw_die_ref, enum dwarf_attribute, unsigned HOST_WIDE_INT); static void add_AT_range_list (dw_die_ref, enum dwarf_attribute, @@ -5159,16 +5162,34 @@ add_AT_lbl_id (dw_die_ref die, enum dwarf_attribute attr_kind, const char *lbl_i add_dwarf_attr (die, attr); } -/* Add a section offset attribute value to a DIE. */ +/* Add a section offset attribute value to a DIE, an offset into the + debug_line section. */ static inline void -add_AT_lbl_offset (dw_die_ref die, enum dwarf_attribute attr_kind, const char *label) +add_AT_lineptr (dw_die_ref die, enum dwarf_attribute attr_kind, + const char *label) { dw_attr_ref attr = ggc_alloc (sizeof (dw_attr_node)); attr->dw_attr_next = NULL; attr->dw_attr = attr_kind; - attr->dw_attr_val.val_class = dw_val_class_lbl_offset; + attr->dw_attr_val.val_class = dw_val_class_lineptr; + attr->dw_attr_val.v.val_lbl_id = xstrdup (label); + add_dwarf_attr (die, attr); +} + +/* Add a section offset attribute value to a DIE, an offset into the + debug_macinfo section. */ + +static inline void +add_AT_macptr (dw_die_ref die, enum dwarf_attribute attr_kind, + const char *label) +{ + dw_attr_ref attr = ggc_alloc (sizeof (dw_attr_node)); + + attr->dw_attr_next = NULL; + attr->dw_attr = attr_kind; + attr->dw_attr_val.val_class = dw_val_class_macptr; attr->dw_attr_val.v.val_lbl_id = xstrdup (label); add_dwarf_attr (die, attr); } @@ -5207,7 +5228,8 @@ static inline const char * AT_lbl (dw_attr_ref a) { gcc_assert (a && (AT_class (a) == dw_val_class_lbl_id - || AT_class (a) == dw_val_class_lbl_offset)); + || AT_class (a) == dw_val_class_lineptr + || AT_class (a) == dw_val_class_macptr)); return a->dw_attr_val.v.val_lbl_id; } @@ -5723,7 +5745,8 @@ print_die (dw_die_ref die, FILE *outfile) fprintf (outfile, "die -> <null>"); break; case dw_val_class_lbl_id: - case dw_val_class_lbl_offset: + case dw_val_class_lineptr: + case dw_val_class_macptr: fprintf (outfile, "label: %s", AT_lbl (a)); break; case dw_val_class_str: @@ -5937,7 +5960,8 @@ attr_checksum (dw_attr_ref at, struct md5_ctx *ctx, int *mark) case dw_val_class_fde_ref: case dw_val_class_lbl_id: - case dw_val_class_lbl_offset: + case dw_val_class_lineptr: + case dw_val_class_macptr: break; default: @@ -6038,7 +6062,8 @@ same_dw_val_p (dw_val_node *v1, dw_val_node *v2, int *mark) case dw_val_class_fde_ref: case dw_val_class_lbl_id: - case dw_val_class_lbl_offset: + case dw_val_class_lineptr: + case dw_val_class_macptr: return 1; default: @@ -6612,7 +6637,8 @@ size_of_die (dw_die_ref die) case dw_val_class_lbl_id: size += DWARF2_ADDR_SIZE; break; - case dw_val_class_lbl_offset: + case dw_val_class_lineptr: + case dw_val_class_macptr: size += DWARF_OFFSET_SIZE; break; case dw_val_class_str: @@ -6804,7 +6830,8 @@ value_format (dw_attr_ref a) return DW_FORM_data; case dw_val_class_lbl_id: return DW_FORM_addr; - case dw_val_class_lbl_offset: + case dw_val_class_lineptr: + case dw_val_class_macptr: return DW_FORM_data; case dw_val_class_str: return AT_string_form (a); @@ -7023,7 +7050,7 @@ output_die (dw_die_ref die) sprintf (p, "+" HOST_WIDE_INT_PRINT_HEX, a->dw_attr_val.v.val_offset); dw2_asm_output_offset (DWARF_OFFSET_SIZE, ranges_section_label, - "%s", name); + debug_ranges_section, "%s", name); *p = '\0'; } break; @@ -7105,7 +7132,8 @@ output_die (dw_die_ref die) char *sym = AT_loc_list (a)->ll_symbol; gcc_assert (sym); - dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, "%s", name); + dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section, + "%s", name); } break; @@ -7115,7 +7143,8 @@ output_die (dw_die_ref die) char *sym = AT_ref (a)->die_symbol; gcc_assert (sym); - dw2_asm_output_offset (DWARF2_ADDR_SIZE, sym, "%s", name); + dw2_asm_output_offset (DWARF2_ADDR_SIZE, sym, debug_info_section, + "%s", name); } else { @@ -7131,7 +7160,8 @@ output_die (dw_die_ref die) ASM_GENERATE_INTERNAL_LABEL (l1, FDE_LABEL, a->dw_attr_val.v.val_fde_index * 2); - dw2_asm_output_offset (DWARF_OFFSET_SIZE, l1, "%s", name); + dw2_asm_output_offset (DWARF_OFFSET_SIZE, l1, debug_frame_section, + "%s", name); } break; @@ -7139,14 +7169,21 @@ output_die (dw_die_ref die) dw2_asm_output_addr (DWARF2_ADDR_SIZE, AT_lbl (a), "%s", name); break; - case dw_val_class_lbl_offset: - dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), "%s", name); + case dw_val_class_lineptr: + dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), + debug_line_section, "%s", name); + break; + + case dw_val_class_macptr: + dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), + debug_macinfo_section, "%s", name); break; case dw_val_class_str: if (AT_string_form (a) == DW_FORM_strp) dw2_asm_output_offset (DWARF_OFFSET_SIZE, a->dw_attr_val.v.val_str->label, + debug_str_section, "%s: \"%s\"", name, AT_string (a)); else dw2_asm_output_nstring (AT_string (a), -1, "%s", name); @@ -7180,6 +7217,7 @@ output_compilation_unit_header (void) "Length of Compilation Unit Info"); dw2_asm_output_data (2, DWARF_VERSION, "DWARF version number"); dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label, + debug_abbrev_section, "Offset Into Abbrev. Section"); dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)"); } @@ -7287,6 +7325,7 @@ output_pubnames (void) "Length of Public Names Info"); dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version"); dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label, + debug_info_section, "Offset of Compilation Unit Info"); dw2_asm_output_data (DWARF_OFFSET_SIZE, next_die_offset, "Compilation Unit Length"); @@ -7345,6 +7384,7 @@ output_aranges (void) "Length of Address Ranges Info"); dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version"); dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label, + debug_info_section, "Offset of Compilation Unit Info"); dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address"); dw2_asm_output_data (1, 0, "Size of Segment Descriptor"); @@ -13732,6 +13772,8 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) DEBUG_STR_SECTION_FLAGS, NULL); debug_ranges_section = get_section (DEBUG_RANGES_SECTION, SECTION_DEBUG, NULL); + debug_frame_section = get_section (DEBUG_FRAME_SECTION, + SECTION_DEBUG, NULL); ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, @@ -14142,11 +14184,11 @@ dwarf2out_finish (const char *filename) } if (debug_info_level >= DINFO_LEVEL_NORMAL) - add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list, - debug_line_section_label); + add_AT_lineptr (comp_unit_die, DW_AT_stmt_list, + debug_line_section_label); if (debug_info_level >= DINFO_LEVEL_VERBOSE) - add_AT_lbl_offset (comp_unit_die, DW_AT_macro_info, macinfo_section_label); + add_AT_macptr (comp_unit_die, DW_AT_macro_info, macinfo_section_label); /* Output all of the compilation units. We put the main one last so that the offsets are available to output_pubnames. */ |