diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2017-05-12 01:56:52 +1000 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2017-05-30 14:59:51 +1000 |
commit | efe0160cfd40a99c052a00e174787c1f4158a9cd (patch) | |
tree | 61f8f8ad39191e2bbc1980e2a493b63ddc79f397 | |
parent | cde9f2f4207f769c0f8f0f53a431348ca6f3c182 (diff) | |
download | blackbird-op-linux-efe0160cfd40a99c052a00e174787c1f4158a9cd.tar.gz blackbird-op-linux-efe0160cfd40a99c052a00e174787c1f4158a9cd.zip |
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 <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/Makefile | 10 | ||||
-rw-r--r-- | arch/powerpc/lib/Makefile | 13 |
2 files changed, 18 insertions, 5 deletions
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 \ |