123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /* Definitions of target machine for GNU compiler, for HPs running
- HP-UX using the 64bit runtime model.
- Copyright (C) 1999-2022 Free Software Foundation, Inc.
- This file is part of GCC.
- GCC 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.
- GCC 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/>. */
- /* 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 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 to add frame_dummy to the initializer list if EH_FRAME_SECTION_NAME
- is defined. */
- #if defined(__LIBGCC_EH_FRAME_SECTION_NAME__)
- #define PA_INIT_FRAME_DUMMY_ASM_OP ".dword P%frame_dummy"
- #else
- #define PA_INIT_FRAME_DUMMY_ASM_OP ""
- #endif
- /* The following hack sets up the .init, .init_array, .fini and
- .fini_array sections. */
- #define PA_CRTBEGIN_HACK \
- asm (TEXT_SECTION_ASM_OP); \
- 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) (); \
- } \
- \
- asm (HP_INIT_ARRAY_SECTION_ASM_OP); \
- asm (".align 8"); \
- asm (".dword P%__do_global_ctors_aux"); \
- asm (PA_INIT_FRAME_DUMMY_ASM_OP); \
- asm (GNU_INIT_ARRAY_SECTION_ASM_OP); \
- asm (".align 8"); \
- asm (".dword P%__do_global_ctors_aux"); \
- asm (PA_INIT_FRAME_DUMMY_ASM_OP); \
- asm (HP_FINI_ARRAY_SECTION_ASM_OP); \
- asm (".align 8"); \
- asm (".dword P%__do_global_dtors_aux"); \
- asm (GNU_FINI_ARRAY_SECTION_ASM_OP); \
- asm (".align 8"); \
- 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 crtbegin hack. */
- #ifdef __LIBGCC_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_CRTBEGIN_HACK
- #else
- #define DTOR_LIST_BEGIN \
- STATIC func_ptr __DTOR_LIST__[1] \
- __attribute__ ((section(".dtors"), aligned(sizeof(func_ptr)))) \
- = { (func_ptr) (-1) }; \
- PA_CRTBEGIN_HACK
- #endif
|