mirror of https://github.com/OpenIPC/firmware.git
224 lines
7.2 KiB
Diff
224 lines
7.2 KiB
Diff
diff -drupN a/scripts/Makefile.build b/scripts/Makefile.build
|
|
--- a/scripts/Makefile.build 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/scripts/Makefile.build 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -176,6 +176,14 @@ cmd_cc_symtypes_c =
|
|
$(obj)/%.symtypes : $(src)/%.c FORCE
|
|
$(call cmd,cc_symtypes_c)
|
|
|
|
+# LLVM assembly
|
|
+# Generate .ll files from .c
|
|
+quiet_cmd_cc_ll_c = CC $(quiet_modtag) $@
|
|
+ cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $<
|
|
+
|
|
+$(obj)/%.ll: $(src)/%.c FORCE
|
|
+ $(call if_changed_dep,cc_ll_c)
|
|
+
|
|
# C (.c) files
|
|
# The C file is compiled and updated dependency information is generated.
|
|
# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
|
|
@@ -200,6 +208,23 @@ else
|
|
|
|
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
|
|
|
|
+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 $(OBJDUMP) -h $(@D)/.tmp_$(@F) >/dev/null 2>/dev/null; then \
|
|
+ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
|
|
+ $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
+ > $(@D)/$(@F).symversions; \
|
|
+ fi; \
|
|
+ else \
|
|
+ if $(LLVM_DIS) -o=- $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
|
|
+ $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
+ > $(@D)/$(@F).symversions; \
|
|
+ fi; \
|
|
+ fi; \
|
|
+ mv -f $(@D)/.tmp_$(@F) $@;
|
|
+else
|
|
cmd_modversions_c = \
|
|
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
|
|
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
@@ -212,12 +237,19 @@ cmd_modversions_c = \
|
|
mv -f $(@D)/.tmp_$(@F) $@; \
|
|
fi;
|
|
endif
|
|
+endif
|
|
|
|
ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
|
ifdef BUILD_C_RECORDMCOUNT
|
|
ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
|
|
RECORDMCOUNT_FLAGS = -w
|
|
endif
|
|
+
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+# With LTO, we postpone running recordmcount until after the LTO link step, so
|
|
+# let's export the parameters for the link script.
|
|
+export RECORDMCOUNT_FLAGS
|
|
+else
|
|
# Due to recursion, we must skip empty.o.
|
|
# The empty.o file is created in the make process in order to determine
|
|
# the target endianness and word size. It is made before all other C
|
|
@@ -226,23 +258,29 @@ sub_cmd_record_mcount = \
|
|
if [ $(@) != "scripts/mod/empty.o" ]; then \
|
|
$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \
|
|
fi;
|
|
+endif
|
|
+
|
|
recordmcount_source := $(srctree)/scripts/recordmcount.c \
|
|
$(srctree)/scripts/recordmcount.h
|
|
-else
|
|
+else # !BUILD_C_RECORDMCOUNT
|
|
sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
|
|
"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
|
|
"$(if $(CONFIG_64BIT),64,32)" \
|
|
"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
|
|
"$(LD)" "$(NM)" "$(RM)" "$(MV)" \
|
|
"$(if $(part-of-module),1,0)" "$(@)";
|
|
+
|
|
recordmcount_source := $(srctree)/scripts/recordmcount.pl
|
|
-endif
|
|
+endif # BUILD_C_RECORDMCOUNT
|
|
+
|
|
+ifndef CONFIG_LTO_CLANG
|
|
cmd_record_mcount = \
|
|
if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" = \
|
|
"$(CC_FLAGS_FTRACE)" ]; then \
|
|
$(sub_cmd_record_mcount) \
|
|
fi;
|
|
endif
|
|
+endif # CONFIG_FTRACE_MCOUNT_RECORD
|
|
|
|
ifdef CONFIG_STACK_VALIDATION
|
|
ifneq ($(SKIP_STACK_VALIDATION),1)
|
|
@@ -429,9 +467,30 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
|
|
#
|
|
ifdef builtin-target
|
|
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+ ifdef CONFIG_MODVERSIONS
|
|
+ # combine symversions for later processing
|
|
+ update_lto_symversions = \
|
|
+ rm -f $@.symversions; \
|
|
+ for i in $(filter-out FORCE,$^); do \
|
|
+ if [ -f $$i.symversions ]; then \
|
|
+ cat $$i.symversions \
|
|
+ >> $@.symversions; \
|
|
+ fi; \
|
|
+ done;
|
|
+ endif
|
|
+ # rebuild the symbol table with llvm-ar to include IR files
|
|
+ update_lto_symtable = ; \
|
|
+ mv -f $@ $@.tmp; \
|
|
+ $(LLVM_AR) rcsT$(KBUILD_ARFLAGS) $@ \
|
|
+ $$($(AR) t $@.tmp); \
|
|
+ rm -f $@.tmp
|
|
+endif
|
|
+
|
|
ifdef CONFIG_THIN_ARCHIVES
|
|
- cmd_make_builtin = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS)
|
|
- cmd_make_empty_builtin = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS)
|
|
+ cmd_make_builtin = $(update_lto_symversions) \
|
|
+ rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
|
|
+ cmd_make_empty_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
|
|
quiet_cmd_link_o_target = AR $@
|
|
else
|
|
cmd_make_builtin = $(LD) $(ld_flags) -r -o
|
|
@@ -471,7 +530,11 @@ ifdef lib-target
|
|
quiet_cmd_link_l_target = AR $@
|
|
|
|
ifdef CONFIG_THIN_ARCHIVES
|
|
- cmd_link_l_target = rm -f $@; $(AR) rcsT$(KBUILD_ARFLAGS) $@ $(lib-y)
|
|
+ cmd_link_l_target = \
|
|
+ $(update_lto_symversions) \
|
|
+ rm -f $@; \
|
|
+ $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y) \
|
|
+ $(update_lto_symtable)
|
|
else
|
|
cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
|
|
endif
|
|
@@ -489,14 +552,36 @@ else
|
|
ref_prefix = EXTERN(
|
|
endif
|
|
|
|
-quiet_cmd_export_list = EXPORTS $@
|
|
-cmd_export_list = $(OBJDUMP) -h $< | \
|
|
- sed -ne '/___ksymtab/{s/.*+/$(ref_prefix)/;s/ .*/)/;p}' >$(ksyms-lds);\
|
|
- rm -f $(dummy-object);\
|
|
- $(AR) rcs$(KBUILD_ARFLAGS) $(dummy-object);\
|
|
+filter_export_list = sed -ne '/___ksymtab/s/.*+\([^ "]*\).*/$(ref_prefix)\1)/p'
|
|
+link_export_list = rm -f $(dummy-object);\
|
|
+ echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
|
|
$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
|
|
rm $(dummy-object) $(ksyms-lds)
|
|
|
|
+quiet_cmd_export_list = EXPORTS $@
|
|
+
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+# objdump doesn't understand IR files and llvm-dis doesn't support archives,
|
|
+# so we'll walk through each file in the archive separately
|
|
+cmd_export_list = \
|
|
+ rm -f $(ksyms-lds); \
|
|
+ for o in $$($(AR) t $<); do \
|
|
+ if $(OBJDUMP) -h $$o >/dev/null 2>/dev/null; then \
|
|
+ $(OBJDUMP) -h $$o | \
|
|
+ $(filter_export_list) \
|
|
+ >>$(ksyms-lds); \
|
|
+ else \
|
|
+ $(LLVM_DIS) -o=- $$o | \
|
|
+ $(filter_export_list) \
|
|
+ >>$(ksyms-lds); \
|
|
+ fi; \
|
|
+ done; \
|
|
+ $(link_export_list)
|
|
+else
|
|
+cmd_export_list = $(OBJDUMP) -h $< | $(filter_export_list) >$(ksyms-lds); \
|
|
+ $(link_export_list)
|
|
+endif
|
|
+
|
|
$(obj)/lib-ksyms.o: $(lib-target) FORCE
|
|
$(call if_changed,export_list)
|
|
|
|
@@ -520,20 +605,36 @@ $($(subst $(obj)/,,$(@:.o=-objs))) \
|
|
$($(subst $(obj)/,,$(@:.o=-y))) \
|
|
$($(subst $(obj)/,,$(@:.o=-m)))), $^)
|
|
|
|
-quiet_cmd_link_multi-y = LD $@
|
|
-cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
|
|
+cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
|
|
+
|
|
+ifdef CONFIG_THIN_ARCHIVES
|
|
+ quiet_cmd_link_multi-y = AR $@
|
|
+ cmd_link_multi-y = $(update_lto_symversions) \
|
|
+ rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(link_multi_deps) \
|
|
+ $(update_lto_symtable)
|
|
+else
|
|
+ quiet_cmd_link_multi-y = LD $@
|
|
+ cmd_link_multi-y = $(cmd_link_multi-link)
|
|
+endif
|
|
|
|
quiet_cmd_link_multi-m = LD [M] $@
|
|
-cmd_link_multi-m = $(cmd_link_multi-y)
|
|
+
|
|
+ifdef CONFIG_LTO_CLANG
|
|
+ # don't compile IR until needed
|
|
+ cmd_link_multi-m = $(cmd_link_multi-y)
|
|
+else
|
|
+ cmd_link_multi-m = $(cmd_link_multi-link)
|
|
+endif
|
|
|
|
$(multi-used-y): FORCE
|
|
$(call if_changed,link_multi-y)
|
|
-$(call multi_depend, $(multi-used-y), .o, -objs -y)
|
|
|
|
$(multi-used-m): FORCE
|
|
$(call if_changed,link_multi-m)
|
|
@{ echo $(@:.o=.ko); echo $(link_multi_deps); \
|
|
$(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
|
|
+
|
|
+$(call multi_depend, $(multi-used-y), .o, -objs -y)
|
|
$(call multi_depend, $(multi-used-m), .o, -objs -y -m)
|
|
|
|
targets += $(multi-used-y) $(multi-used-m)
|