]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* config/mips/mips16.S (CE_STARTFN, CE_ENDFN): New macros.
authormacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Aug 2013 22:23:29 +0000 (22:23 +0000)
committermacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Aug 2013 22:23:29 +0000 (22:23 +0000)
(RET_FUNCTION): Use them in place of STARTFN and ENDFN.
(CALL_STUB_NO_RET): Likewise.
(CALL_STUB_RET): Likewise.
* config/mips/libgcc-mips16.ver: Remove __mips16_call_stub and
__mips16_ret call/return stub symbols.
* config.host <mips*-*-linux>: For non-R5900 add t-slibgcc-libgcc
to tmake_file.

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

libgcc/ChangeLog
libgcc/config.host
libgcc/config/mips/libgcc-mips16.ver
libgcc/config/mips/mips16.S

index d7451db283f41322cfef751de4de2ac31449b633..00fdc8d891efc1658a60f646594c13ff754f6abb 100644 (file)
@@ -1,3 +1,16 @@
+2013-08-16  Maciej W. Rozycki  <macro@codesourcery.com>
+            Catherine Moore  <clm@codesourcery.com>
+            Richard Sandiford <rdsandiford@googlemail.com>
+
+       * config/mips/mips16.S (CE_STARTFN, CE_ENDFN): New macros.
+       (RET_FUNCTION): Use them in place of STARTFN and ENDFN.
+       (CALL_STUB_NO_RET): Likewise.
+       (CALL_STUB_RET): Likewise.
+       * config/mips/libgcc-mips16.ver: Remove __mips16_call_stub and
+       __mips16_ret call/return stub symbols.
+       * config.host <mips*-*-linux>: For non-R5900 add t-slibgcc-libgcc
+       to tmake_file.
+
 2013-08-13  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * config.host <mips*-*-linux*>: Remove a stray comment.
index ee86f2958441cbc3bc25b0ff50424415694614e1..187391e9a2e8de1d4e371a0d98de53c2403cacde 100644 (file)
@@ -741,13 +741,13 @@ mips*-*-linux*)                           # Linux MIPS, either endian.
        extra_parts="$extra_parts crtfastmath.o"
        tmake_file="${tmake_file} t-crtfm"
        case ${host} in
-               mips64r5900* | mipsr5900*)
-                       # The MIPS16 support code uses floating point
-                       # instructions that are not supported on r5900.
-                       ;;
-               *)
-                       tmake_file="${tmake_file} mips/t-mips16"
-                       ;;
+         mips64r5900* | mipsr5900*)
+           # The MIPS16 support code uses floating point
+           # instructions that are not supported on r5900.
+           ;;
+         *)
+           tmake_file="${tmake_file} mips/t-mips16 t-slibgcc-libgcc"
+           ;;
        esac
        md_unwind_header=mips/linux-unwind.h
        if test "${ac_cv_sizeof_long_double}" = 16; then
index d4e4777c8171da55e2ad890c0fc6c1dcdf1d831c..ed949c3af591d0783a0356a4ecc8ead024f772ff 100644 (file)
@@ -45,42 +45,4 @@ GCC_4.4.0 {
   __mips16_floatsidf
   __mips16_floatunsidf
   __mips16_fix_truncdfsi
-  __mips16_ret_sf
-  __mips16_ret_sc
-  __mips16_ret_df
-  __mips16_ret_dc
-  __mips16_call_stub_1
-  __mips16_call_stub_5
-  __mips16_call_stub_2
-  __mips16_call_stub_6
-  __mips16_call_stub_9
-  __mips16_call_stub_10
-  __mips16_call_stub_sf_0
-  __mips16_call_stub_sf_1
-  __mips16_call_stub_sf_5
-  __mips16_call_stub_sf_2
-  __mips16_call_stub_sf_6
-  __mips16_call_stub_sf_9
-  __mips16_call_stub_sf_10
-  __mips16_call_stub_sc_0
-  __mips16_call_stub_sc_1
-  __mips16_call_stub_sc_5
-  __mips16_call_stub_sc_2
-  __mips16_call_stub_sc_6
-  __mips16_call_stub_sc_9
-  __mips16_call_stub_sc_10
-  __mips16_call_stub_df_0
-  __mips16_call_stub_df_1
-  __mips16_call_stub_df_5
-  __mips16_call_stub_df_2
-  __mips16_call_stub_df_6
-  __mips16_call_stub_df_9
-  __mips16_call_stub_df_10
-  __mips16_call_stub_dc_0
-  __mips16_call_stub_dc_1
-  __mips16_call_stub_dc_5
-  __mips16_call_stub_dc_2
-  __mips16_call_stub_dc_6
-  __mips16_call_stub_dc_9
-  __mips16_call_stub_dc_10
 }
index 944c7c884ed73aca566d584662f9c517b34a5666..d910758fe3ac9589da4c34b55627877cc0fbe713 100644 (file)
@@ -479,13 +479,35 @@ STARTFN (__mips16_fix_truncdfsi)
 #endif
 #endif /* !__mips_single_float */
 
+/* We don't export stubs from libgcc_s.so and always require static
+   versions to be pulled from libgcc.a as needed because they use $2
+   and possibly $3 as arguments, diverging from the standard SysV ABI,
+   and as such would require severe pessimisation of MIPS16 PLT entries
+   just for this single special case.
+
+   For compatibility with old binaries that used safe standard MIPS PLT
+   entries and referred to these functions we still export them at
+   version GCC_4.4.0 for run-time loading only.  */
+
+#ifdef SHARED
+#define CE_STARTFN(NAME)                       \
+STARTFN (NAME##_compat);                       \
+       .symver NAME##_compat, NAME@GCC_4.4.0
+#define CE_ENDFN(NAME) ENDFN (NAME##_compat)
+#else
+#define CE_STARTFN(NAME)                       \
+STARTFN (NAME);                                        \
+       .hidden NAME
+#define CE_ENDFN(NAME) ENDFN (NAME)
+#endif
+
 /* Define a function NAME that moves a return value of mode MODE from
    FPRs to GPRs.  */
 
 #define RET_FUNCTION(NAME, MODE)       \
-STARTFN (NAME);                                \
+CE_STARTFN (NAME);                     \
        MOVE_##MODE##_RET (t, $31);     \
-       ENDFN (NAME)
+       CE_ENDFN (NAME)
 
 #ifdef L_m16retsf
 RET_FUNCTION (__mips16_ret_sf, SF)
@@ -526,13 +548,13 @@ RET_FUNCTION (__mips16_ret_dc, DC)
    to FPRs and then call function $2.  */
 
 #define CALL_STUB_NO_RET(NAME, CODE)   \
-STARTFN (NAME);                                \
+CE_STARTFN (NAME);                     \
        STUB_ARGS_##CODE;               \
        .set    noreorder;              \
        jr      $2;                     \
        move    $25,$2;                 \
        .set    reorder;                \
-       ENDFN (NAME)
+       CE_ENDFN (NAME)
 
 #ifdef L_m16stub1
 CALL_STUB_NO_RET (__mips16_call_stub_1, 1)
@@ -575,7 +597,7 @@ CALL_STUB_NO_RET (__mips16_call_stub_10, 10)
    however, it's faster to always do the copy.  */
 
 #define CALL_STUB_RET(NAME, CODE, MODE)                                        \
-STARTFN (NAME);                                                                \
+CE_STARTFN (NAME);                                                     \
        .cfi_startproc;                                                 \
        /* Create a fake CFA 4 bytes below the stack pointer.  */       \
        .cfi_def_cfa 29,-4;                                             \
@@ -591,7 +613,7 @@ STARTFN (NAME);                                                             \
        .set    reorder;                                                \
        MOVE_##MODE##_RET (f, $18);                                     \
        .cfi_endproc;                                                   \
-       ENDFN (NAME)
+       CE_ENDFN (NAME)
 
 /* First, instantiate the single-float set.  */