diff options
-rw-r--r-- | gcc/ChangeLog | 35 | ||||
-rw-r--r-- | gcc/collect2.c | 22 | ||||
-rw-r--r-- | gcc/config/i386/i386-interix.h | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 26 | ||||
-rw-r--r-- | gcc/config/spu/spu-elf.h | 2 | ||||
-rw-r--r-- | gcc/defaults.h | 2 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 20 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 20 | ||||
-rw-r--r-- | gcc/dwarf2asm.c | 7 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 35 | ||||
-rw-r--r-- | gcc/except.c | 30 | ||||
-rw-r--r-- | gcc/system.h | 2 | ||||
-rw-r--r-- | libgcc/ChangeLog | 7 | ||||
-rw-r--r-- | libgcc/config.host | 2 | ||||
-rw-r--r-- | libgcc/config/rs6000/crtdbase.S | 31 | ||||
-rw-r--r-- | libgcc/config/rs6000/t-aix-cxa | 3 |
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 $< |