diff options
author | geoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-17 00:35:32 +0000 |
---|---|---|
committer | geoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-17 00:35:32 +0000 |
commit | d08d29c0a2f001af35b7c79b5b2e8623add3e83e (patch) | |
tree | 359478b0e30ffc64cd80686f3c7f1ec0e630674d /gcc/config | |
parent | 25406960c6ac042b9d8d9b5aa129250d55090b80 (diff) | |
download | ppe42-gcc-d08d29c0a2f001af35b7c79b5b2e8623add3e83e.tar.gz ppe42-gcc-d08d29c0a2f001af35b7c79b5b2e8623add3e83e.zip |
* doc/tm.texi (SDB and DWARF): Add extra parameter to
ASM_OUTPUT_DWARF_OFFSET. Use @var to indicate metavariables.
* dwarf2asm.h (dw2_asm_output_offset): Add section parameter.
* dwarf2asm.c (dw2_asm_output_offset): Add base section parameter.
Pass to ASM_OUTPUT_DWARF_OFFSET.
* dwarf2out.c (debug_frame_section): New.
(output_call_frame_info): Use debug_frame_section. Pass it to
dw2_asm_output_offset.
(output_die): Pass appropriate section to dw2_asm_output_offset.
(output_compilation_unit_header): Likewise.
(output_pubnames): Likewise.
(output_aranges): Likewise.
(enum dw_val_class): Break dw_val_class_lbl_offset into
dw_val_class_lineptr and dw_val_class_macptr.
(add_AT_lbl_offset): Delete.
(add_AT_lineptr): New.
(add_AT_macptr): New.
(AT_lbl): Expect a lineptr or macptr.
(print_die): Handle dw_val_class_lineptr and dw_val_class_macptr.
(attr_checksum): Likewise.
(same_dw_val_p): Likewise.
(size_of_die): Likewise.
(value_format): Likewise.
(output_die): Likewise.
(dwarf2out_finish): Call add_AT_lineptr and add_AT_macptr instead of
add_AT_lbl_offset.
* config/i386/cygming.h (ASM_OUTPUT_DWARF_OFFSET): Add extra parameter.
* config/i386/i386.c (x86_file_start): Call darwin_file_start.
* config/darwin-protos.h (darwin_file_start): New.
(darwin_asm_output_dwarf_offset): New.
* config/ia64/ia64.h (ASM_OUTPUT_DWARF_OFFSET): Add extra parameter.
* config/rs6000/rs6000.c (rs6000_darwin_file_start): Call
darwin_file_start.
* config/darwin.c (darwin_emit_unwind_label): Don't output label
if not EH section; simplify.
(darwin_file_start): New.
(darwin_asm_output_dwarf_offset): New.
* config/darwin.h (DEBUG_FRAME_SECTION): In __DWARF segment,
mark as 'debug'.
(DEBUG_INFO_SECTION): Likewise.
(DEBUG_ABBREV_SECTION): Likewise.
(DEBUG_ARANGES_SECTION): Likewise.
(DEBUG_MACINFO_SECTION): Likewise.
(DEBUG_LINE_SECTION): Likewise.
(DEBUG_LOC_SECTION): Likewise.
(DEBUG_PUBNAMES_SECTION): Likewise.
(DEBUG_STR_SECTION): Likewise.
(DEBUG_RANGES_SECTION): Likewise.
(FRAME_BEGIN_LABEL): Must start with 'L' in debug section.
(ASM_OUTPUT_DWARF_OFFSET): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112168 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/darwin-protos.h | 3 | ||||
-rw-r--r-- | gcc/config/darwin.c | 80 | ||||
-rw-r--r-- | gcc/config/darwin.h | 29 | ||||
-rw-r--r-- | gcc/config/i386/cygming.h | 14 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 3 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 12 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 1 |
7 files changed, 98 insertions, 44 deletions
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h index 75308fb6f48..abcb172b926 100644 --- a/gcc/config/darwin-protos.h +++ b/gcc/config/darwin-protos.h @@ -66,6 +66,7 @@ extern void darwin_pragma_ignore (struct cpp_reader *); extern void darwin_pragma_options (struct cpp_reader *); extern void darwin_pragma_unused (struct cpp_reader *); +extern void darwin_file_start (void); extern void darwin_file_end (void); extern void darwin_mark_decl_preserved (const char *); @@ -78,6 +79,8 @@ extern void darwin_globalize_label (FILE *, const char *); extern void darwin_assemble_visibility (tree, int); extern void darwin_asm_output_dwarf_delta (FILE *, int, const char *, const char *); +extern void darwin_asm_output_dwarf_offset (FILE *, int, const char *, + section *); extern bool darwin_binds_local_p (tree); extern void darwin_cpp_builtins (struct cpp_reader *); extern void darwin_asm_output_anchor (rtx symbol); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 2ae24a9661f..4db4cc68239 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -1328,31 +1328,16 @@ darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty) ? DECL_ASSEMBLER_NAME (decl) : DECL_NAME (decl); - const char *prefix = user_label_prefix; - const char *base = IDENTIFIER_POINTER (id); - unsigned int base_len = IDENTIFIER_LENGTH (id); - - const char *suffix = ".eh"; - int need_quotes = name_needs_quotes (base); - int quotes_len = need_quotes ? 2 : 0; + bool need_quotes = name_needs_quotes (base); char *lab; if (! for_eh) - suffix = ".eh1"; - - lab = XNEWVEC (char, strlen (prefix) - + base_len + strlen (suffix) + quotes_len + 1); - lab[0] = '\0'; + return; - if (need_quotes) - strcat(lab, "\""); - strcat(lab, prefix); - strcat(lab, base); - strcat(lab, suffix); - if (need_quotes) - strcat(lab, "\""); + lab = concat (need_quotes ? "\"" : "", user_label_prefix, base, ".eh", + need_quotes ? "\"" : "", NULL); if (TREE_PUBLIC (decl)) fprintf (file, "\t%s %s\n", @@ -1457,6 +1442,63 @@ darwin_asm_output_dwarf_delta (FILE *file, int size, fprintf (file, "\n\t%s L$set$%d", directive, darwin_dwarf_label_counter++); } +/* Output labels for the start of the DWARF sections if necessary. */ +void +darwin_file_start (void) +{ + if (write_symbols == DWARF2_DEBUG) + { + static const char * const debugnames[] = + { + DEBUG_FRAME_SECTION, + DEBUG_INFO_SECTION, + DEBUG_ABBREV_SECTION, + DEBUG_ARANGES_SECTION, + DEBUG_MACINFO_SECTION, + DEBUG_LINE_SECTION, + DEBUG_LOC_SECTION, + DEBUG_PUBNAMES_SECTION, + DEBUG_STR_SECTION, + DEBUG_RANGES_SECTION + }; + size_t i; + + for (i = 0; i < ARRAY_SIZE (debugnames); i++) + { + int namelen; + + switch_to_section (get_section (debugnames[i], SECTION_DEBUG, NULL)); + + gcc_assert (strncmp (debugnames[i], "__DWARF,", 8) == 0); + gcc_assert (strchr (debugnames[i] + 8, ',')); + + namelen = strchr (debugnames[i] + 8, ',') - (debugnames[i] + 8); + fprintf (asm_out_file, "Lsection%.*s:\n", namelen, debugnames[i] + 8); + } + } +} + +/* Output an offset in a DWARF section on Darwin. On Darwin, DWARF section + offsets are not represented using relocs in .o files; either the + section never leaves the .o file, or the linker or other tool is + responsible for parsing the DWARF and updating the offsets. */ + +void +darwin_asm_output_dwarf_offset (FILE *file, int size, const char * lab, + section *base) +{ + char sname[64]; + int namelen; + + gcc_assert (base->common.flags & SECTION_NAMED); + gcc_assert (strncmp (base->named.name, "__DWARF,", 8) == 0); + gcc_assert (strchr (base->named.name + 8, ',')); + + namelen = strchr (base->named.name + 8, ',') - (base->named.name + 8); + sprintf (sname, "*Lsection%.*s", namelen, base->named.name + 8); + darwin_asm_output_dwarf_delta (file, size, lab, sname); +} + void darwin_file_end (void) { diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index edced4d80cf..8b836f88655 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -360,16 +360,16 @@ Boston, MA 02110-1301, USA. */ #define DWARF2_DEBUGGING_INFO #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG -#define DEBUG_FRAME_SECTION "__DWARFA,__debug_frame,coalesced,no_toc+strip_static_syms" -#define DEBUG_INFO_SECTION "__DWARFA,__debug_info" -#define DEBUG_ABBREV_SECTION "__DWARFA,__debug_abbrev" -#define DEBUG_ARANGES_SECTION "__DWARFA,__debug_aranges" -#define DEBUG_MACINFO_SECTION "__DWARFA,__debug_macinfo" -#define DEBUG_LINE_SECTION "__DWARFA,__debug_line" -#define DEBUG_LOC_SECTION "__DWARFA,__debug_loc" -#define DEBUG_PUBNAMES_SECTION "__DWARFA,__debug_pubnames" -#define DEBUG_STR_SECTION "__DWARFA,__debug_str" -#define DEBUG_RANGES_SECTION "__DWARFA,__debug_ranges" +#define DEBUG_FRAME_SECTION "__DWARF,__debug_frame,regular,debug" +#define DEBUG_INFO_SECTION "__DWARF,__debug_info,regular,debug" +#define DEBUG_ABBREV_SECTION "__DWARF,__debug_abbrev,regular,debug" +#define DEBUG_ARANGES_SECTION "__DWARF,__debug_aranges,regular,debug" +#define DEBUG_MACINFO_SECTION "__DWARF,__debug_macinfo,regular,debug" +#define DEBUG_LINE_SECTION "__DWARF,__debug_line,regular,debug" +#define DEBUG_LOC_SECTION "__DWARF,__debug_loc,regular,debug" +#define DEBUG_PUBNAMES_SECTION "__DWARF,__debug_pubnames,regular,debug" +#define DEBUG_STR_SECTION "__DWARF,__debug_str,regular,debug" +#define DEBUG_RANGES_SECTION "__DWARF,__debug_ranges,regular,debug" /* When generating stabs debugging, use N_BINCL entries. */ @@ -439,9 +439,11 @@ Boston, MA 02110-1301, USA. */ #define TARGET_USES_WEAK_UNWIND_INFO 1 /* We need to use a nonlocal label for the start of an EH frame: the - Darwin linker requires that a coalesced section start with a label. */ + Darwin linker requires that a coalesced section start with a label. + Unfortunately, it also requires that 'debug' sections don't contain + labels. */ #undef FRAME_BEGIN_LABEL -#define FRAME_BEGIN_LABEL "EH_frame" +#define FRAME_BEGIN_LABEL (for_eh ? "EH_frame" : "Lframe") /* Emit a label for the FDE corresponding to DECL. EMPTY means emit a label for an empty FDE. */ @@ -798,6 +800,9 @@ enum machopic_addr_class { #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \ darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2) +#define ASM_OUTPUT_DWARF_OFFSET(FILE,SIZE,LABEL,BASE) \ + darwin_asm_output_dwarf_offset (FILE, SIZE, LABEL, BASE) + #define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(ASM_OUT_FILE, ENCODING, SIZE, ADDR, DONE) \ if (ENCODING == ASM_PREFERRED_EH_DATA_FORMAT (2, 1)) { \ darwin_non_lazy_pcrel (ASM_OUT_FILE, ADDR); \ diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index bb02b7b8d49..1fe8e4e3f82 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -37,13 +37,13 @@ Boston, MA 02110-1301, USA. */ /* Use section relative relocations for debugging offsets. Unlike other targets that fake this by putting the section VMA at 0, PE won't allow it. */ -#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL) \ - do { \ - if (SIZE != 4) \ - abort (); \ - \ - fputs ("\t.secrel32\t", FILE); \ - assemble_name (FILE, LABEL); \ +#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL, SECTION) \ + do { \ + if (SIZE != 4) \ + abort (); \ + \ + fputs ("\t.secrel32\t", FILE); \ + assemble_name (FILE, LABEL); \ } while (0) #endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 04b730aa690..90e46b80da3 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -17457,6 +17457,9 @@ static void x86_file_start (void) { default_file_start (); +#if TARGET_MACHO + darwin_file_start (); +#endif if (X86_FILE_START_VERSION_DIRECTIVE) fputs ("\t.version\t\"01.01\"\n", asm_out_file); if (X86_FILE_START_FLTUSED) diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 0e036dede93..a4e0c7eba2c 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1891,12 +1891,12 @@ do { \ /* Use section-relative relocations for debugging offsets. Unlike other targets that fake this by putting the section VMA at 0, IA-64 has proper relocations for them. */ -#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL) \ - do { \ - fputs (integer_asm_op (SIZE, FALSE), FILE); \ - fputs ("@secrel(", FILE); \ - assemble_name (FILE, LABEL); \ - fputc (')', FILE); \ +#define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL, SECTION) \ + do { \ + fputs (integer_asm_op (SIZE, FALSE), FILE); \ + fputs ("@secrel(", FILE); \ + assemble_name (FILE, LABEL); \ + fputc (')', FILE); \ } while (0) /* Emit a PC-relative relocation. */ diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 23f76c38e9c..aeebf80f6a8 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -18048,6 +18048,7 @@ rs6000_darwin_file_start (void) size_t i; rs6000_file_start (); + darwin_file_start (); /* Determine the argument to -mcpu=. Default to G3 if not specified. */ for (i = 0; i < ARRAY_SIZE (rs6000_select); i++) |