bn_mul.h: fix x86 PIC inline ASM compilation with GCC < 5
Fixes #1910 With ebx added to the MULADDC_STOP clobber list to fix #1550, the inline assembly fails to build with GCC < 5 in PIC mode with the following error: include/mbedtls/bn_mul.h:46:13: error: PIC register clobbered by ‘ebx’ in ‘asm’ This is because older GCC versions treated the x86 ebx register (which is used for the GOT) as a fixed reserved register when building as PIC. This is fixed by an improved register allocator in GCC 5+. From the release notes: Register allocation improvements: Reuse of the PIC hard register, instead of using a fixed register, was implemented on x86/x86-64 targets. This improves generated PIC code performance as more hard registers can be used. https://www.gnu.org/software/gcc/gcc-5/changes.html As a workaround, detect this situation and disable the inline assembly, similar to the MULADDC_CANNOT_USE_R7 logic. Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
parent
d5b1eb51db
commit
c0546e351f
1 changed files with 17 additions and 1 deletions
|
@ -90,13 +90,29 @@
|
|||
#if defined(__GNUC__) && \
|
||||
( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )
|
||||
|
||||
/*
|
||||
* GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a
|
||||
* fixed reserved register when building as PIC, leading to errors
|
||||
* like: bn_mul.h:46:13: error: PIC register clobbered by 'ebx' in 'asm'
|
||||
*
|
||||
* This is fixed by an improved register allocator in GCC 5+. From the
|
||||
* release notes:
|
||||
* Register allocation improvements: Reuse of the PIC hard register,
|
||||
* instead of using a fixed register, was implemented on x86/x86-64
|
||||
* targets. This improves generated PIC code performance as more hard
|
||||
* registers can be used.
|
||||
*/
|
||||
#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__)
|
||||
#define MULADDC_CANNOT_USE_EBX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Disable use of the i386 assembly code below if option -O0, to disable all
|
||||
* compiler optimisations, is passed, detected with __OPTIMIZE__
|
||||
* This is done as the number of registers used in the assembly code doesn't
|
||||
* work with the -O0 option.
|
||||
*/
|
||||
#if defined(__i386__) && defined(__OPTIMIZE__)
|
||||
#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX)
|
||||
|
||||
#define MULADDC_X1_INIT \
|
||||
{ mbedtls_mpi_uint t; \
|
||||
|
|
Loading…
Reference in a new issue