From: Maciej W. Rozycki Date: Fri, 16 Aug 2013 22:23:29 +0000 (+0000) Subject: mips16.S (CE_STARTFN, CE_ENDFN): New macros. X-Git-Tag: releases/gcc-4.9.0~4549 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0f9bde1fac5167972cf4d1467b511db7dbef7089;p=thirdparty%2Fgcc.git mips16.S (CE_STARTFN, CE_ENDFN): New macros. * 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 : For non-R5900 add t-slibgcc-libgcc to tmake_file. Co-Authored-By: Catherine Moore Co-Authored-By: Richard Sandiford From-SVN: r201805 --- diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index d7451db283f4..00fdc8d891ef 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,16 @@ +2013-08-16 Maciej W. Rozycki + Catherine Moore + Richard Sandiford + + * 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 : For non-R5900 add t-slibgcc-libgcc + to tmake_file. + 2013-08-13 Maciej W. Rozycki * config.host : Remove a stray comment. diff --git a/libgcc/config.host b/libgcc/config.host index ee86f2958441..187391e9a2e8 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 d4e4777c8171..ed949c3af591 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 944c7c884ed7..d910758fe3ac 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. */