New patch, v3. PTAL. Regards, Petar
gcc/ChangeLog: 2015-04-21 Petar Jovanovic <petar.jovano...@rt-rk.com> * config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Fix the macro to use la/jalr instead of jal. gcc/testsuite/ChangeLog: 2015-04-21 Petar Jovanovic <petar.jovano...@rt-rk.com> * gcc.target/mips/call-from-init.c: New test. * gcc.target/mips/mips.exp: Add section_start to mips_option_groups. commit 566564bd6d80fd6b5ebd6b8eccf09e3716246930 Author: Petar Jovanovic <petar.jovano...@rt-rk.com> Date: Thu Jan 22 02:15:22 2015 +0100 [mips] fix CRT_CALL_STATIC_FUNCTION macro jal can not reach a target in different region, so replace it with la/jalr variant. diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index ec69ed5..4bd83f5 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -3034,11 +3034,11 @@ while (0) nop\n\ 1: .cpload $31\n\ .set reorder\n\ - jal " USER_LABEL_PREFIX #FUNC "\n\ + la $25, " USER_LABEL_PREFIX #FUNC "\n\ + jalr $25\n\ .set pop\n\ " TEXT_SECTION_ASM_OP); -#elif ((defined _ABIN32 && _MIPS_SIM == _ABIN32) \ - || (defined _ABI64 && _MIPS_SIM == _ABI64)) +#elif (defined _ABIN32 && _MIPS_SIM == _ABIN32) #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ asm (SECTION_OP "\n\ .set push\n\ @@ -3048,7 +3048,22 @@ while (0) nop\n\ 1: .set reorder\n\ .cpsetup $31, $2, 1b\n\ - jal " USER_LABEL_PREFIX #FUNC "\n\ + la $25, " USER_LABEL_PREFIX #FUNC "\n\ + jalr $25\n\ + .set pop\n\ + " TEXT_SECTION_ASM_OP); +#elif (defined _ABI64 && _MIPS_SIM == _ABI64) +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ + asm (SECTION_OP "\n\ + .set push\n\ + .set nomips16\n\ + .set noreorder\n\ + bal 1f\n\ + nop\n\ +1: .set reorder\n\ + .cpsetup $31, $2, 1b\n\ + dla $25, " USER_LABEL_PREFIX #FUNC "\n\ + jalr $25\n\ .set pop\n\ " TEXT_SECTION_ASM_OP); #endif diff --git a/gcc/testsuite/gcc.target/mips/call-from-init.c b/gcc/testsuite/gcc.target/mips/call-from-init.c new file mode 100644 index 0000000..ee00a17 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/call-from-init.c @@ -0,0 +1,10 @@ +/* Check that __do_global_ctors_aux can be reached from .init section that + is in a different (256MB) region. */ +/* { dg-do run } */ +/* { dg-options "-Wl,--section-start=.init=0x0FF00000" } */ +/* { dg-options "-Wl,--section-start=.text=0x10000000" } */ + +int +main (void) { + return 0; +} diff --git a/gcc/testsuite/gcc.target/mips/mips.exp b/gcc/testsuite/gcc.target/mips/mips.exp index a0980a9..1dd4173 100644 --- a/gcc/testsuite/gcc.target/mips/mips.exp +++ b/gcc/testsuite/gcc.target/mips/mips.exp @@ -254,6 +254,7 @@ set mips_option_groups { madd "HAS_MADD" maddps "HAS_MADDPS" lsa "(|!)HAS_LSA" + section_start "-Wl,--section-start=.*" } for { set option 0 } { $option < 32 } { incr option } {