--- gcc/config/sparc/sysv4.h 2018/04/24 18:21:31 1.1.1.3 +++ gcc/config/sparc/sysv4.h 2018/04/24 18:28:55 1.1.1.4 @@ -1,5 +1,5 @@ /* Target definitions for GNU compiler for Sparc running System V.4 - Copyright (C) 1991, 1992 Free Software Foundation, Inc. + Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. Written by Ron Guilmette (rfg@netcom.com). @@ -17,7 +17,8 @@ GNU General Public License for more deta You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ #include "sparc/sparc.h" @@ -37,9 +38,8 @@ the Free Software Foundation, 675 Mass A appropriate only for typical svr4 systems, but not for the specific case of svr4 running on a Sparc. */ -#undef CTORS_SECTION_ASM_OP -#undef DTORS_SECTION_ASM_OP #undef INIT_SECTION_ASM_OP +#undef FINI_SECTION_ASM_OP #undef CONST_SECTION_ASM_OP #undef TYPE_OPERAND_FMT #undef PUSHSECTION_FORMAT @@ -77,24 +77,6 @@ the Free Software Foundation, 675 Mass A const_section (); \ } -/* The specialized code which needs to appear in the .init section prior - to the prologue code for `__do_global_ctors' (see crtstuff.c). - - On Sparcs running svr4, the /usr/ccs/lib/crti.o file (with gets linked - in prior to the crtbegin.o file) has a single `save' instruction in its - .init section. That `save' instruction tries to setup a stack frame for - the sake of any subsequent code in the .init section. Unfortunately, - the size it uses for the stack frame is only a guess, and is not really - adequate for our purposes. More importantly, we independently put our - own standard function prologue (for __do_global_ctors) into the .init - section and that function prologue includes its own `save' instruction! - Thus, unless we do something to correct the situation, we'll get *two* - stack frames allocated when crt0.o calls the code in the .init section, - and havoc will ensue. The following macro definition prevents such woes. -*/ - -#define INIT_SECTION_PREAMBLE asm ("restore") - /* This is the string used to begin an assembly language comment for the Sparc/svr4 assembler. */ @@ -172,18 +154,43 @@ do { ASM_OUTPUT_ALIGN ((FILE), Pmode == #define BSS_SECTION_ASM_OP ".section\t\".bss\"" #define CONST_SECTION_ASM_OP ".section\t\".rodata\"" #define INIT_SECTION_ASM_OP ".section\t\".init\"" -#define CTORS_SECTION_ASM_OP ".section\t\".ctors\",#alloc,#execinstr" -#define DTORS_SECTION_ASM_OP ".section\t\".dtors\",#alloc,#execinstr" - -/* Assemble generic sections. - This is currently only used to support section attributes. */ +#define FINI_SECTION_ASM_OP ".section\t\".fini\"" -#define ASM_OUTPUT_SECTION_NAME(FILE, NAME) \ - fprintf (FILE, ".section\t\"%s\",#alloc\n", NAME) +/* Define the pseudo-ops used to switch to the .ctors and .dtors sections. + + Note that we want to give these sections the SHF_WRITE attribute + because these sections will actually contain data (i.e. tables of + addresses of functions in the current root executable or shared library + file) and, in the case of a shared library, the relocatable addresses + will have to be properly resolved/relocated (and then written into) by + the dynamic linker when it actually attaches the given shared library + to the executing process. (Note that on SVR4, you may wish to use the + `-z text' option to the ELF linker, when building a shared library, as + an additional check that you are doing everything right. But if you do + use the `-z text' option when building a shared library, you will get + errors unless the .ctors and .dtors sections are marked as writable + via the SHF_WRITE attribute.) */ + +#undef CTORS_SECTION_ASM_OP +#define CTORS_SECTION_ASM_OP ".section\t\".ctors\",#alloc,#write" +#undef DTORS_SECTION_ASM_OP +#define DTORS_SECTION_ASM_OP ".section\t\".dtors\",#alloc,#write" -/* If the host and target formats match, output the floats as hex. */ -#if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT -#if defined (HOST_WORDS_BIG_ENDIAN) == WORDS_BIG_ENDIAN +/* A C statement to output something to the assembler file to switch to section + NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or + NULL_TREE. Some target formats do not support arbitrary sections. Do not + define this macro in such cases. */ + +#undef ASM_OUTPUT_SECTION_NAME /* Override svr4.h's definition. */ +#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \ +do { \ + if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL) \ + fprintf (FILE, ".section\t\"%s\",#alloc,#execinstr\n", (NAME)); \ + else if ((DECL) && TREE_READONLY (DECL)) \ + fprintf (FILE, ".section\t\"%s\",#alloc\n", (NAME)); \ + else \ + fprintf (FILE, ".section\t\"%s\",#alloc,#write\n", (NAME)); \ +} while (0) /* This is how to output assembly code to define a `float' constant. We always have to use a .long pseudo-op to do this because the native @@ -210,9 +217,6 @@ do { long value[2]; \ fprintf((FILE), "\t.long\t0x%x\n", value[1]); \ } while (0) -#endif /* word order matches */ -#endif /* HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT */ - /* This is how to output an assembler line defining a `long double' constant. */