# # Support for gcc link time optimization # DISABLE_LTO := LTO_CFLAGS := export DISABLE_LTO export LTO_CFLAGS ifdef CONFIG_LTO # 4.7 works mostly, but it sometimes loses symbols on large builds # This can be worked around by marking those symbols visible, # but that is fairly ugly and the problem is gone with 4.8 # So only allow it with 4.8 for now. ifeq ($(call cc-ifversion, -ge, 0408,y),y) ifneq ($(call cc-option,${LTO_CFLAGS},n),n) # We need HJ Lu's Linux binutils because mainline binutils does not # support mixing assembler and LTO code in the same ld -r object. # XXX check if the gcc plugin ld is the expected one too # XXX some Fedora binutils should also support it. How to check for that? ifeq ($(call ld-ifversion,-ge,22710001,y),y) LTO_CFLAGS := -flto -fno-toplevel-reorder LTO_FINAL_CFLAGS := -fuse-linker-plugin # the -fno-toplevel-reorder is to preserve the order of initcalls # everything else should tolerate reordering LTO_FINAL_CFLAGS +=-fno-toplevel-reorder # enable LTO and set the jobs used by the LTO phase # this should be -flto=jobserver to coordinate with the # parent make, but work around # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50639 # use as many jobs as processors are online for now # this actually seems to be a kernel bug with the pipe code LTO_FINAL_CFLAGS := -flto=$(shell getconf _NPROCESSORS_ONLN) #LTO_FINAL_CFLAGS := -flto=jobserver # requires plugin ar passed and very recent HJ binutils LTO_CFLAGS += -fno-fat-lto-objects # Used to disable LTO for specific files (e.g. vdso) DISABLE_LTO := -fno-lto LTO_FINAL_CFLAGS += ${LTO_CFLAGS} -fwhole-program ifdef CONFIG_LTO_DEBUG LTO_FINAL_CFLAGS += -dH -fdump-ipa-cgraph -fdump-ipa-inline-details # -Wl,-plugin-save-temps -save-temps LTO_CFLAGS += endif ifdef CONFIG_LTO_CP_CLONE LTO_FINAL_CFLAGS += -fipa-cp-clone LTO_CFLAGS += -fipa-cp-clone endif # In principle gcc should pass through options in the object files, # but it doesn't always work. So do it here manually # Note that special options for individual files does not # work currently (except for some special cases that only # affect the compiler frontend) # The main offenders are FTRACE and GCOV -- we exclude # those in the config. LTO_FINAL_CFLAGS += $(filter -g%,${KBUILD_CFLAGS}) LTO_FINAL_CFLAGS += $(filter -O%,${KBUILD_CFLAGS}) LTO_FINAL_CFLAGS += $(filter -f%,${KBUILD_CFLAGS}) LTO_FINAL_CFLAGS += $(filter -m%,${KBUILD_CFLAGS}) LTO_FINAL_CFLAGS += $(filter -W%,${KBUILD_CFLAGS}) KBUILD_CFLAGS += ${LTO_CFLAGS} LDFINAL := ${CONFIG_SHELL} ${srctree}/scripts/gcc-ld \ ${LTO_FINAL_CFLAGS} else $(warning "WARNING: Too old linker version $(call ld-version) for kernel LTO. You need Linux binutils. CONFIG_LTO disabled.") endif else $(warning "WARNING: Compiler/Linker does not support LTO/WHOPR with linker plugin. CONFIG_LTO disabled.") endif else $(warning "WARNING: GCC $(call cc-version) too old for LTO/WHOPR. CONFIG_LTO disabled") endif endif