From b335c2ccab1de6da9e2a0a3b4253408036feec36 Mon Sep 17 00:00:00 2001 From: Tom Wood Date: Thu, 19 Mar 1992 20:41:45 +0000 Subject: [PATCH] *** empty log message *** From-SVN: r526 --- gcc/config/i386/sysv3.h | 25 +++++------ gcc/config/m88k/sysv3.h | 92 +++++++++++++++++++++++++++++------------ gcc/config/svr3.h | 20 ++++----- gcc/crtstuff.c | 29 +++++++++++-- gcc/function.c | 18 +++++--- gcc/libgcc2.c | 40 ++++++++++++++++-- 6 files changed, 160 insertions(+), 64 deletions(-) diff --git a/gcc/config/i386/sysv3.h b/gcc/config/i386/sysv3.h index 750e1f4a9f2..0aaa69acfc2 100644 --- a/gcc/config/i386/sysv3.h +++ b/gcc/config/i386/sysv3.h @@ -99,26 +99,23 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define FRAME_POINTER_REQUIRED \ (current_function_calls_setjmp || current_function_calls_longjmp) -/* Define a few machine-specific details - of the implementation of constructors. +/* Define a few machine-specific details of the implementation of + constructors. - CTORS_SECTION_ASM_OP should be defined to concatenate - the macro INIT_SECTION_ASM_OP, a newline, and a push instruction - to push a word containing 0 (or some equivalent of that). + The __CTORS_LIST__ goes in the .init section. Define CTOR_LIST_BEGIN + and CTOR_LIST_END to contribute to the .init section an instruction to + push a word containing 0 (or some equivalent of that). - ASM_OUTPUT_CONSTRUCTOR should be defined - to push the address of the constructor. */ + ASM_OUTPUT_CONSTRUCTOR should be defined to push the address of the + constructor. */ #undef INIT_SECTION_ASM_OP #define INIT_SECTION_ASM_OP ".section .init,\"x\"" -#define CTORS_SECTION_ASM_OP \ - INIT_SECTION_ASM_OP "\n" \ - "\tpushl $0\n\t" \ - DATA_SECTION_ASM_OP -/* The reason we end with DATA_SECTION_ASM_OP is to prevent the - initial and final table elements (see crtstuff.c) from getting into - the .init section and causing a crash. */ +#define CTOR_LIST_BEGIN \ + asm (INIT_SECTION_ASM_OP); \ + asm ("pushl $0") +#define CTOR_LIST_END CTOR_LIST_BEGIN #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ do { \ diff --git a/gcc/config/m88k/sysv3.h b/gcc/config/m88k/sysv3.h index f0a4ecc5659..0662aaacd15 100644 --- a/gcc/config/m88k/sysv3.h +++ b/gcc/config/m88k/sysv3.h @@ -59,15 +59,38 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #undef USE_LIBG #define USE_LIBG -/* Define a few machine-specific details - of the implementation of constructors. +/* Define a few machine-specific details of the implementation of + constructors. */ - CTORS_SECTION_ASM_OP should be defined to concatenate - the macro INIT_SECTION_ASM_OP, a newline, and a push instruction - to push a word containing 0 (or some equivalent of that). +/* Although the .init section is used, it is not automatically invoked. */ +#define INVOKE__main - ASM_OUTPUT_CONSTRUCTOR should be defined - to push the address of the constructor. */ +/* State that atexit exists so __do_global_ctors will register + __do_global_dtors. */ +#define HAVE_ATEXIT + +#if (STACK_BOUNDARY / BITS_PER_UNIT) == 16 && REG_PARM_STACK_SPACE (0) == 32 +#define CTOR_LIST_BEGIN \ + asm (INIT_SECTION_ASM_OP); \ + asm ("\tsubu\t r31,r31,16"); \ + asm ("\tst\t r0,r31,32"); +#define CTOR_LIST_END +#endif + +/* ASM_OUTPUT_CONSTRUCTOR outputs code into the .init section to push the + address of the constructor. This becomes the body of __do_global_ctors + in crtstuff.c. r13 is a temporary register. */ +#undef ASM_OUTPUT_CONSTRUCTOR +#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ + do { \ + init_section (); \ + fprintf (FILE, "\tor.u\t r13,r0,hi16("); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, ")\n\tor\t r13,r13,lo16("); \ + assemble_name (FILE, NAME); \ + fprintf (FILE, ")\n\tsubu\t r31,r31,%d\n\tst\t r13,r31,%d\n", \ + STACK_BOUNDARY / BITS_PER_UNIT, REG_PARM_STACK_SPACE (0)); \ + } while (0) #undef DO_GLOBAL_CTORS_BODY #define DO_GLOBAL_CTORS_BODY \ @@ -77,26 +100,41 @@ do { \ (*p) (); \ } while (0) -#undef CTORS_SECTION_ASM_OP -#define CTORS_SECTION_ASM_OP \ - INIT_SECTION_ASM_OP "\n" \ - "subu\t r31,r31,16\n\tst\t r0,r31,32\n\t" \ - DATA_SECTION_ASM_OP +#define DTOR_LIST_BEGIN \ + asm (FINI_SECTION_ASM_OP); \ + func_ptr __DTOR_LIST__[4] = { (func_ptr) (-1), (func_ptr) (-1), \ + (func_ptr) (-1), (func_ptr) (-1) } +#define DTOR_LIST_END \ + asm (FINI_SECTION_ASM_OP); \ + func_ptr __DTOR_END__[4] = { (func_ptr) 0, (func_ptr) 0, \ + (func_ptr) 0, (func_ptr) 0 } -/* The reason we end with DATA_SECTION_ASM_OP is to prevent the - initial and final table elements (see crtstuff.c) from getting into - the .init section and causing a crash. */ - -#undef ASM_OUTPUT_CONSTRUCTOR -#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ +/* A C statement (sans semicolon) to output an element in the table of + global destructors. The table is constructed in the .fini section + so that an explicit linker script is not required. The complication + is that this section is padded with NOP instructions and to either + 8 or 16 byte alignment depending on the specific system. A clever + way to avoid trouble is to output a block of 16 bytes where the + extra words are known values (-1). */ +#undef ASM_OUTPUT_DESTRUCTOR +#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ do { \ - init_section (); \ - fprintf (FILE, "\tor.u r13,r0,hi16("); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, ")\nor\t r13,r13,lo16("); \ - assemble_name (FILE, NAME); \ - fprintf (FILE, ")\n\tsubu r31,r31,16\nst\t r13,r31,32\n"); \ - } while (0) + register int i; \ + fini_section (); \ + fprintf (FILE, "\t%s\t ", ASM_LONG); \ + assemble_name (FILE,NAME); \ + fprintf (FILE, "\n"); \ + for (i = 1; i < 4; i++) \ + fprintf (FILE, "\t%s\t -1\n", ASM_LONG); \ + } while (0) -#undef DTORS_SECTION_ASM_OP -#define DTORS_SECTION_ASM_OP FINI_SECTION_ASM_OP +/* Walk the list looking for the terminating zero and ignoring all values of + -1. */ +#undef DO_GLOBAL_DTORS_BODY +#define DO_GLOBAL_DTORS_BODY \ + do { \ + int i; \ + for (i = 0; __DTOR_LIST__[i] != 0; i++) \ + if (((int *)__DTOR_LIST__)[i] != -1) \ + __DTOR_LIST__[i] (); \ + } while (0) diff --git a/gcc/config/svr3.h b/gcc/config/svr3.h index 112f8c21854..9e871537a2f 100644 --- a/gcc/config/svr3.h +++ b/gcc/config/svr3.h @@ -172,25 +172,25 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. unless the specific tm.h file turns it on by defining USE_CONST_SECTION as 1. */ -/* The support for constructors and destructors depends on two - machine-specific macros that the individual tm.h file has to define: +/* Define a few machine-specific details of the implementation of + constructors. - CTORS_SECTION_ASM_OP should be defined to concatenate - the macro INIT_SECTION_ASM_OP, a newline, and a push instruction - to push a word containing 0 (or some equivalent of that). + The __CTORS_LIST__ goes in the .init section. Define CTOR_LIST_BEGIN + and CTOR_LIST_END to contribute to the .init section an instruction to + push a word containing 0 (or some equivalent of that). - ASM_OUTPUT_CONSTRUCTOR should be defined - to push the address of the constructor. */ + Define ASM_OUTPUT_CONSTRUCTOR to push the address of the constructor. */ #define USE_CONST_SECTION 0 #define INIT_SECTION_ASM_OP ".section\t.init" #define FINI_SECTION_ASM_OP ".section .fini,\"x\"" #define CONST_SECTION_ASM_OP ".section\t.rodata, \"x\"" - +#define CTORS_SECTION_ASM_OP INIT_SECTION_ASM_OP #define DTORS_SECTION_ASM_OP FINI_SECTION_ASM_OP -/* CTORS_SECTION_ASM_OP is machine-dependent - because it pushes on the stack. */ + +/* CTOR_LIST_BEGIN and CTOR_LIST_END are machine-dependent + because they push on the stack. */ #define DO_GLOBAL_CTORS_BODY \ do { \ diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c index e1f5934f305..a13fbf20ba8 100644 --- a/gcc/crtstuff.c +++ b/gcc/crtstuff.c @@ -69,8 +69,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef INIT_SECTION_ASM_OP -/* Force cc1 to switch to .text section. */ -static void force_to_text () { } +/* The function __do_global_ctors_aux is compiled twice (once in crtbegin.o + and once in crtend.o). It must be declared static to aviod a link + error. Here, we define __do_global_ctors as an externally callable + function. It is externally callable so that __main can invoke it when + INVOKE__main is defined. This has the additional effect of forcing cc1 + to switch to the .text section. */ +void __do_global_ctors () { __do_global_ctors_aux (); } asm (INIT_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ @@ -90,7 +95,7 @@ asm (INIT_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ file-scope static-storage C++ objects within shared libraries. */ static void -__do_global_ctors () /* prologue goes in .init section */ +__do_global_ctors_aux () /* prologue goes in .init section */ { asm (TEXT_SECTION_ASM_OP); /* don't put epilogue and body in .init */ DO_GLOBAL_CTORS_BODY; @@ -104,11 +109,19 @@ static func_ptr force_to_data[0] = { }; /* The -1 is a flag to __do_global_[cd]tors indicating that this table does not start with a count of elements. */ +#ifdef CTOR_LIST_BEGIN +CTOR_LIST_BEGIN; +#else asm (CTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) }; +#endif +#ifdef DTOR_LIST_BEGIN +DTOR_LIST_BEGIN; +#else asm (DTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) }; +#endif #endif /* defined(CRT_BEGIN) */ @@ -129,7 +142,7 @@ func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) }; */ static void -__do_global_ctors () /* prologue goes in .text section */ +__do_global_ctors_aux () /* prologue goes in .text section */ { asm (INIT_SECTION_ASM_OP); DO_GLOBAL_CTORS_BODY; @@ -141,10 +154,18 @@ __do_global_ctors () /* prologue goes in .text section */ /* Force cc1 to switch to .data section. */ static func_ptr force_to_data[0] = { }; +#ifdef CTOR_LIST_END +CTOR_LIST_END; +#else asm (CTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ func_ptr __CTOR_END__[1] = { (func_ptr) 0 }; +#endif +#ifdef DTOR_LIST_END +DTOR_LIST_END; +#else asm (DTORS_SECTION_ASM_OP); /* cc1 doesn't know that we are switching! */ func_ptr __DTOR_END__[1] = { (func_ptr) 0 }; +#endif #endif /* defined(CRT_END) */ diff --git a/gcc/function.c b/gcc/function.c index 4e5e2a73142..d250d5be8b6 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1028,7 +1028,7 @@ fixup_var_refs_insns (var, insn, toplevel) /* We can not separate USE insns from the CALL_INSN that they belong to. If this is a CALL_INSN, insert - the move insn before the USE insns preceeding it + the move insn before the USE insns preceding it instead of immediately before the insn. */ if (GET_CODE (insn) == CALL_INSN) { @@ -1904,7 +1904,7 @@ instantiate_decls (fndecl, valid_only) if (DECL_RTL (decl) && GET_CODE (DECL_RTL (decl)) == MEM) instantiate_virtual_regs_1 (&XEXP (DECL_RTL (decl), 0), valid_only ? DECL_RTL (decl) : 0, 0); -#if 0 /* This is probably correct, but it seems to require fixes +#if 1 /* This is probably correct, but it seems to require fixes elsewhere in order to work. Let's fix them in 2.1. */ if (DECL_INCOMING_RTL (decl) && GET_CODE (DECL_INCOMING_RTL (decl)) == MEM) @@ -2167,7 +2167,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns) /* Most cases of MEM that convert to valid addresses have already been handled by our scan of regno_reg_rtx. The only special handling we need here is to make a copy of the rtx to ensure it isn't being - shared if we have to change it to a psuedo. + shared if we have to change it to a pseudo. If the rtx is a simple reference to an address via a virtual register, it can potentially be shared. In such cases, first try to make it @@ -2778,7 +2778,7 @@ assign_parms (fndecl, second_time) #if 0 /* This change was turned off because it makes compilation bigger. */ !optimize #else /* It's not clear why the following was replaced. */ - /* Obsoleted by preceeding line. */ + /* Obsoleted by preceding line. */ (obey_regdecls && ! TREE_REGDECL (parm) && ! TREE_INLINE (fndecl)) #endif @@ -3212,6 +3212,12 @@ setjmp_protect (block) || TREE_CODE (decl) == PARM_DECL) && DECL_RTL (decl) != 0 && GET_CODE (DECL_RTL (decl)) == REG + /* If this variable came from an inline function, it must be + that it's life doesn't overlap the setjmp. If there was a + setjmp in the function, it would already be in memory. We + must exclude such variable because their DECL_RTL might be + set to strange things such as virtual_stack_vars_rtx. */ + && ! DECL_FROM_INLINE (decl) && ( #ifdef NON_SAVING_SETJMP /* If longjmp doesn't restore the registers, @@ -3623,10 +3629,10 @@ mark_varargs () void expand_main_function () { -#ifndef INIT_SECTION_ASM_OP +#if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main) emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__main"), 0, VOIDmode, 0); -#endif /* not INIT_SECTION_ASM_OP */ +#endif /* not INIT_SECTION_ASM_OP or INVOKE__main */ } /* Start the RTL for a new function, and set variables used for diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index f477c13cfaa..a770502aea8 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -29,7 +29,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ do not apply. */ #include "tm.h" +#ifndef L_trampoline #include "gstddef.h" +#endif /* Don't use `fancy_abort' here even if config.h says to use it. */ #ifdef abort @@ -864,8 +866,13 @@ asm ("__builtin_saveregs:"); #endif /* not SVR4 */ #else /* not __i860__ */ #ifdef __sparc__ +#ifdef NO_UNDERSCORES + asm (".global __builtin_saveregs"); + asm ("__builtin_saveregs:"); +#else asm (".global ___builtin_saveregs"); asm ("___builtin_saveregs:"); +#endif asm ("st %i0,[%fp+68]"); asm ("st %i1,[%fp+72]"); asm ("st %i2,[%fp+76]"); @@ -1219,6 +1226,31 @@ __enable_execute_stack () asm ("pich"); } #endif /* __convex__ */ + +#ifdef __pyr__ + +#include +#include +#include +#include +#include + +/* Modified from the convex -code above. + mremap promises to clear the i-cache. */ + +void +__enable_execute_stack () +{ + int fp; + if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ, + PROT_READ|PROT_WRITE|PROT_EXEC)) + { + perror ("mprotect in __enable_execute_stack"); + fflush (stderr); + abort (); + } +} +#endif /* __pyr__ */ #endif /* L_trampoline */ #ifdef L__main @@ -1271,7 +1303,9 @@ __do_global_ctors () DO_GLOBAL_CTORS_BODY; ON_EXIT (__do_global_dtors, 0); } +#endif /* no INIT_SECTION_ASM_OP */ +#if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main) /* Subroutine called automatically by `main'. Compiling a global function named `main' produces an automatic call to this function at the beginning. @@ -1291,7 +1325,7 @@ __main () __do_global_ctors (); } } -#endif /* no INIT_SECTION_ASM_OP */ +#endif /* no INIT_SECTION_ASM_OP or INVOKE__main */ #endif /* L__main */ @@ -1306,10 +1340,10 @@ __main () /* We declare the lists here with two elements each, so that they are valid empty lists if no other definition is loaded. */ -#ifndef INIT_SECTION_ASM_OP +#if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY) func_ptr __CTOR_LIST__[2]; func_ptr __DTOR_LIST__[2]; -#endif /* INIT_SECTION_ASM_OP */ +#endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */ #ifndef ON_EXIT