From 3c0121e4ebbef242d704631435f009c695202eb1 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 15 Jan 2003 07:42:21 +0000 Subject: mips.h (CRT_CALL_STATIC_FUNCTION): Define so as to set $gp before the call. * config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Define so as to set $gp before the call. From-SVN: r61310 --- gcc/ChangeLog | 5 +++++ gcc/config/mips/mips.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62db009..dba42fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-01-15 Alexandre Oliva + + * config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Define so as + to set $gp before the call. + 2003-01-14 Richard Henderson * config/alpha/alpha.c (alpha_expand_mov): Use correct mode diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 864be70..3e19180 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -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 -- cgit v1.1