From 3330492ef15f4635f9403888a3a6dc1450a26750 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 24 Jun 2020 08:59:13 +0200 Subject: [PATCH] Revert "ANDROID: kbuild: add support for Clang LTO" This reverts commit 310afefe71d480d563f3691b74bff61a53ba81ca as the LTO feature causes merge issues with 5.8-rc1. So remove it for now and allow the developer to add the latest version of the patches later on. Cc: Sami Tolvanen Signed-off-by: Greg Kroah-Hartman Change-Id: I4f30d8544545860dd1a70bd18a63b9a1673c6c6a --- Makefile | 29 +-------------- arch/Kconfig | 47 ------------------------ include/asm-generic/vmlinux.lds.h | 5 +-- scripts/Makefile.build | 30 ++-------------- scripts/Makefile.modfinal | 15 +------- scripts/Makefile.modpost | 25 ++----------- scripts/link-vmlinux.sh | 59 +++++-------------------------- scripts/mod/modpost.c | 7 ---- 8 files changed, 18 insertions(+), 199 deletions(-) diff --git a/Makefile b/Makefile index 61aaf028d5d5..5d8d571dad30 100644 --- a/Makefile +++ b/Makefile @@ -674,16 +674,6 @@ RETPOLINE_VDSO_CFLAGS := $(call cc-option,$(RETPOLINE_VDSO_CFLAGS_GCC),$(call cc export RETPOLINE_CFLAGS export RETPOLINE_VDSO_CFLAGS -# Make toolchain changes before including arch/$(SRCARCH)/Makefile to ensure -# ar/cc/ld-* macros return correct values. -ifdef CONFIG_LTO_CLANG -# LTO produces LLVM IR instead of object files. Use llvm-ar and llvm-nm, so we -# can process these. -AR := llvm-ar -LLVM_NM := llvm-nm -export LLVM_NM -endif - include arch/$(SRCARCH)/Makefile ifdef need-config @@ -876,22 +866,6 @@ ifdef CONFIG_LIVEPATCH KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) endif -ifdef CONFIG_LTO_CLANG -ifdef CONFIG_THINLTO -CC_FLAGS_LTO_CLANG := -flto=thin $(call cc-option, -fsplit-lto-unit) -KBUILD_LDFLAGS += --thinlto-cache-dir=.thinlto-cache -else -CC_FLAGS_LTO_CLANG := -flto -endif -CC_FLAGS_LTO_CLANG += -fvisibility=default -endif - -ifdef CONFIG_LTO -CC_FLAGS_LTO := $(CC_FLAGS_LTO_CLANG) -KBUILD_CFLAGS += $(CC_FLAGS_LTO) -export CC_FLAGS_LTO -endif - ifdef CONFIG_CFI_CLANG CC_FLAGS_CFI := -fsanitize=cfi \ -fno-sanitize-cfi-canonical-jump-tables \ @@ -1807,8 +1781,7 @@ clean: $(clean-dirs) -o -name '.tmp_*.o.*' \ -o -name '*.c.[012]*.*' \ -o -name '*.ll' \ - -o -name '*.gcno' \ - -o -name '*.*.symversions' \) -type f -print | xargs rm -f + -o -name '*.gcno' \) -type f -print | xargs rm -f # Generate tags for editors # --------------------------------------------------------------------------- diff --git a/arch/Kconfig b/arch/Kconfig index cef469ba55d2..c76449c37f58 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -558,53 +558,6 @@ config SHADOW_CALL_STACK reading and writing arbitrary memory may be able to locate them and hijack control flow by modifying the stacks. -config LTO - bool - -config ARCH_SUPPORTS_LTO_CLANG - bool - help - An architecture should select this option if it supports: - - compiling with Clang, - - compiling inline assembly with Clang's integrated assembler, - - and linking with LLD. - -config ARCH_SUPPORTS_THINLTO - bool - help - An architecture should select this if it supports Clang ThinLTO. - -config THINLTO - bool "Use Clang's ThinLTO (EXPERIMENTAL)" - depends on LTO_CLANG && ARCH_SUPPORTS_THINLTO - default y - help - Use ThinLTO to speed up Link Time Optimization. - -choice - prompt "Link-Time Optimization (LTO) (EXPERIMENTAL)" - default LTO_NONE - help - This option turns on Link-Time Optimization (LTO). - -config LTO_NONE - bool "None" - -config LTO_CLANG - bool "Use Clang's Link Time Optimization (LTO) (EXPERIMENTAL)" - depends on ARCH_SUPPORTS_LTO_CLANG - depends on !KASAN - depends on !FTRACE_MCOUNT_RECORD - depends on CC_IS_CLANG && CLANG_VERSION >= 100000 && LD_IS_LLD - select LTO - help - This option enables Clang's Link Time Optimization (LTO), which allows - the compiler to optimize the kernel globally at link time. If you - enable this option, the compiler generates LLVM IR instead of object - files, and the actual compilation from IR occurs at the LTO link step, - which may take several minutes. - -endchoice config CFI_CLANG bool "Use Clang's Control Flow Integrity (CFI)" diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index c48d656e4344..e4ce269eb7e0 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -89,13 +89,10 @@ * .data. We don't want to pull in .data..other sections, which Linux * has defined. Same for text and bss. * - * With LTO_CLANG, the linker also splits sections by default, so we need - * these macros to combine the sections during the final link. - * * RODATA_MAIN is not used because existing code already defines .rodata.x * sections to be brought in with rodata. */ -#if defined(CONFIG_LD_DEAD_CODE_DATA_ELIMINATION) || defined(CONFIG_LTO_CLANG) +#ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION #define TEXT_MAIN .text .text.[0-9a-zA-Z_]* #define TEXT_CFI_MAIN .text.[0-9a-zA-Z_]*.cfi #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX* diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 3fb2f5d27267..c8a38ffc0ea6 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -94,7 +94,7 @@ endif # --------------------------------------------------------------------------- quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ - cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS) $(CC_FLAGS_LTO), $(c_flags)) $(DISABLE_LTO) -fverbose-asm -S -o $@ $< + cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS), $(c_flags)) $(DISABLE_LTO) -fverbose-asm -S -o $@ $< $(obj)/%.s: $(src)/%.c FORCE $(call if_changed_dep,cc_s_c) @@ -149,15 +149,6 @@ ifdef CONFIG_MODVERSIONS # the actual value of the checksum generated by genksyms # o remove .tmp_.o to .o -ifdef CONFIG_LTO_CLANG -# Generate .o.symversions files for each .o with exported symbols, and link these -# to the kernel and/or modules at the end. -cmd_modversions_c = \ - if $(LLVM_NM) $@ | grep -q __ksymtab; then \ - $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ - > $@.symversions; \ - fi; -else cmd_modversions_c = \ if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \ $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ @@ -169,7 +160,6 @@ cmd_modversions_c = \ rm -f $(@D)/.tmp_$(@F:.o=.ver); \ fi endif -endif ifdef CONFIG_FTRACE_MCOUNT_RECORD ifndef CC_USING_RECORD_MCOUNT @@ -407,11 +397,8 @@ ifdef builtin-target quiet_cmd_ar_builtin = AR $@ cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs) -quiet_cmd_ar_and_symver = AR $@ - cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin) - $(builtin-target): $(real-obj-y) FORCE - $(call if_changed,ar_and_symver) + $(call if_changed,ar_builtin) targets += $(builtin-target) endif # builtin-target @@ -431,11 +418,8 @@ $(modorder-target): $(subdir-ym) FORCE # ifdef lib-target -quiet_cmd_ar_lib = AR $@ - cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar) - $(lib-target): $(lib-y) FORCE - $(call if_changed,ar_lib) + $(call if_changed,ar) targets += $(lib-target) @@ -445,16 +429,8 @@ endif # Do not replace $(filter %.o,^) with $(real-prereqs). When a single object # module is turned into a multi object module, $^ will contain header file # dependencies recorded in the .*.cmd file. -ifdef CONFIG_LTO_CLANG -quiet_cmd_link_multi-m = AR [M] $@ -cmd_link_multi-m = \ - $(cmd_update_lto_symversions); \ - rm -f $@; \ - $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(filter %.o,$^) -else quiet_cmd_link_multi-m = LD [M] $@ cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^) -endif $(multi-used-m): FORCE $(call if_changed,link_multi-m) diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal index 147ed6c243ef..411c1e600e7d 100644 --- a/scripts/Makefile.modfinal +++ b/scripts/Makefile.modfinal @@ -30,27 +30,14 @@ quiet_cmd_cc_o_c = CC [M] $@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) quiet_cmd_ld_ko_o = LD [M] $@ - -ifdef CONFIG_LTO_CLANG - cmd_ld_ko_o = \ - $(LD) -r $(LDFLAGS) \ - $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ - $(addprefix -T , $(KBUILD_LDS_MODULE)) \ - $(shell [ -s $(@:.ko=.o.symversions) ] && \ - echo -T $(@:.ko=.o.symversions)) \ - -o $@ --whole-archive \ - $(filter-out FORCE,$(^:$(modpost-ext).o=.o)); \ - $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) -else cmd_ld_ko_o = \ $(LD) -r $(KBUILD_LDFLAGS) \ $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ $(addprefix -T , $(KBUILD_LDS_MODULE)) \ -o $@ $(filter %.o, $^); \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) -endif -$(modules): %.ko: %$(modpost-ext).o %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE +$(modules): %.ko: %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE +$(call if_changed,ld_ko_o) targets += $(modules) $(modules:.ko=.mod.o) diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index e1da4efba42f..475512015340 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -85,32 +85,13 @@ endif # find all modules listed in modules.order modules := $(sort $(shell cat $(MODORDER))) -# With CONFIG_LTO_CLANG, .o files might be LLVM IR, so we need to link them -# into actual objects before passing them to modpost -modpost-ext = $(if $(CONFIG_LTO_CLANG),.lto,) - -ifdef CONFIG_LTO_CLANG -quiet_cmd_cc_lto_link_modules = LTO [M] $@ -cmd_cc_lto_link_modules = \ - $(LD) $(ld_flags) -r -o $(@) \ - $(shell [ -s $(@:$(modpost-ext).o=.o.symversions) ] && \ - echo -T $(@:$(modpost-ext).o=.o.symversions)) \ - --whole-archive $(filter-out FORCE,$^) - -$(modules:.ko=$(modpost-ext).o): %$(modpost-ext).o: %.o FORCE - $(call if_changed,cc_lto_link_modules) - -PHONY += FORCE -FORCE: - -endif - # Read out modules.order instead of expanding $(modules) to pass in modpost. # Otherwise, allmodconfig would fail with "Argument list too long". quiet_cmd_modpost = MODPOST $(words $(modules)) modules - cmd_modpost = sed 's/\.ko$$/$(modpost-ext)\.o/' $(MODORDER) | $(MODPOST) + cmd_modpost = sed 's/ko$$/o/' $(MODORDER) | $(MODPOST) -__modpost: $(modules:.ko=$(modpost-ext).o) +__modpost: + @$(kecho) ' Building modules, stage 2.' $(call cmd,modpost) ifneq ($(KBUILD_MODPOST_NOFINAL),1) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 4d5d76a713e6..0539b69a66c4 100755 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -39,30 +39,6 @@ info() fi } -# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into -# .tmp_symversions -modversions() -{ - if [ -z "${CONFIG_LTO_CLANG}" ]; then - return - fi - if [ -z "${CONFIG_MODVERSIONS}" ]; then - return - fi - - rm -f .tmp_symversions - - for a in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do - for o in $(${AR} t $a); do - if [ -f ${o}.symversions ]; then - cat ${o}.symversions >> .tmp_symversions - fi - done - done - - echo "-T .tmp_symversions" -} - # Link of vmlinux.o used for section mismatch analysis # ${1} output file modpost_link() @@ -76,15 +52,7 @@ modpost_link() ${KBUILD_VMLINUX_LIBS} \ --end-group" - if [ -n "${CONFIG_LTO_CLANG}" ]; then - # This might take a while, so indicate that we're doing - # an LTO link - info LTO ${1} - else - info LD ${1} - fi - - ${LD} ${KBUILD_LDFLAGS} -r -o ${1} $(modversions) ${objects} + ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects} } objtool_link() @@ -131,22 +99,13 @@ vmlinux_link() fi if [ "${SRCARCH}" != "um" ]; then - if [ -n "${CONFIG_LTO_CLANG}" ]; then - # Use vmlinux.o instead of performing the slow LTO - # link again. - objects="--whole-archive \ - vmlinux.o \ - --no-whole-archive \ - ${@}" - else - objects="--whole-archive \ - ${KBUILD_VMLINUX_OBJS} \ - --no-whole-archive \ - --start-group \ - ${KBUILD_VMLINUX_LIBS} \ - --end-group \ - ${@}" - fi + objects="--whole-archive \ + ${KBUILD_VMLINUX_OBJS} \ + --no-whole-archive \ + --start-group \ + ${KBUILD_VMLINUX_LIBS} \ + --end-group \ + ${@}" ${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux} \ ${strip_debug#-Wl,} \ @@ -263,7 +222,6 @@ cleanup() rm -f .btf.* rm -f .tmp_System.map rm -f .tmp_kallsyms* - rm -f .tmp_symversions rm -f .tmp_vmlinux* rm -f System.map rm -f vmlinux @@ -315,6 +273,7 @@ fi; ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 #link vmlinux.o +info LD vmlinux.o modpost_link vmlinux.o objtool_link vmlinux.o diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 7bc4bd884405..9a98af90e625 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -139,9 +139,6 @@ static struct module *new_module(const char *modname) p[strlen(p) - 2] = '\0'; mod->is_dot_o = 1; } - /* strip trailing .lto */ - if (strends(p, ".lto")) - p[strlen(p) - 4] = '\0'; /* add to list */ mod->name = p; @@ -1991,10 +1988,6 @@ static char *remove_dot(char *s) size_t m = strspn(s + n + 1, "0123456789"); if (m && (s[n + m] == '.' || s[n + m] == 0)) s[n] = 0; - - /* strip trailing .lto */ - if (strends(s, ".lto")) - s[strlen(s) - 4] = '\0'; } return s; }