From 8d92d2743c400d2b0bf14954e14bc343e1953168 Mon Sep 17 00:00:00 2001 From: Petar Jovanovic Date: Wed, 29 Apr 2015 20:28:52 +0000 Subject: [PATCH] mips.h (CRT_CALL_STATIC_FUNCTION): Fix the macro to use la/jalr instead of jal. gcc/ChangeLog: 2015-04-21 Petar Jovanovic * 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 * gcc.target/mips/call-from-init.c: New test. * gcc.target/mips/mips.exp: Add section_start to mips_option_groups. From-SVN: r222589 --- gcc/ChangeLog | 5 ++++ gcc/config/mips/mips.h | 23 +++++++++++++++---- gcc/testsuite/ChangeLog | 5 ++++ .../gcc.target/mips/call-from-init.c | 12 ++++++++++ gcc/testsuite/gcc.target/mips/mips.exp | 1 + 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/call-from-init.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c95a75b668..3b363b04f72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-04-29 Petar Jovanovic + + * config/mips/mips.h (CRT_CALL_STATIC_FUNCTION): Fix the macro to use + la/jalr instead of jal. + 2015-04-29 Uros Bizjak PR target/65871 diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index ec69ed5d061..4bd83f50092 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/ChangeLog b/gcc/testsuite/ChangeLog index 9d428f83aec..7aebfecff77 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-04-29 Petar Jovanovic + + * gcc.target/mips/call-from-init.c: New test. + * gcc.target/mips/mips.exp: Add section_start to mips_option_groups. + 2015-04-29 Uros Bizjak PR target/65871 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 00000000000..9c6ac002e45 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/call-from-init.c @@ -0,0 +1,12 @@ +/* Check that __do_global_ctors_aux can be reached from .init section that + is in a different (256MB) region. */ +/* { dg-do run { target { "mips*-*-linux*" } } } */ +/* { dg-skip-if "" { "mips*-sde-elf mips*-mti-elf mips*-img-elf" } } */ +/* { dg-options "-Wl,--section-start=.init=0x0FFF0000" } */ +/* { dg-options "-Wl,--section-start=.text=0x10000000" } */ +/* { dg-options "-mips32r2" } */ + +int +main (void) { + return 0; +} diff --git a/gcc/testsuite/gcc.target/mips/mips.exp b/gcc/testsuite/gcc.target/mips/mips.exp index a0980a90d05..1dd4173b6d7 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 } { -- 2.30.2