From: Nicholas Piggin Date: Thu, 11 May 2017 15:56:52 +0000 (+1000) Subject: powerpc/64: Linker on-demand sfpr functions for modules X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=efe0160cfd40;p=openwrt%2Fstaging%2Fblogic.git powerpc/64: Linker on-demand sfpr functions for modules For final link, the powerpc64 linker generates fpr save/restore functions on-demand, placing them in the .sfpr section. Starting with binutils 2.25, these can be provided for non-final links with --save-restore-funcs. Use that where possible for module links. This saves about 200 bytes per module (~60kB) on powernv defconfig build. Signed-off-by: Nicholas Piggin Signed-off-by: Michael Ellerman --- diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 3e0f0e1fadef..eaa1865e4a8d 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -189,7 +189,17 @@ else CHECKFLAGS += -D__LITTLE_ENDIAN__ endif +ifdef CONFIG_PPC32 KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o +else +ifeq ($(call ld-ifversion, -ge, 225000000, y),y) +# Have the linker provide sfpr if possible. +# There is a corresponding test in arch/powerpc/lib/Makefile +KBUILD_LDFLAGS_MODULE += --save-restore-funcs +else +KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o +endif +endif ifeq ($(CONFIG_476FPE_ERR46),y) KBUILD_LDFLAGS_MODULE += --ppc476-workaround \ diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 0ca405a27ac1..2c56f4636c2b 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -11,12 +11,15 @@ CFLAGS_REMOVE_feature-fixups.o = $(CC_FLAGS_FTRACE) obj-y += string.o alloc.o code-patching.o feature-fixups.o -# 64-bit linker creates .sfpr on demand for final link (vmlinux), -# so it is only needed for modules. -obj-$(CONFIG_PPC32) += crtsavres.o -extra-$(CONFIG_PPC64) += crtsavres.o +obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o -obj-$(CONFIG_PPC32) += div64.o copy_32.o +# See corresponding test in arch/powerpc/Makefile +# 64-bit linker creates .sfpr on demand for final link (vmlinux), +# so it is only needed for modules, and only for older linkers which +# do not support --save-restore-funcs +ifeq ($(call ld-ifversion, -lt, 225000000, y),y) +extra-$(CONFIG_PPC64) += crtsavres.o +endif obj64-y += copypage_64.o copyuser_64.o mem_64.o hweight_64.o \ copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \