config.host (powerpc-ibm-aix*): Add crtdbase.o to extra_parts.

libgcc/
        * 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.

gcc/
        * 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.

Co-Authored-By: David Edelsohn <dje.gcc@gmail.com>

From-SVN: r227906
This commit is contained in:
Andrew Dixie 2015-09-18 14:10:36 +00:00 committed by David Edelsohn
parent 8cd60b238b
commit 04218b3564
16 changed files with 196 additions and 57 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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 }"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
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));
}
}
switch_to_section (eh_frame_section);
#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

View File

@ -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);

View File

@ -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 \

View File

@ -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):

View File

@ -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"

View File

@ -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

View File

@ -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 $<