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>
43 lines
1.3 KiB
Makefile
43 lines
1.3 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
# This file was copied from arm64/kernel/pi/Makefile.
|
|
|
|
KBUILD_CFLAGS := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) -fpie \
|
|
-Os -DDISABLE_BRANCH_PROFILING $(DISABLE_STACKLEAK_PLUGIN) \
|
|
$(call cc-option,-mbranch-protection=none) \
|
|
-I$(srctree)/scripts/dtc/libfdt -fno-stack-protector \
|
|
-D__DISABLE_EXPORTS -ffreestanding \
|
|
-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
|
|
CFLAGS_lib-fdt_ro.o += -D__NO_FORTIFY
|
|
|
|
GCOV_PROFILE := n
|
|
KASAN_SANITIZE := n
|
|
KCSAN_SANITIZE := n
|
|
UBSAN_SANITIZE := n
|
|
KCOV_INSTRUMENT := n
|
|
|
|
$(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \
|
|
--remove-section=.note.gnu.property \
|
|
--prefix-alloc-sections=.init.pi
|
|
$(obj)/%.pi.o: $(obj)/%.o FORCE
|
|
$(call if_changed,objcopy)
|
|
|
|
$(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
$(obj)/string.o: $(srctree)/lib/string.c FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
$(obj)/ctype.o: $(srctree)/lib/ctype.c FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
obj-y := cmdline_early.pi.o fdt_early.pi.o string.pi.o ctype.pi.o lib-fdt.pi.o lib-fdt_ro.pi.o
|
|
extra-y := $(patsubst %.pi.o,%.o,$(obj-y))
|