Create crtsavres.o for powerpc builds

Summary:
GCC expects to link in a crtsavres.o on powerpc platforms.  On
powerpc64 this is an empty file, but on powerpc and powerpcspe this does contain
some save/restore functions, which may not actually be necessary for newer
modern GCC and clang.  This appeases the in-tree gcc, though, and is needed in
order to switch to the BSD CRTRBEGIN.

PR:	233751
Reviewed By: andrew
Differential Revision: https://reviews.freebsd.org/D18826
This commit is contained in:
jhibbits 2019-01-12 21:29:54 +00:00
parent 32f8cf00d6
commit a551224a60
4 changed files with 198 additions and 7 deletions

View File

@ -28,10 +28,6 @@ CRTS_CFLAGS= -DCRTSTUFFS_O -DSHARED ${PICFLAG}
CFLAGS+= -DTARGET_ARM_EABI CFLAGS+= -DTARGET_ARM_EABI
.endif .endif
.if ${MACHINE_CPUARCH} == "powerpc"
TGTOBJS= crtsavres.o
SRCS+= crtsavres.asm
.endif
.if ${MACHINE_CPUARCH} == "sparc64" .if ${MACHINE_CPUARCH} == "sparc64"
TGTOBJS= crtfastmath.o TGTOBJS= crtfastmath.o
SRCS+= crtfastmath.c SRCS+= crtfastmath.c

View File

@ -2,7 +2,7 @@
.PATH: ${.CURDIR:H}/common .PATH: ${.CURDIR:H}/common
SRCS= crt1.c crti.S crtn.S SRCS= crt1.c crti.S crtn.S crtsavres.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g} OBJS= ${SRCS:N*.h:R:S/$/.o/g}
OBJS+= Scrt1.o gcrt1.o OBJS+= Scrt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \ CFLAGS+= -I${.CURDIR:H}/common \

191
lib/csu/powerpc/crtsavres.S Normal file
View File

@ -0,0 +1,191 @@
/*-
* SPDX-License-Identifier: BSD-1-Clause
*
* Copyright 2019 Justin Hibbits
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
.text
/*
* The PowerPC ABI spec requires the following save/restore functions to be
* provided:
*
* _savefpr_N
* _restfpr_N
* _restfpr_N_x
* _savegpr_N
* _restgpr_N
* _restgpr_N_x
*
* With N ranging from 14 to 31, to save the nonvolatile registers.
*/
#define _CRTENTRY(name) \
.text; \
.globl name; \
.type name,@function; \
name:
#define SAVEFPR(r) _CRTENTRY(__CONCAT(_savefpr_,r)) \
stfd r,(-256 + r * 8)(11)
SAVEFPR(14)
SAVEFPR(15)
SAVEFPR(16)
SAVEFPR(17)
SAVEFPR(18)
SAVEFPR(19)
SAVEFPR(20)
SAVEFPR(21)
SAVEFPR(22)
SAVEFPR(23)
SAVEFPR(24)
SAVEFPR(25)
SAVEFPR(26)
SAVEFPR(27)
SAVEFPR(28)
SAVEFPR(29)
SAVEFPR(30)
SAVEFPR(31)
blr
#define RESTFPR(r) _CRTENTRY(__CONCAT(_restfpr_,r)) \
lfd r,(-256 + r * 8)(11)
RESTFPR(14)
RESTFPR(15)
RESTFPR(16)
RESTFPR(17)
RESTFPR(18)
RESTFPR(19)
RESTFPR(20)
RESTFPR(21)
RESTFPR(22)
RESTFPR(23)
RESTFPR(24)
RESTFPR(25)
RESTFPR(26)
RESTFPR(27)
RESTFPR(28)
RESTFPR(29)
RESTFPR(30)
RESTFPR(31)
blr
#define SAVEGPR(r) _CRTENTRY(__CONCAT(_savegpr_,r)) \
stfd r,(-128 + r*4)(11)
SAVEGPR(14)
SAVEGPR(15)
SAVEGPR(16)
SAVEGPR(17)
SAVEGPR(18)
SAVEGPR(19)
SAVEGPR(20)
SAVEGPR(21)
SAVEGPR(22)
SAVEGPR(23)
SAVEGPR(24)
SAVEGPR(25)
SAVEGPR(26)
SAVEGPR(27)
SAVEGPR(28)
SAVEGPR(29)
SAVEGPR(30)
SAVEGPR(31)
blr
#define RESTGPR(r) _CRTENTRY(__CONCAT(_restgpr_,r)) \
lwz r,(-128 + r*4)(11)
RESTGPR(14)
RESTGPR(15)
RESTGPR(16)
RESTGPR(17)
RESTGPR(18)
RESTGPR(19)
RESTGPR(20)
RESTGPR(21)
RESTGPR(22)
RESTGPR(23)
RESTGPR(24)
RESTGPR(25)
RESTGPR(26)
RESTGPR(27)
RESTGPR(28)
RESTGPR(29)
RESTGPR(30)
RESTGPR(31)
blr
#define RESTFPR_X(r) _CRTENTRY(__CONCAT(__CONCAT(_restfpr_,r),_x)) \
lfd r,(-256 + r * 8)(11)
RESTFPR_X(14)
RESTFPR_X(15)
RESTFPR_X(16)
RESTFPR_X(17)
RESTFPR_X(18)
RESTFPR_X(19)
RESTFPR_X(20)
RESTFPR_X(21)
RESTFPR_X(22)
RESTFPR_X(23)
RESTFPR_X(24)
RESTFPR_X(25)
RESTFPR_X(26)
RESTFPR_X(27)
RESTFPR_X(28)
RESTFPR_X(29)
RESTFPR_X(30)
RESTFPR_X(31)
lwz 0,4(11)
mtlr 0
mr 1,11
blr
#define RESTGPR_X(r) _CRTENTRY(__CONCAT(__CONCAT(_restgpr_,r),_x)) \
lwz r,(-128 + r*4)(11)
RESTGPR_X(14)
RESTGPR_X(15)
RESTGPR_X(16)
RESTGPR_X(17)
RESTGPR_X(18)
RESTGPR_X(19)
RESTGPR_X(20)
RESTGPR_X(21)
RESTGPR_X(22)
RESTGPR_X(23)
RESTGPR_X(24)
RESTGPR_X(25)
RESTGPR_X(26)
RESTGPR_X(27)
RESTGPR_X(28)
RESTGPR_X(29)
RESTGPR_X(30)
RESTGPR_X(31)
lwz 0,4(11)
mtlr 0
mr 1,11
blr

View File

@ -4,7 +4,7 @@
SRCS= crt1.c crti.S crtn.S SRCS= crt1.c crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g} OBJS= ${SRCS:N*.h:R:S/$/.o/g}
OBJS+= Scrt1.o gcrt1.o OBJS+= crtsavres.o Scrt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \ CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include \ -I${SRCTOP}/lib/libc/include \
-mlongcall -DCRT_IRELOC_SUPPRESS -mlongcall -DCRT_IRELOC_SUPPRESS
@ -18,7 +18,7 @@ FILESDIR= ${LIBDIR}
.undef LIBRARIES_ONLY .undef LIBRARIES_ONLY
CLEANFILES= ${OBJS} CLEANFILES= ${OBJS}
CLEANFILES+= crt1.s gcrt1.s Scrt1.s CLEANFILES+= crt1.s crtsavres.s gcrt1.s Scrt1.s
# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not # See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
# directly compiled to .o files. # directly compiled to .o files.
@ -27,6 +27,10 @@ crt1.s: crt1.c
${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
sed ${SED_FIX_NOTE} ${.TARGET} sed ${SED_FIX_NOTE} ${.TARGET}
# On powerpc64 crtsavres is an empty file
crtsavres.s:
touch ${.TARGET}
crt1.o: crt1.s crt1.o: crt1.s
${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s