summaryrefslogtreecommitdiffstats
path: root/gcc/config
diff options
context:
space:
mode:
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-17 00:35:32 +0000
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-17 00:35:32 +0000
commitd08d29c0a2f001af35b7c79b5b2e8623add3e83e (patch)
tree359478b0e30ffc64cd80686f3c7f1ec0e630674d /gcc/config
parent25406960c6ac042b9d8d9b5aa129250d55090b80 (diff)
downloadppe42-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.h3
-rw-r--r--gcc/config/darwin.c80
-rw-r--r--gcc/config/darwin.h29
-rw-r--r--gcc/config/i386/cygming.h14
-rw-r--r--gcc/config/i386/i386.c3
-rw-r--r--gcc/config/ia64/ia64.h12
-rw-r--r--gcc/config/rs6000/rs6000.c1
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++)
OpenPOWER on IntegriCloud