diff options
Diffstat (limited to '0006-kbuild-lto-fix-recordmcount.patch')
-rw-r--r-- | 0006-kbuild-lto-fix-recordmcount.patch | 238 |
1 files changed, 0 insertions, 238 deletions
diff --git a/0006-kbuild-lto-fix-recordmcount.patch b/0006-kbuild-lto-fix-recordmcount.patch deleted file mode 100644 index 1156acd9ad4f..000000000000 --- a/0006-kbuild-lto-fix-recordmcount.patch +++ /dev/null @@ -1,238 +0,0 @@ -From 1bbbfffdb5d0f291c8fc1787a8c9857ecb4b2f93 Mon Sep 17 00:00:00 2001 -From: Sami Tolvanen <samitolvanen@google.com> -Date: Thu, 2 Apr 2020 17:22:36 -0700 -Subject: [PATCH 06/24] kbuild: lto: fix recordmcount - -With LTO, LLVM bitcode won't be compiled into native code until -modpost_link. This change postpones calls to recordmcount until after -this step. - -In order to exclude specific functions from inspection, we add a new -code section .text..nomcount, which we tell recordmcount to ignore, and -a __nomcount attribute for moving functions to this section. - -Signed-off-by: Sami Tolvanen <samitolvanen@google.com> ---- - Makefile | 2 +- - arch/Kconfig | 2 +- - include/asm-generic/vmlinux.lds.h | 1 + - include/linux/compiler-clang.h | 4 ++++ - include/linux/compiler_types.h | 4 ++++ - kernel/trace/ftrace.c | 1 + - scripts/Makefile.build | 9 +++++++++ - scripts/Makefile.modfinal | 18 ++++++++++++++++-- - scripts/link-vmlinux.sh | 29 +++++++++++++++++++++++++++++ - scripts/recordmcount.c | 3 ++- - 10 files changed, 68 insertions(+), 5 deletions(-) - -diff --git a/Makefile b/Makefile -index b59ce19ef248..19e2bf26c52c 100644 ---- a/Makefile -+++ b/Makefile -@@ -862,7 +862,7 @@ KBUILD_AFLAGS += $(CC_FLAGS_USING) - ifdef CONFIG_DYNAMIC_FTRACE - ifdef CONFIG_HAVE_C_RECORDMCOUNT - BUILD_C_RECORDMCOUNT := y -- export BUILD_C_RECORDMCOUNT -+ export BUILD_C_RECORDMCOUNT RECORDMCOUNT_WARN - endif - endif - endif -diff --git a/arch/Kconfig b/arch/Kconfig -index d9c74e3b4cf8..694bfdc2073f 100644 ---- a/arch/Kconfig -+++ b/arch/Kconfig -@@ -599,7 +599,7 @@ config LTO_CLANG - depends on $(success,$(NM) --help | head -n 1 | grep -qi llvm) - depends on $(success,$(AR) --help | head -n 1 | grep -qi llvm) - depends on ARCH_SUPPORTS_LTO_CLANG -- depends on !FTRACE_MCOUNT_RECORD -+ depends on !FTRACE_MCOUNT_RECORD || HAVE_C_RECORDMCOUNT - depends on !KASAN - select LTO - help -diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h -index 7f62f7eef94c..7c9a686cf633 100644 ---- a/include/asm-generic/vmlinux.lds.h -+++ b/include/asm-generic/vmlinux.lds.h -@@ -566,6 +566,7 @@ - *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ - NOINSTR_TEXT \ - *(.text..refcount) \ -+ *(.text..nomcount) \ - *(.ref.text) \ - MEM_KEEP(init.text*) \ - MEM_KEEP(exit.text*) \ -diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h -index 5e55302e3bf6..21423d6f6dc4 100644 ---- a/include/linux/compiler-clang.h -+++ b/include/linux/compiler-clang.h -@@ -63,3 +63,7 @@ - #if __has_feature(shadow_call_stack) - # define __noscs __attribute__((__no_sanitize__("shadow-call-stack"))) - #endif -+ -+#if defined(CONFIG_LTO_CLANG) && defined(CONFIG_FTRACE_MCOUNT_RECORD) -+#define __nomcount __attribute__((__section__(".text..nomcount"))) -+#endif -diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h -index 01dd58c74d80..23c7cf44aa92 100644 ---- a/include/linux/compiler_types.h -+++ b/include/linux/compiler_types.h -@@ -231,6 +231,10 @@ struct ftrace_likely_data { - # define __noscs - #endif - -+#ifndef __nomcount -+# define __nomcount -+#endif -+ - #ifndef asm_volatile_goto - #define asm_volatile_goto(x...) asm goto(x) - #endif -diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c -index 1903b80db6eb..8e3ddb8123d9 100644 ---- a/kernel/trace/ftrace.c -+++ b/kernel/trace/ftrace.c -@@ -6062,6 +6062,7 @@ static int ftrace_cmp_ips(const void *a, const void *b) - return 0; - } - -+__nomcount - static int ftrace_process_locs(struct module *mod, - unsigned long *start, - unsigned long *end) -diff --git a/scripts/Makefile.build b/scripts/Makefile.build -index 5c0bbb6ddfcf..64e99f4baa5b 100644 ---- a/scripts/Makefile.build -+++ b/scripts/Makefile.build -@@ -187,6 +187,9 @@ endif - - ifdef CONFIG_FTRACE_MCOUNT_RECORD - ifndef CC_USING_RECORD_MCOUNT -+ifndef CC_USING_PATCHABLE_FUNCTION_ENTRY -+# With LTO, we postpone recordmcount until we compile a native binary -+ifndef CONFIG_LTO_CLANG - # compiler will not generate __mcount_loc use recordmcount or recordmcount.pl - ifdef BUILD_C_RECORDMCOUNT - ifeq ("$(origin RECORDMCOUNT_WARN)", "command line") -@@ -200,6 +203,8 @@ sub_cmd_record_mcount = \ - if [ $(@) != "scripts/mod/empty.o" ]; then \ - $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \ - fi; -+endif # CONFIG_LTO_CLANG -+ - recordmcount_source := $(srctree)/scripts/recordmcount.c \ - $(srctree)/scripts/recordmcount.h - else -@@ -209,11 +214,15 @@ sub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ - "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \ - "$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \ - "$(if $(part-of-module),1,0)" "$(@)"; -+ - recordmcount_source := $(srctree)/scripts/recordmcount.pl - endif # BUILD_C_RECORDMCOUNT -+ifndef CONFIG_LTO_CLANG - cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), \ - $(sub_cmd_record_mcount)) -+endif # CONFIG_LTO_CLANG - endif # CC_USING_RECORD_MCOUNT -+endif # CC_USING_PATCHABLE_FUNCTION_ENTRY - endif # CONFIG_FTRACE_MCOUNT_RECORD - - ifdef CONFIG_STACK_VALIDATION -diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal -index 1005b147abd0..d168f0cfe67c 100644 ---- a/scripts/Makefile.modfinal -+++ b/scripts/Makefile.modfinal -@@ -34,10 +34,24 @@ ifdef CONFIG_LTO_CLANG - # With CONFIG_LTO_CLANG, reuse the object file we compiled for modpost to - # avoid a second slow LTO link - prelink-ext := .lto --endif -+ -+# ELF processing was skipped earlier because we didn't have native code, -+# so let's now process the prelinked binary before we link the module. -+ -+ifdef CONFIG_FTRACE_MCOUNT_RECORD -+ifndef CC_USING_RECORD_MCOUNT -+ifndef CC_USING_PATCHABLE_FUNCTION_ENTRY -+cmd_ld_ko_o += $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) \ -+ $(@:.ko=$(prelink-ext).o); -+ -+endif # CC_USING_PATCHABLE_FUNCTION_ENTRY -+endif # CC_USING_RECORD_MCOUNT -+endif # CONFIG_FTRACE_MCOUNT_RECORD -+ -+endif # CONFIG_LTO_CLANG - - quiet_cmd_ld_ko_o = LD [M] $@ -- cmd_ld_ko_o = \ -+ cmd_ld_ko_o += \ - $(LD) -r $(KBUILD_LDFLAGS) \ - $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ - $(addprefix -T , $(KBUILD_LDS_MODULE)) \ -diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh -index 712769355a5b..c5715608fe63 100755 ---- a/scripts/link-vmlinux.sh -+++ b/scripts/link-vmlinux.sh -@@ -108,6 +108,29 @@ objtool_link() - fi - } - -+# If CONFIG_LTO_CLANG is selected, we postpone running recordmcount until -+# we have compiled LLVM IR to an object file. -+recordmcount() -+{ -+ if [ "${CONFIG_LTO_CLANG} ${CONFIG_FTRACE_MCOUNT_RECORD}" != "y y" ]; then -+ return -+ fi -+ -+ if [ -n "${CC_USING_RECORD_MCOUNT}" ]; then -+ return -+ fi -+ if [ -n "${CC_USING_PATCHABLE_FUNCTION_ENTRY}" ]; then -+ return -+ fi -+ -+ local flags="" -+ -+ [ -n "${RECORDMCOUNT_WARN}" ] && flags="-w" -+ -+ info MCOUNT $* -+ ${objtree}/scripts/recordmcount ${flags} $* -+} -+ - # Link of vmlinux - # ${1} - output file - # ${2}, ${3}, ... - optional extra .o files -@@ -316,6 +339,12 @@ objtool_link vmlinux.o - # modpost vmlinux.o to check for section mismatches - ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 - -+if [ -n "${CONFIG_LTO_CLANG}" ]; then -+ # If we postponed ELF processing steps due to LTO, process -+ # vmlinux.o instead. -+ recordmcount vmlinux.o -+fi -+ - info MODINFO modules.builtin.modinfo - ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo - info GEN modules.builtin -diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c -index 7225107a9aaf..9e9f10b4d649 100644 ---- a/scripts/recordmcount.c -+++ b/scripts/recordmcount.c -@@ -404,7 +404,8 @@ static uint32_t (*w2)(uint16_t); - /* Names of the sections that could contain calls to mcount. */ - static int is_mcounted_section_name(char const *const txtname) - { -- return strncmp(".text", txtname, 5) == 0 || -+ return (strncmp(".text", txtname, 5) == 0 && -+ strcmp(".text..nomcount", txtname) != 0) || - strcmp(".init.text", txtname) == 0 || - strcmp(".ref.text", txtname) == 0 || - strcmp(".sched.text", txtname) == 0 || --- -2.28.0 - |