mirror of
				https://github.com/Mbed-TLS/mbedtls.git
				synced 2025-11-03 20:33:16 +03:00 
			
		
		
		
	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:
		
				
					committed by
					
						
						Tom Cosgrove
					
				
			
			
				
	
			
			
			
						parent
						
							8bb9e46c7c
						
					
				
				
					commit
					9d9d45c6b2
				
			@@ -94,13 +94,29 @@
 | 
				
			|||||||
#if defined(__GNUC__) && \
 | 
					#if defined(__GNUC__) && \
 | 
				
			||||||
    ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )
 | 
					    ( !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
 | 
					 * Disable use of the i386 assembly code below if option -O0, to disable all
 | 
				
			||||||
 * compiler optimisations, is passed, detected with __OPTIMIZE__
 | 
					 * compiler optimisations, is passed, detected with __OPTIMIZE__
 | 
				
			||||||
 * This is done as the number of registers used in the assembly code doesn't
 | 
					 * This is done as the number of registers used in the assembly code doesn't
 | 
				
			||||||
 * work with the -O0 option.
 | 
					 * work with the -O0 option.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#if defined(__i386__) && defined(__OPTIMIZE__)
 | 
					#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MULADDC_INIT                        \
 | 
					#define MULADDC_INIT                        \
 | 
				
			||||||
    asm(                                    \
 | 
					    asm(                                    \
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user