Skip to content
This repository has been archived by the owner on Apr 7, 2019. It is now read-only.

Commit

Permalink
Create crtsavres.o for powerpc builds
Browse files Browse the repository at this point in the history
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
  • Loading branch information
chmeeedalf committed Jan 12, 2019
1 parent 32f8cf0 commit a551224
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 7 deletions.
4 changes: 0 additions & 4 deletions gnu/lib/csu/Makefile
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion lib/csu/powerpc/Makefile
Expand Up @@ -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 \
Expand Down
191 changes: 191 additions & 0 deletions lib/csu/powerpc/crtsavres.S
@@ -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
8 changes: 6 additions & 2 deletions lib/csu/powerpc64/Makefile
Expand Up @@ -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
Expand All @@ -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.
Expand All @@ -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


Expand Down

0 comments on commit a551224

Please sign in to comment.