powerpc/64: Linker on-demand sfpr functions for modules
authorNicholas Piggin <npiggin@gmail.com>
Thu, 11 May 2017 15:56:52 +0000 (01:56 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 30 May 2017 04:59:51 +0000 (14:59 +1000)
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 <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/Makefile
arch/powerpc/lib/Makefile

index 3e0f0e1fadef87698f5d8c7fead35410b957d1f1..eaa1865e4a8d6b860ef082a2650ad20f469b40cc 100644 (file)
@@ -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 \
index 0ca405a27ac139f7ad30cee2bc430981e6645f02..2c56f4636c2b0bd62649c4a68217f4099d605366 100644 (file)
@@ -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 \