summaryrefslogtreecommitdiffstats
path: root/libgcc
diff options
context:
space:
mode:
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog13
-rw-r--r--libgcc/config.host14
-rw-r--r--libgcc/config/mips/libgcc-mips16.ver38
-rw-r--r--libgcc/config/mips/mips16.S34
4 files changed, 48 insertions, 51 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index d7451db283f..00fdc8d891e 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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.
diff --git a/libgcc/config.host b/libgcc/config.host
index ee86f295844..187391e9a2e 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -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
diff --git a/libgcc/config/mips/libgcc-mips16.ver b/libgcc/config/mips/libgcc-mips16.ver
index d4e4777c817..ed949c3af59 100644
--- a/libgcc/config/mips/libgcc-mips16.ver
+++ b/libgcc/config/mips/libgcc-mips16.ver
@@ -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
}
diff --git a/libgcc/config/mips/mips16.S b/libgcc/config/mips/mips16.S
index 944c7c884ed..d910758fe3a 100644
--- a/libgcc/config/mips/mips16.S
+++ b/libgcc/config/mips/mips16.S
@@ -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. */
OpenPOWER on IntegriCloud