aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog35
-rw-r--r--gcc/collect2.c22
-rw-r--r--gcc/config/i386/i386-interix.h5
-rw-r--r--gcc/config/rs6000/rs6000.c26
-rw-r--r--gcc/config/spu/spu-elf.h2
-rw-r--r--gcc/defaults.h2
-rw-r--r--gcc/doc/tm.texi20
-rw-r--r--gcc/doc/tm.texi.in20
-rw-r--r--gcc/dwarf2asm.c7
-rw-r--r--gcc/dwarf2out.c35
-rw-r--r--gcc/except.c30
-rw-r--r--gcc/system.h2
-rw-r--r--libgcc/ChangeLog7
-rw-r--r--libgcc/config.host2
-rw-r--r--libgcc/config/rs6000/crtdbase.S31
-rw-r--r--libgcc/config/rs6000/t-aix-cxa3
16 files changed, 194 insertions, 55 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 36dcd5e..c8c4412 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,38 @@
+2015-09-18 Andrew Dixie <andrewd@gentrack.com>
+ David Edelsohn <dje.gcc@gmail.com>
+
+ * defaults.h (EH_FRAME_SECTION_NAME): Depend on
+ EH_FRAME_THROUGH_COLLECT2.
+ * dwarf2asm.c (dw2_asm_output_encoded_addr_rtx): Add case for
+ DW_EH_PE_datarel.
+ * dwarf2out.c (switch_to_eh_frame_section): Use a read-only section
+ even if EH_FRAME_SECTION_NAME is undefined. Restrict special
+ collect2 labels to EH_FRAME_THROUGH_COLLECT2.
+ * except.c (switch_to_exception_section): Use a read-only section
+ even if EH_FRAME_SECTION_NAME is undefined.
+ * system.h (EH_FRAME_IN_DATA_SECTION): Poison.
+ * collect2.c (write_c_file_stat): Provide dbase on AIX.
+ (scan_prog_file): Don't export __dso_handle nor
+ __gcc_unwind_dbase.
+ * config/rs6000/aix.h (ASM_PREFERRED_EH_DATA_FORMAT): Define.
+ (EH_TABLES_CAN_BE_READ_ONLY): Define.
+ (ASM_OUTPUT_DWARF_PCREL): Define.
+ (ASM_OUTPUT_DWARF_DATAREL): Define.
+ (EH_FRAME_THROUGH_COLLECT2): Define.
+ (EH_FRAME_IN_DATA_SECTION): Delete.
+ * config/rs6000/rs6000.c (rs6000_aix_asm_output_dwarf_pcrel): New.
+ (rs6000_aix_asm_output_dwarf_datarel): New.
+ (rs6000_xcoff_asm_init_sections): Don't set exception_section.
+ * config/spu/spu-elf.h (EH_FRAME_IN_DATA_SECTION): Delete.
+ (EH_FRAME_THROUGH_COLLECT2): Define.
+ * config/i386/i386-interix.h (EH_FRAME_IN_DATA_SECTION): Delete.
+ (EH_FRAME_THROUGH_COLLECT2): Define.
+ (EH_TABLES_CAN_BE_READ_ONLY): Define.
+ * doc/tm.texi.in (EH_FRAME_IN_DATA_SECTION): Delete.
+ (EH_FRAME_THROUGH_COLLECT2): New.
+ (ASM_OUTPUT_DWARF_DATAREL): New.
+ * doc/tm.texi: Regenerate.
+
2015-09-18 Richard Biener <rguenther@suse.de>
* dwarf2out.c (append_entry_to_tmpl_value_parm_die_table): Assert
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 5a7e874..20c2533 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -2108,12 +2108,23 @@ write_c_file_stat (FILE *stream, const char *name ATTRIBUTE_UNUSED)
fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n");
+ fprintf (stream, "extern void __register_frame_info_table_bases (void *, struct object *, void *tbase, void *dbase);\n");
fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
fprintf (stream, "extern void *__deregister_frame_info (void *);\n");
+#ifdef TARGET_AIX_VERSION
+ fprintf (stream, "extern void *__gcc_unwind_dbase;\n");
+#endif
fprintf (stream, "static void reg_frame () {\n");
fprintf (stream, "\tstatic struct object ob;\n");
+#ifdef TARGET_AIX_VERSION
+ /* Use __gcc_unwind_dbase as the base address for data on AIX.
+ This might not be the start of the segment, signed offsets assumed.
+ */
+ fprintf (stream, "\t__register_frame_info_table_bases (frame_table, &ob, (void *)0, &__gcc_unwind_dbase);\n");
+#else
fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
+#endif
fprintf (stream, "\t}\n");
fprintf (stream, "static void dereg_frame () {\n");
@@ -2878,7 +2889,16 @@ scan_prog_file (const char *prog_name, scanpass which_pass,
provides an explicit export list. */
if (shared_obj && !is_shared
&& which_pass == PASS_OBJ && !export_flag)
- add_to_list (&exports, name);
+ {
+ /* Do not auto-export __dso_handle or
+ __gcc_unwind_dbase. They are required
+ to be local to each module. */
+ if (strcmp(name, "__dso_handle") != 0
+ && strcmp(name, "__gcc_unwind_dbase") != 0)
+ {
+ add_to_list (&exports, name);
+ }
+ }
#endif
continue;
}
diff --git a/gcc/config/i386/i386-interix.h b/gcc/config/i386/i386-interix.h
index b472d8e..97dbcd9 100644
--- a/gcc/config/i386/i386-interix.h
+++ b/gcc/config/i386/i386-interix.h
@@ -153,8 +153,6 @@ do { \
#define drectve_section() /* nothing */
-#define EH_FRAME_IN_DATA_SECTION
-
#define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rdata,\"r\""
/* Define this macro if references to a symbol must be treated
@@ -326,7 +324,8 @@ while (0)
: ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (int) (n)+8 \
: (int) (-1))
-#define EH_FRAME_IN_DATA_SECTION
+#define EH_FRAME_THROUGH_COLLECT2
+#define EH_TABLES_CAN_BE_READ_ONLY 0
/* the following are OSF linker (not gld) specific... we don't want them */
#undef HAS_INIT_SECTION
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 7278792..8a22af6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -30790,7 +30790,6 @@ rs6000_xcoff_asm_init_sections (void)
= get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);
readonly_data_section = read_only_data_section;
- exception_section = data_section;
}
static int
@@ -31159,6 +31158,31 @@ rs6000_xcoff_declare_object_name (FILE *file, const char *name, tree decl)
symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias, &data, true);
}
+/* Overide the default 'SYMBOL-.' syntax with AIX compatible 'SYMBOL-$'. */
+
+void
+rs6000_asm_output_dwarf_pcrel (FILE *file, int size, const char *label)
+{
+ fputs (integer_asm_op (size, FALSE), file);
+ assemble_name (file, label);
+ fputs ("-$", file);
+}
+
+/* Output a symbol offset relative to the dbase for the current object.
+ We use __gcc_unwind_dbase as an arbitrary base for dbase and assume
+ signed offsets.
+
+ __gcc_unwind_dbase is embedded in all executables/libraries through
+ libgcc/config/rs6000/crtdbase.S. */
+
+void
+rs6000_asm_output_dwarf_datarel (FILE *file, int size, const char *label)
+{
+ fputs (integer_asm_op (size, FALSE), file);
+ assemble_name (file, label);
+ fputs("-__gcc_unwind_dbase", file);
+}
+
#ifdef HAVE_AS_TLS
static void
rs6000_xcoff_encode_section_info (tree decl, rtx rtl, int first)
diff --git a/gcc/config/spu/spu-elf.h b/gcc/config/spu/spu-elf.h
index c509870..46d3501 100644
--- a/gcc/config/spu/spu-elf.h
+++ b/gcc/config/spu/spu-elf.h
@@ -61,7 +61,7 @@
#undef TARGET_ASM_NAMED_SECTION
#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
-#define EH_FRAME_IN_DATA_SECTION 1
+#define EH_FRAME_THROUGH_COLLECT2 1
#define LINK_SPEC "%{mlarge-mem: --defsym __stack=0xfffffff0 }"
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 9ca9df2..14ef91a 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -351,7 +351,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* If we have named sections, and we're using crtstuff to run ctors,
use them for registering eh frame information. */
#if defined (TARGET_ASM_NAMED_SECTION) && DWARF2_UNWIND_INFO \
- && !defined (EH_FRAME_IN_DATA_SECTION)
+ && !defined (EH_FRAME_THROUGH_COLLECT2)
#ifndef EH_FRAME_SECTION_NAME
#define EH_FRAME_SECTION_NAME ".eh_frame"
#endif
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 65fb865..eb495a8 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -8962,14 +8962,15 @@ You should define this symbol if your target supports DWARF 2 frame
unwind information and the default definition does not work.
@end defmac
-@defmac EH_FRAME_IN_DATA_SECTION
-If defined, DWARF 2 frame unwind information will be placed in the
-data section even though the target supports named sections. This
-might be necessary, for instance, if the system linker does garbage
-collection and sections cannot be marked as not to be collected.
+@defmac EH_FRAME_THROUGH_COLLECT2
+If defined, DWARF 2 frame unwind information will identified by
+specially named labels. The collect2 process will locate these
+labels and generate code to register the frames.
-Do not define this macro unless @code{TARGET_ASM_NAMED_SECTION} is
-also defined.
+This might be necessary, for instance, if the system linker will not
+place the eh_frames in-between the sentinals from @file{crtstuff.c},
+or if the system linker does garbage collection and sections cannot
+be marked as not to be collected.
@end defmac
@defmac EH_TABLES_CAN_BE_READ_ONLY
@@ -9597,6 +9598,11 @@ A C statement to issue assembly directives that create a self-relative
reference to the given @var{label}, using an integer of the given @var{size}.
@end defmac
+@defmac ASM_OUTPUT_DWARF_DATAREL (@var{stream}, @var{size}, @var{label})
+A C statement to issue assembly directives that create a reference to the
+given @var{label} relative to the dbase, using an integer of the given @var{size}.
+@end defmac
+
@defmac ASM_OUTPUT_DWARF_TABLE_REF (@var{label})
A C statement to issue assembly directives that create a reference to
the DWARF table identifier @var{label} from the current section. This
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 8fe193c..92835c1 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -6477,14 +6477,15 @@ You should define this symbol if your target supports DWARF 2 frame
unwind information and the default definition does not work.
@end defmac
-@defmac EH_FRAME_IN_DATA_SECTION
-If defined, DWARF 2 frame unwind information will be placed in the
-data section even though the target supports named sections. This
-might be necessary, for instance, if the system linker does garbage
-collection and sections cannot be marked as not to be collected.
+@defmac EH_FRAME_THROUGH_COLLECT2
+If defined, DWARF 2 frame unwind information will identified by
+specially named labels. The collect2 process will locate these
+labels and generate code to register the frames.
-Do not define this macro unless @code{TARGET_ASM_NAMED_SECTION} is
-also defined.
+This might be necessary, for instance, if the system linker will not
+place the eh_frames in-between the sentinals from @file{crtstuff.c},
+or if the system linker does garbage collection and sections cannot
+be marked as not to be collected.
@end defmac
@defmac EH_TABLES_CAN_BE_READ_ONLY
@@ -7033,6 +7034,11 @@ A C statement to issue assembly directives that create a self-relative
reference to the given @var{label}, using an integer of the given @var{size}.
@end defmac
+@defmac ASM_OUTPUT_DWARF_DATAREL (@var{stream}, @var{size}, @var{label})
+A C statement to issue assembly directives that create a reference to the
+given @var{label} relative to the dbase, using an integer of the given @var{size}.
+@end defmac
+
@defmac ASM_OUTPUT_DWARF_TABLE_REF (@var{label})
A C statement to issue assembly directives that create a reference to
the DWARF table identifier @var{label} from the current section. This
diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c
index 9f3c4b1..3a30fe4 100644
--- a/gcc/dwarf2asm.c
+++ b/gcc/dwarf2asm.c
@@ -984,6 +984,13 @@ dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, bool is_public,
dw2_assemble_integer (size, addr);
break;
+#ifdef ASM_OUTPUT_DWARF_DATAREL
+ case DW_EH_PE_datarel:
+ gcc_assert (GET_CODE (addr) == SYMBOL_REF);
+ ASM_OUTPUT_DWARF_DATAREL (asm_out_file, size, XSTR (addr, 0));
+ break;
+#endif
+
case DW_EH_PE_pcrel:
gcc_assert (GET_CODE (addr) == SYMBOL_REF);
#ifdef ASM_OUTPUT_DWARF_PCREL
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 2fd889a..4a1c152 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -438,7 +438,6 @@ switch_to_eh_frame_section (bool back)
{
tree label;
-#ifdef EH_FRAME_SECTION_NAME
if (eh_frame_section == 0)
{
int flags;
@@ -466,27 +465,29 @@ switch_to_eh_frame_section (bool back)
}
else
flags = SECTION_WRITE;
+
+#ifdef EH_FRAME_SECTION_NAME
eh_frame_section = get_section (EH_FRAME_SECTION_NAME, flags, NULL);
- }
+#else
+ eh_frame_section = ((flags == SECTION_WRITE)
+ ? data_section : readonly_data_section);
#endif /* EH_FRAME_SECTION_NAME */
+ }
- if (eh_frame_section)
- switch_to_section (eh_frame_section);
- else
- {
- /* We have no special eh_frame section. Put the information in
- the data section and emit special labels to guide collect2. */
- switch_to_section (data_section);
+ switch_to_section (eh_frame_section);
- if (!back)
- {
- label = get_file_function_name ("F");
- ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
- targetm.asm_out.globalize_label (asm_out_file,
- IDENTIFIER_POINTER (label));
- ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
- }
+#ifdef EH_FRAME_THROUGH_COLLECT2
+ /* We have no special eh_frame section. Emit special labels to guide
+ collect2. */
+ if (!back)
+ {
+ label = get_file_function_name ("F");
+ ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
+ targetm.asm_out.globalize_label (asm_out_file,
+ IDENTIFIER_POINTER (label));
+ ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
}
+#endif
}
/* Switch [BACK] to the eh or debug frame table section, depending on
diff --git a/gcc/except.c b/gcc/except.c
index d59c539..86ad6bc 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -2838,24 +2838,24 @@ switch_to_exception_section (const char * ARG_UNUSED (fnname))
s = exception_section;
else
{
+ int flags;
+
+ if (EH_TABLES_CAN_BE_READ_ONLY)
+ {
+ int tt_format =
+ ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/1);
+ flags = ((! flag_pic
+ || ((tt_format & 0x70) != DW_EH_PE_absptr
+ && (tt_format & 0x70) != DW_EH_PE_aligned))
+ ? 0 : SECTION_WRITE);
+ }
+ else
+ flags = SECTION_WRITE;
+
/* Compute the section and cache it into exception_section,
unless it depends on the function name. */
if (targetm_common.have_named_sections)
{
- int flags;
-
- if (EH_TABLES_CAN_BE_READ_ONLY)
- {
- int tt_format =
- ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/1);
- flags = ((! flag_pic
- || ((tt_format & 0x70) != DW_EH_PE_absptr
- && (tt_format & 0x70) != DW_EH_PE_aligned))
- ? 0 : SECTION_WRITE);
- }
- else
- flags = SECTION_WRITE;
-
#ifdef HAVE_LD_EH_GC_SECTIONS
if (flag_function_sections
|| (DECL_COMDAT_GROUP (current_function_decl) && HAVE_COMDAT_GROUP))
@@ -2876,7 +2876,7 @@ switch_to_exception_section (const char * ARG_UNUSED (fnname))
}
else
exception_section
- = s = flag_pic ? data_section : readonly_data_section;
+ = s = flags == SECTION_WRITE ? data_section : readonly_data_section;
}
switch_to_section (s);
diff --git a/gcc/system.h b/gcc/system.h
index 3189bda..1ba5afc 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -956,7 +956,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
EXTRA_ADDRESS_CONSTRAINT CONST_DOUBLE_OK_FOR_CONSTRAINT_P \
CALLER_SAVE_PROFITABLE LARGEST_EXPONENT_IS_NORMAL \
ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT \
- LIBGCC2_LONG_DOUBLE_TYPE_SIZE STRUCT_VALUE
+ LIBGCC2_LONG_DOUBLE_TYPE_SIZE STRUCT_VALUE EH_FRAME_IN_DATA_SECTION
/* Hooks that are no longer used. */
#pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 472dd78..8d44ec2 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-09-18 Andrew Dixie <andrewd@gentrack.com>
+ David Edelsohn <dje.gcc@gmail.com>
+
+ * config.host (powerpc-ibm-aix*): Add crtdbase.o to extra_parts.
+ * config/rs6000/crtdbase.S: New file.
+ * config/rs6000/t-aix-cxa: Build crtdbase.o.
+
2015-09-15 Max Filippov <jcmvbkbc@gmail.com>
* config/xtensa/linux-unwind.h (xtensa_fallback_frame_state):
diff --git a/libgcc/config.host b/libgcc/config.host
index 3a2c75d..140aa22 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -1085,7 +1085,7 @@ rs6000-ibm-aix5.1.* | powerpc-ibm-aix5.1.*)
rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
md_unwind_header=rs6000/aix-unwind.h
tmake_file="t-fdpbit rs6000/t-ppc64-fp rs6000/t-slibgcc-aix rs6000/t-ibm-ldouble rs6000/t-aix-cxa"
- extra_parts="crtcxa.o crtcxa_s.o"
+ extra_parts="crtcxa.o crtcxa_s.o crtdbase.o"
;;
rl78-*-elf)
tmake_file="$tm_file t-fdpbit rl78/t-rl78"
diff --git a/libgcc/config/rs6000/crtdbase.S b/libgcc/config/rs6000/crtdbase.S
new file mode 100644
index 0000000..732d777
--- /dev/null
+++ b/libgcc/config/rs6000/crtdbase.S
@@ -0,0 +1,31 @@
+/* Defines __gcc_unwind_dbase
+
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3, or (at your option) any
+ later version.
+
+ This file is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Symbol used as an arbitrary base for offsets inside the data
+ * segment for unwind information. */
+ .file "crtdbase.S"
+ .globl __gcc_unwind_dbase
+ .csect __gcc_unwind_dbase[RW],2
+ .align 2
+__gcc_unwind_dbase:
+ .long 0
diff --git a/libgcc/config/rs6000/t-aix-cxa b/libgcc/config/rs6000/t-aix-cxa
index 4755c20..f230a88 100644
--- a/libgcc/config/rs6000/t-aix-cxa
+++ b/libgcc/config/rs6000/t-aix-cxa
@@ -5,6 +5,9 @@ LIB2ADD_ST += $(srcdir)/config/rs6000/aixinitfini.c
SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-aix-cxa.ver
+crtdbase.o: $(srcdir)/config/rs6000/crtdbase.S
+ $(crt_compile) -c $<
+
crtcxa.o: $(srcdir)/config/rs6000/crtcxa.c
$(crt_compile) -c $<