]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
*** empty log message ***
authorTom Wood <wood@gnu.org>
Thu, 19 Mar 1992 20:41:45 +0000 (20:41 +0000)
committerTom Wood <wood@gnu.org>
Thu, 19 Mar 1992 20:41:45 +0000 (20:41 +0000)
From-SVN: r526

gcc/config/i386/sysv3.h
gcc/config/m88k/sysv3.h
gcc/config/svr3.h
gcc/crtstuff.c
gcc/function.c
gcc/libgcc2.c

index 750e1f4a9f20fe4d347a3ebeed41c87cf242b1fa..0aaa69acfc22e6f0b4ac79ea3f70ac9d8963a40e 100644 (file)
@@ -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)
 \f
-/* 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 {                                         \
index f0a4ecc5659b2acc5bf8cd2a40d9fb551cd2796e..0662aaacd154ea88125992215b6918a9a8746e76 100644 (file)
@@ -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.
-
-   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).
-
-   ASM_OUTPUT_CONSTRUCTOR should be defined
-   to push the address of the constructor.  */
+/* Define a few machine-specific details of the implementation of
+   constructors.  */
+
+/* Although the .init section is used, it is not automatically invoked.  */
+#define INVOKE__main
+
+/* 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
-
-/* 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)      \
+#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 }  
+
+/* 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)
-
-#undef DTORS_SECTION_ASM_OP
-#define DTORS_SECTION_ASM_OP FINI_SECTION_ASM_OP
+    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)
+
+/* 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)                                  
index 112f8c2185443721df37b8ad133fa945ab5659ea..9e871537a2fe9fdf8e9e5c45c113fd1c12a649de 100644 (file)
@@ -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 {                                                                   \
index e1f5934f30550d3ab91df2a2b6b64e0c9c0c865d..a13fbf20ba856c1d7b0533cdeac40519e4999daf 100644 (file)
@@ -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) */
index 4e5e2a73142e7ce02de26c69da73d902508ac39f..d250d5be8b677598550d30d50dc65ac7e2bf7c79 100644 (file)
@@ -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 */
 }
 \f
 /* Start the RTL for a new function, and set variables used for
index f477c13cfaa9894d033ce3670c52468592213a30..a770502aea84e2ee86b3cab671a0cb28c2b0fb1a 100644 (file)
@@ -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 <stdio.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/vmmac.h>
+
+/* 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 */
 \f
 #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 */
 \f
@@ -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