Skip to content

Commit 9d9d45c

Browse files
jacmettom-cosgrove-arm
authored andcommitted
bn_mul.h: fix x86 PIC inline ASM compilation with GCC < 5
Fixes Mbed-TLS#1910 With ebx added to the MULADDC_STOP clobber list to fix Mbed-TLS#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 <[email protected]>
1 parent 8bb9e46 commit 9d9d45c

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

include/mbedtls/bn_mul.h

+17-1
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,29 @@
9494
#if defined(__GNUC__) && \
9595
( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )
9696

97+
/*
98+
* GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a
99+
* fixed reserved register when building as PIC, leading to errors
100+
* like: bn_mul.h:46:13: error: PIC register clobbered by 'ebx' in 'asm'
101+
*
102+
* This is fixed by an improved register allocator in GCC 5+. From the
103+
* release notes:
104+
* Register allocation improvements: Reuse of the PIC hard register,
105+
* instead of using a fixed register, was implemented on x86/x86-64
106+
* targets. This improves generated PIC code performance as more hard
107+
* registers can be used.
108+
*/
109+
#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__)
110+
#define MULADDC_CANNOT_USE_EBX
111+
#endif
112+
97113
/*
98114
* Disable use of the i386 assembly code below if option -O0, to disable all
99115
* compiler optimisations, is passed, detected with __OPTIMIZE__
100116
* This is done as the number of registers used in the assembly code doesn't
101117
* work with the -O0 option.
102118
*/
103-
#if defined(__i386__) && defined(__OPTIMIZE__)
119+
#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX)
104120

105121
#define MULADDC_INIT \
106122
asm( \

0 commit comments

Comments
 (0)