diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-04 21:13:45 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-04 21:13:45 +0000 |
commit | de419443a2a1c3641d6c0f6f0030d0cc7430f6b7 (patch) | |
tree | 9c480a988710c414dca64ed2b9737871dd52015e /gcc | |
parent | 8406dd56ec333e07e24a42e500ca937bc14b8758 (diff) | |
download | gcc-de419443a2a1c3641d6c0f6f0030d0cc7430f6b7.tar.gz |
* config.gcc (hppa*64*-*-hpux11*): Define extra_parts. Don't use
collect2.
* pa-hpux11.h (LDD_SUFFIX, PARSE_LDD_OUTPUT): Undefine.
(HAS_INIT_SECTION, LD_INIT_SWITCH, LD_FINI_SWITCH): Define.
* pa64-hpux.h (HP_INIT_ARRAY_SECTION_ASM_OP,
GNU_INIT_ARRAY_SECTION_ASM_OP, HP_FINI_ARRAY_SECTION_ASM_OP,
GNU_FINI_ARRAY_SECTION_ASM_OP): Define.
(CTORS_SECTION_ASM_OP, DTORS_SECTION_ASM_OP): Define when not using
elfos.h.
(EH_FRAME_IN_DATA_SECTION): Delete define.
(HAS_INIT_SECTION, LD_INIT_SWITCH, LD_FINI_SWITCH): Undefine.
(STARTFILE_SPEC): Use crtbegin.o.
(ENDFILE_SPEC): Use crtend.o.
(INIT_SECTION_ASM_OP, FINI_SECTION_ASM_OP, CRT_CALL_STATIC_FUNCTION,
SUPPORTS_INIT_PRIORITY, PA_CXA_FINALIZE_STUB, PA_INIT_FINI_HACK,
PA_INIT_FRAME_DUMMY_ASM_OP, PA_JV_REGISTERCLASSES_STUB,
DTOR_LIST_BEGIN): Define.
* pa.c (TARGET_ASM_CONSTRUCTOR): Define.
(pa_asm_out_constructor, pa_asm_out_destructor): New functions.
* som.h (SUPPORTS_INIT_PRIORITY): Delete define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@60892 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/config.gcc | 3 | ||||
-rw-r--r-- | gcc/config/pa/pa-hpux11.h | 13 | ||||
-rw-r--r-- | gcc/config/pa/pa.c | 51 | ||||
-rw-r--r-- | gcc/config/pa/pa64-hpux.h | 201 | ||||
-rw-r--r-- | gcc/config/pa/som.h | 4 |
6 files changed, 251 insertions, 44 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92b3da1e4f6..4fe99f7ad03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2002-01-04 John David Anglin <dave.anglin@nrc.ca> + + * config.gcc (hppa*64*-*-hpux11*): Define extra_parts. Don't use + collect2. + * pa-hpux11.h (LDD_SUFFIX, PARSE_LDD_OUTPUT): Undefine. + (HAS_INIT_SECTION, LD_INIT_SWITCH, LD_FINI_SWITCH): Define. + * pa64-hpux.h (HP_INIT_ARRAY_SECTION_ASM_OP, + GNU_INIT_ARRAY_SECTION_ASM_OP, HP_FINI_ARRAY_SECTION_ASM_OP, + GNU_FINI_ARRAY_SECTION_ASM_OP): Define. + (CTORS_SECTION_ASM_OP, DTORS_SECTION_ASM_OP): Define when not using + elfos.h. + (EH_FRAME_IN_DATA_SECTION): Delete define. + (HAS_INIT_SECTION, LD_INIT_SWITCH, LD_FINI_SWITCH): Undefine. + (STARTFILE_SPEC): Use crtbegin.o. + (ENDFILE_SPEC): Use crtend.o. + (INIT_SECTION_ASM_OP, FINI_SECTION_ASM_OP, CRT_CALL_STATIC_FUNCTION, + SUPPORTS_INIT_PRIORITY, PA_CXA_FINALIZE_STUB, PA_INIT_FINI_HACK, + PA_INIT_FRAME_DUMMY_ASM_OP, PA_JV_REGISTERCLASSES_STUB, + DTOR_LIST_BEGIN): Define. + * pa.c (TARGET_ASM_CONSTRUCTOR): Define. + (pa_asm_out_constructor, pa_asm_out_destructor): New functions. + * som.h (SUPPORTS_INIT_PRIORITY): Delete define. + 2002-12-31 Larin Hennessy <larin@science.oregonstate.edu> * fixinc/fixinc.svr4: Remove references to i860, Sony NewsOS, and spur. diff --git a/gcc/config.gcc b/gcc/config.gcc index 1c2ada8cee2..f2d0e351076 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -921,7 +921,7 @@ hppa*64*-*-hpux11*) tmake_file="pa/t-pa64 pa/t-pa-hpux" xmake_file="pa/x-ada" target_cpu_default="(MASK_PA_11|MASK_PA_20|MASK_GAS)" - + extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o" if test x$gnu_ld = xyes then target_cpu_default="${target_cpu_default}|MASK_GNU_LD" @@ -934,7 +934,6 @@ hppa*64*-*-hpux11*) # tmake_file="${tmake_file} pa/t-dce-thr" # fi install_headers_dir=install-headers-cpio - use_collect2=yes ;; hppa1.1-*-hpux11* | hppa2*-*-hpux11*) target_cpu_default="MASK_PA_11" diff --git a/gcc/config/pa/pa-hpux11.h b/gcc/config/pa/pa-hpux11.h index 0bc7f1010a5..3228ee06d0a 100644 --- a/gcc/config/pa/pa-hpux11.h +++ b/gcc/config/pa/pa-hpux11.h @@ -117,3 +117,16 @@ Boston, MA 02111-1307, USA. */ #define SIZE_TYPE "long unsigned int" #define PTRDIFF_TYPE "long int" + +/* HP-UX 11.0 and above provides initialization and finalization function + support from linker command line. We don't need to invoke __main to run + constructors. We also don't need chatr to determine the dependencies of + dynamically linked executables and shared libraries. */ +#undef LDD_SUFFIX +#undef PARSE_LDD_OUTPUT +#undef HAS_INIT_SECTION +#define HAS_INIT_SECTION 1 +#undef LD_INIT_SWITCH +#define LD_INIT_SWITCH "+init" +#undef LD_FINI_SWITCH +#define LD_FINI_SWITCH "+fini" diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 651fc96eb37..2821d463501 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -124,6 +124,10 @@ static void pa_globalize_label PARAMS ((FILE *, const char *)) ATTRIBUTE_UNUSED; static void pa_asm_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree)); +#if !defined(USE_COLLECT2) +static void pa_asm_out_constructor PARAMS ((rtx, int)); +static void pa_asm_out_destructor PARAMS ((rtx, int)); +#endif static void copy_fp_args PARAMS ((rtx)) ATTRIBUTE_UNUSED; static int length_fp_args PARAMS ((rtx)) ATTRIBUTE_UNUSED; static struct deferred_plabel *get_plabel PARAMS ((const char *)) @@ -209,6 +213,13 @@ static size_t n_deferred_plabels = 0; #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall +#if !defined(USE_COLLECT2) +#undef TARGET_ASM_CONSTRUCTOR +#define TARGET_ASM_CONSTRUCTOR pa_asm_out_constructor +#undef TARGET_ASM_DESTRUCTOR +#define TARGET_ASM_DESTRUCTOR pa_asm_out_destructor +#endif + struct gcc_target targetm = TARGET_INITIALIZER; void @@ -6959,6 +6970,46 @@ fmpyaddoperands (operands) return 1; } +#if !defined(USE_COLLECT2) +static void +pa_asm_out_constructor (symbol, priority) + rtx symbol; + int priority; +{ + if (!function_label_operand (symbol, VOIDmode)) + hppa_encode_label (symbol); + +#ifdef CTORS_SECTION_ASM_OP + default_ctor_section_asm_out_constructor (symbol, priority); +#else +# ifdef TARGET_ASM_NAMED_SECTION + default_named_section_asm_out_constructor (symbol, priority); +# else + default_stabs_asm_out_constructor (symbol, priority); +# endif +#endif +} + +static void +pa_asm_out_destructor (symbol, priority) + rtx symbol; + int priority; +{ + if (!function_label_operand (symbol, VOIDmode)) + hppa_encode_label (symbol); + +#ifdef DTORS_SECTION_ASM_OP + default_dtor_section_asm_out_destructor (symbol, priority); +#else +# ifdef TARGET_ASM_NAMED_SECTION + default_named_section_asm_out_destructor (symbol, priority); +# else + default_stabs_asm_out_destructor (symbol, priority); +# endif +#endif +} +#endif + /* Returns 1 if the 6 operands specified in OPERANDS are suitable for use in fmpysub instructions. */ int diff --git a/gcc/config/pa/pa64-hpux.h b/gcc/config/pa/pa64-hpux.h index f212b7c0e34..507f1609e57 100644 --- a/gcc/config/pa/pa64-hpux.h +++ b/gcc/config/pa/pa64-hpux.h @@ -112,6 +112,11 @@ do { \ #define DATA_SECTION_ASM_OP "\t.data" #define BSS_SECTION_ASM_OP "\t.section\t.bss" +#define HP_INIT_ARRAY_SECTION_ASM_OP "\t.section\t.init" +#define GNU_INIT_ARRAY_SECTION_ASM_OP "\t.section\t.init_array" +#define HP_FINI_ARRAY_SECTION_ASM_OP "\t.section\t.fini" +#define GNU_FINI_ARRAY_SECTION_ASM_OP "\t.section\t.fini_array" + #undef ASM_OUTPUT_ALIGNED_COMMON #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ do { \ @@ -220,55 +225,175 @@ do { \ } while (0) #undef TEXT_SECTION_ASM_OP -#define TEXT_SECTION_ASM_OP "\t.SUBSPA $CODE$\n" +#define TEXT_SECTION_ASM_OP "\t.SUBSPA $CODE$\n" #undef READONLY_DATA_SECTION_ASM_OP -#define READONLY_DATA_SECTION_ASM_OP "\t.SUBSPA $LIT$\n" +#define READONLY_DATA_SECTION_ASM_OP "\t.SUBSPA $LIT$\n" #undef DATA_SECTION_ASM_OP -#define DATA_SECTION_ASM_OP "\t.SUBSPA $DATA$\n" +#define DATA_SECTION_ASM_OP "\t.SUBSPA $DATA$\n" #undef BSS_SECTION_ASM_OP -#define BSS_SECTION_ASM_OP "\t.SUBSPA $BSS$\n" +#define BSS_SECTION_ASM_OP "\t.SUBSPA $BSS$\n" + +/* We provide explicit defines for CTORS_SECTION_ASM_OP and + DTORS_SECTION_ASM_OP since we don't yet have support for + named sections with the HP assembler. */ +#undef CTORS_SECTION_ASM_OP +#define CTORS_SECTION_ASM_OP "\t.SUBSPA \\.ctors,QUAD=1,ALIGN=8,ACCESS=31" +#undef DTORS_SECTION_ASM_OP +#define DTORS_SECTION_ASM_OP "\t.SUBSPA \\.dtors,QUAD=1,ALIGN=8,ACCESS=31" + +#define HP_INIT_ARRAY_SECTION_ASM_OP \ + "\t.SUBSPA \\.init,QUAD=1,ALIGN=8,ACCESS=31" +#define GNU_INIT_ARRAY_SECTION_ASM_OP \ + "\t.SUBSPA \\.init_array,QUAD=1,ALIGN=8,ACCESS=31" +#define HP_FINI_ARRAY_SECTION_ASM_OP \ + "\t.SUBSPA \\.fini,QUAD=1,ALIGN=8,ACCESS=31" +#define GNU_FINI_ARRAY_SECTION_ASM_OP \ + "\t.SUBSPA \\.fini_array,QUAD=1,ALIGN=8,ACCESS=31" #endif /* USING_ELFOS_H */ -/* For the time being, we aren't using init sections. `P' relocations - are currently used for function references. However, P relocations are - treated as data references and data references are bound by dld.sl - immediately at program startup. This causes an abort due to undefined - weak symbols in crtbegin.o (e.g., __register_frame_info). Possibly - Q relocations might avoid this problem but the GNU assembler doesn't - support them. */ +/* The following defines, used to run constructors and destructors with + the SOM linker under HP-UX 11, are not needed. */ +#undef HAS_INIT_SECTION +#undef LD_INIT_SWITCH +#undef LD_FINI_SWITCH + +/* The following STARTFILE_SPEC and ENDFILE_SPEC defines provide the + magic needed to run initializers and finalizers. */ +#undef STARTFILE_SPEC +#define STARTFILE_SPEC \ + "%{!shared: %{!symbolic: crt0.o%s}} %{static:crtbeginT.o%s} \ + %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s}" + +/* Since HP uses the .init and .fini sections for array initializers + and finalizers, we need different defines for INIT_SECTION_ASM_OP + and FINI_SECTION_ASM_OP. With the implementation adopted below, + the sections are not actually used. However, we still must provide + defines to select the proper code path. */ #undef INIT_SECTION_ASM_OP +#define INIT_SECTION_ASM_OP #undef FINI_SECTION_ASM_OP +#define FINI_SECTION_ASM_OP + +/* We are using array initializers and don't want calls in the INIT + and FINI sections. */ +#undef CRT_CALL_STATIC_FUNCTION +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) + +/* The init_priority attribute is not supported with HP ld. This could be + supported if collect2 was used with LD_INIT_SWITCH. Unfortunately, this + approach doesn't work with GNU ld since HP-UX doesn't support DT_INIT, + and therefore the -init and -fini GNU ld switches. */ +#undef SUPPORTS_INIT_PRIORITY +#define SUPPORTS_INIT_PRIORITY (TARGET_GNU_LD ? 1 : 0) + +/* We use DTOR_LIST_BEGIN to carry a bunch of hacks to allow us to use + the init and fini array sections with both the HP and GNU linkers. + The linkers setup the required dynamic entries in the dynamic segment + and the dynamic linker does the calls. This approach avoids using + collect2. + + The first hack is to implement __do_global_ctors_aux in crtbegin as + it needs to be the first entry in the init array so that it is called + last. HP got the order of the init array backwards. The DT_INIT_ARRAY + is supposed to be executed in the same order as the addresses appear in + the array. DT_FINI_ARRAY is supposed to be executed in the opposite + order. + + The second hack is stubs for __cxa_finalize and _Jv_RegisterClasses. + The HP implementation of undefined weak symbols is broken. The linker + and dynamic loader both search for undefined weak symbols contrary the + generic System V ABI. An undefined weak symbol should resolve to a + value of 0 rather than causing an error. The prototypes for + __cxa_finalize and _Jv_RegisterClasses in crtstuff.c are weak when + weak is supported (GNU as), so in theory a strong define should override + the stub functions provided here. + + The final hack is a set of plabels to implement the effect of + CRT_CALL_STATIC_FUNCTION. HP-UX 11 only supports DI_INIT_ARRAY and + DT_FINI_ARRAY and they put the arrays in .init and .fini, rather than + in .init_array and .fini_array. The standard defines for .init and + .fini have the execute flag set. So, the assembler has to be hacked + to munge the standard flags for these sections to make them agree + with what the HP linker expects. With the GNU linker, we need to + used the .init_array and .fini_array sections. So, we set up for + both just in case. Once we have built the table, the linker does + the rest of the work. + + The order is significant. Placing __do_global_ctors_aux first in + the list, results in it being called last. User specified initializers, + either using the linker +init command or a plabel, run before the + initializers specified here. */ + +/* We need a __cxa_finalize stub if CRTSTUFFS_O is defined. */ +#ifdef CRTSTUFFS_O +#define PA_CXA_FINALIZE_STUB \ +extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK; \ +void \ +__cxa_finalize (void *p __attribute__((unused))) {} +#else +#define PA_CXA_FINALIZE_STUB +#endif -#define EH_FRAME_IN_DATA_SECTION 1 +/* We need a _Jv_RegisterClasses stub if JCR_SECTION_NAME is defined. */ +#ifdef JCR_SECTION_NAME +#define PA_JV_REGISTERCLASSES_STUB \ +void \ +_Jv_RegisterClasses (void *p __attribute__((unused))) {} +#else +#define PA_JV_REGISTERCLASSES_STUB +#endif -#undef ENDFILE_SPEC -#define ENDFILE_SPEC "" +/* We need to add frame_dummy to the initializer list if USE_EH_FRAME_REGISTRY + or JCR_SECTION_NAME is defined. */ +#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME) +#define PA_INIT_FRAME_DUMMY_ASM_OP ".dword P%frame_dummy" +#else +#define PA_INIT_FRAME_DUMMY_ASM_OP "" +#endif -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "%{!shared: %{!symbolic: crt0.o%s}}" - -/* Since we are not yet using .init and .fini sections, we need to - explicitly arrange to run the global constructors and destructors. - We could use ldd for this but it depends on LD_LIBRARY_PATH being - correctly set. So, we use the ld init and fini switches. However, - we need to support different switches for the GNU and HP linkers. - We can't check TARGET_GNU_LD in collect2, so we need a different - test. The +Accept switch is always the first switch when we are - using the HP linker (see define for LINK_SPEC). Checking for it - is a somewhat fragile as it depends on internal details of the - collect2 program but it is better than testing ld_file_name. - - FIXME: The GNU linker is broken. The -init/-fini switches don't - work and ldd can't determine the dynamic dependences of executables - linked with GNU ld. The init and fini routines are not executed - although DT_INIT and DT_FINI appear ok. As a result, defining - LD_INIT_SWITCH and LD_FINI_SWITCH causes more harm than good when - using GNU ld. However, the definitions appear to work fine with - the HP linker. */ -#if 0 -#define LD_INIT_SWITCH (strcmp ("+Accept", ld2_argv[1]) ? "-init" : "+init") -#define LD_FINI_SWITCH (strcmp ("+Accept", ld2_argv[1]) ? "-fini" : "+fini") +#define PA_INIT_FINI_HACK \ +static void __attribute__((used)) \ +__do_global_ctors_aux (void) \ +{ \ + func_ptr *p = __CTOR_LIST__; \ + while (*(p + 1)) \ + p++; \ + for (; *p != (func_ptr) -1; p--) \ + (*p) (); \ +} \ + \ +PA_CXA_FINALIZE_STUB \ +PA_JV_REGISTERCLASSES_STUB \ + \ +asm (HP_INIT_ARRAY_SECTION_ASM_OP); \ +asm (".dword P%__do_global_ctors_aux"); \ +asm (PA_INIT_FRAME_DUMMY_ASM_OP); \ +asm (GNU_INIT_ARRAY_SECTION_ASM_OP); \ +asm (".dword P%__do_global_ctors_aux"); \ +asm (PA_INIT_FRAME_DUMMY_ASM_OP); \ +asm (HP_FINI_ARRAY_SECTION_ASM_OP); \ +asm (".dword P%__do_global_dtors_aux"); \ +asm (GNU_FINI_ARRAY_SECTION_ASM_OP); \ +asm (".dword P%__do_global_dtors_aux") + +/* The following two variants of DTOR_LIST_BEGIN are identical to those + in crtstuff.c except for the addition of the above init-fini hack. */ +#ifdef DTORS_SECTION_ASM_OP +#define DTOR_LIST_BEGIN \ +asm (DTORS_SECTION_ASM_OP); \ +STATIC func_ptr __DTOR_LIST__[1] \ + __attribute__ ((aligned(sizeof(func_ptr)))) \ + = { (func_ptr) (-1) }; \ +PA_INIT_FINI_HACK +#else +#define DTOR_LIST_BEGIN \ +STATIC func_ptr __DTOR_LIST__[1] \ + __attribute__ ((section(".dtors"), aligned(sizeof(func_ptr)))) \ + = { (func_ptr) (-1) }; \ +PA_INIT_FINI_HACK #endif /* If using HP ld do not call pxdb. Use size as a program that does nothing diff --git a/gcc/config/pa/som.h b/gcc/config/pa/som.h index 98c66fbfe37..aa509bd08c7 100644 --- a/gcc/config/pa/som.h +++ b/gcc/config/pa/som.h @@ -362,10 +362,6 @@ do { \ /* The .align directive in the HP assembler allows up to a 32 alignment. */ #define MAX_OFILE_ALIGNMENT 32768 -/* SOM does not support the init_priority C++ attribute. */ -#undef SUPPORTS_INIT_PRIORITY -#define SUPPORTS_INIT_PRIORITY 0 - /* The SOM linker hardcodes paths into binaries. As a result, dotdots must be removed from library prefixes to prevent binaries from depending on the location of the GCC tool directory. The downside is GCC |