* config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Define so as
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 2003 07:42:21 +0000 (07:42 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 2003 07:42:21 +0000 (07:42 +0000)
to set $gp before the call.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61310 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mips/mips.h

index 62db009..dba42fb 100644 (file)
@@ -1,3 +1,8 @@
+2003-01-15  Alexandre Oliva  <aoliva@redhat.com>
+
+       * config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Define so as
+       to set $gp before the call.
+
 2003-01-14  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_expand_mov): Use correct mode
index 864be70..3e19180 100644 (file)
@@ -4674,3 +4674,31 @@ while (0)
 
 /* Generate calls to memcpy, etc., not bcopy, etc.  */
 #define TARGET_MEM_FUNCTIONS
+
+/* Since the bits of the _init and _fini function is spread across
+   many object files, each potentially with its own GP, we must assume
+   we need to load our GP.  We don't preserve $gp or $ra, since each
+   init/fini chunk is supposed to initialize $gp, and crti/crtn
+   already take care of preserving $ra and, when appropriate, $gp.  */
+#if _MIPS_SIM == _MIPS_SIM_ABI32
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)     \
+   asm (SECTION_OP "\n\
+       .set noreorder\n\
+       bal 1f\n\
+       nop\n\
+1:     .cpload $31\n\
+       .set reorder\n\
+       jal " USER_LABEL_PREFIX #FUNC "\n\
+       " TEXT_SECTION_ASM_OP);
+#elif (defined _ABIN32 && _MIPS_SIM == _ABIN32) \
+   || (defined _ABI64 && _MIPS_SIM == _ABI64)
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)     \
+   asm (SECTION_OP "\n\
+       .set noreorder\n\
+       bal 1f\n\
+       nop\n\
+1:     .set reorder\n\
+       .cpsetup $31, $2, 1b\n\
+       jal " USER_LABEL_PREFIX #FUNC "\n\
+       " TEXT_SECTION_ASM_OP);
+#endif