mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	RISC-V: build: Allow LTO to be selected
Allow LTO to be selected for RISC-V, only when LLD >= 14, since there is an issue [1] in prior LLD versions that prevents LLD to generate proper machine code for RISC-V when writing `nop`s. To avoid boot failures in QEMU [2], '-mattr=+c' and '-mattr=+relax' need to be passed via '-mllvm' to ld.lld, as there appears to be an issue with LLVM's target-features and LTO [3], which can result in incorrect relocations to branch targets [4]. Once this is fixed in LLVM, it can be made conditional on affected ld.lld versions. Disable LTO for arch/riscv/kernel/pi, as llvm-objcopy expects an ELF object file when manipulating the files in that subfolder, rather than LLVM bitcode. [1] https://github.com/llvm/llvm-project/issues/50505, resolved by LLVM commit e63455d5e0e5 ("[MC] Use local MCSubtargetInfo in writeNops") [2] https://github.com/ClangBuiltLinux/linux/issues/1942 [3] https://github.com/llvm/llvm-project/issues/59350 [4] https://github.com/llvm/llvm-project/issues/65090 Tested-by: Wende Tan <twd2.me@gmail.com> Signed-off-by: Wende Tan <twd2.me@gmail.com> Co-developed-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Nathan Chancellor <nathan@kernel.org> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Link: https://lore.kernel.org/r/20231017-riscv-lto-v4-1-e7810b24e805@kernel.org Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
		
							parent
							
								
									3a6dd5f614
								
							
						
					
					
						commit
						021d23428b
					
				
					 3 changed files with 11 additions and 0 deletions
				
			
		|  | @ -47,6 +47,9 @@ config RISCV | |||
| 	select ARCH_SUPPORTS_CFI_CLANG | ||||
| 	select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU | ||||
| 	select ARCH_SUPPORTS_HUGETLBFS if MMU | ||||
| 	# LLD >= 14: https://github.com/llvm/llvm-project/issues/50505 | ||||
| 	select ARCH_SUPPORTS_LTO_CLANG if LLD_VERSION >= 140000 | ||||
| 	select ARCH_SUPPORTS_LTO_CLANG_THIN if LLD_VERSION >= 140000 | ||||
| 	select ARCH_SUPPORTS_PAGE_TABLE_CHECK if MMU | ||||
| 	select ARCH_SUPPORTS_PER_VMA_LOCK if MMU | ||||
| 	select ARCH_SUPPORTS_SHADOW_CALL_STACK if HAVE_SHADOW_CALL_STACK | ||||
|  |  | |||
|  | @ -50,6 +50,11 @@ ifndef CONFIG_AS_IS_LLVM | |||
| 	KBUILD_CFLAGS += -Wa,-mno-relax | ||||
| 	KBUILD_AFLAGS += -Wa,-mno-relax | ||||
| endif | ||||
| # LLVM has an issue with target-features and LTO: https://github.com/llvm/llvm-project/issues/59350
 | ||||
| # Ensure it is aware of linker relaxation with LTO, otherwise relocations may
 | ||||
| # be incorrect: https://github.com/llvm/llvm-project/issues/65090
 | ||||
| else ifeq ($(CONFIG_LTO_CLANG),y) | ||||
| 	KBUILD_LDFLAGS += -mllvm -mattr=+c -mllvm -mattr=+relax | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(CONFIG_SHADOW_CALL_STACK),y) | ||||
|  |  | |||
|  | @ -9,6 +9,9 @@ KBUILD_CFLAGS	:= $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) -fpie \ | |||
| 		   -fno-asynchronous-unwind-tables -fno-unwind-tables \
 | ||||
| 		   $(call cc-option,-fno-addrsig) | ||||
| 
 | ||||
| # Disable LTO
 | ||||
| KBUILD_CFLAGS	:= $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS)) | ||||
| 
 | ||||
| KBUILD_CFLAGS	+= -mcmodel=medany | ||||
| 
 | ||||
| CFLAGS_cmdline_early.o += -D__NO_FORTIFY | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Wende Tan
						Wende Tan