diff options
author | Dimitar Dimitrov <dimitar@dinux.eu> | 2024-01-22 19:11:35 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2024-01-23 11:49:02 +0300 |
commit | d5c4edca81c87c784b4420cc194bea07436e0ab7 (patch) | |
tree | 39b3fdde00fb00e23665218f535ada215b7ced52 /libgloss/pru | |
parent | 02572ff089dcefed1e2e25f420be975f1ee7340c (diff) |
libgloss: merge pru into top-level Makefile
Avoid a recursive make to speed things up a bit. This change was
inspired by the recent similar patch for c6x:
https://sourceware.org/pipermail/newlib/2023/020869.html
While at it, fork crt0-minrt.S into a separate source file instead of
relying on a predefined macro to generate two different object files.
This improves clarity, simplifies the build rules, and would allow
further optimization in crt0-minrt.S to be implemented more cleanly.
Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
Diffstat (limited to 'libgloss/pru')
-rw-r--r-- | libgloss/pru/Makefile.in | 145 | ||||
-rw-r--r-- | libgloss/pru/Makefile.inc | 48 | ||||
-rw-r--r-- | libgloss/pru/crt0-minrt.S | 59 | ||||
-rw-r--r-- | libgloss/pru/crt0.S | 6 |
4 files changed, 107 insertions, 151 deletions
diff --git a/libgloss/pru/Makefile.in b/libgloss/pru/Makefile.in deleted file mode 100644 index fc5905a5e..000000000 --- a/libgloss/pru/Makefile.in +++ /dev/null @@ -1,145 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause-FreeBSD -# -# Copyright 2018-2019 Dimitar Dimitrov <dimitar@dinux.eu> -# All rights reserved. -# -# 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. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# 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. - -VPATH = @srcdir@ @srcdir@/.. - -srcdir = @srcdir@ -objdir = . -srcroot = $(srcdir)/../.. -objroot = $(objdir)/../.. - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -host_alias = @host_alias@ -target_alias = @target_alias@ - -bindir = @bindir@ -libdir = @libdir@ -includedir = @includedir@ -tooldir = $(exec_prefix)/$(target_alias) - -# Multilib support variables. -# TOP is used instead of MULTI{BUILD,SRC}TOP. -MULTIDIRS = -MULTISUBDIR = - -SHELL = /bin/sh - -mkinstalldirs = $(SHELL) $(srcroot)/mkinstalldirs - -CC = @CC@ - -AS = @AS@ - -AR = @AR@ - -LD = @LD@ - -RANLIB = @RANLIB@ - -OBJDUMP = `t='$(program_transform_name)'; echo objdump | sed -e $$t` -OBJCOPY = `t='$(program_transform_name)'; echo objcopy | sed -e $$t` - -# object files needed -OBJS = \ - do_global_dtors.o gettimeofday.o \ - isatty.o putnum.o raise.o \ - inbyte.o outbyte.o sbrk.o stat.o syscalls.o \ - do_global_dtors.o - -# Object files specific to particular targets. -EVALOBJS = ${OBJS} - -CRTOBJS = crt0.o crt0-minrt.o -OUTPUTS = libgloss.a $(CRTOBJS) - -INCLUDES = -I$(srcdir)/.. - -# Note that when building the library, ${MULTILIB} is not the way multilib -# options are passed; they're passed in $(CFLAGS). -CFLAGS_FOR_TARGET = ${MULTILIB} ${INCLUDES} -LDFLAGS_FOR_TARGET = ${MULTILIB} - -.c.o: - $(CC) $(CFLAGS_FOR_TARGET) -Os $(INCLUDES) -c $(CFLAGS) $< - -.C.o: - $(CC) $(CFLAGS_FOR_TARGET) -Os $(INCLUDES) -c $(CFLAGS) $< -.s.o: - $(AS) $(ASFLAGS_FOR_TARGET) $(ASFLAGS) -o $*.o $< - -# -# GCC knows to run the preprocessor on .S files before it assembles them. -# -.S.o: - $(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -c $< - -all: ${OUTPUTS} - -# -# here's where we build the library for each target -# - -libgloss.a: $(EVALOBJS) - ${AR} ${ARFLAGS} $@ $(EVALOBJS) - ${RANLIB} $@ - -# C Runtime Library startup code. -crt0.o: $(srcdir)/crt0.S - $(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) $< -c -o $@ - -crt0-minrt.o: $(srcdir)/crt0.S - $(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -DMINRT $< -c -o $@ - -doc: - -clean mostlyclean: - rm -f $(OUTPUTS) *.i *~ *.o *-test *.srec *.dis *.map *.x - -distclean maintainer-clean realclean: clean - rm -f Makefile $(OUTPUTS) - -.PHONY: install info install-info clean-info -install: $(OUTPUTS) - for outputs in ${OUTPUTS}; do\ - ${INSTALL_DATA} $${outputs} ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/$${outputs}; \ - done - for s in $(SCRIPTS); do \ - b=`basename $$s`; \ - ${INSTALL_DATA} $$s ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/$$b ;\ - done - ${mkinstalldirs} ${DESTDIR}${tooldir}/lib${MULTISUBDIR}/device-specs; \ - for s in ${srcdir}/device-specs/*; do \ - b=`basename $$s`; \ - $(INSTALL_DATA) $$s $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/device-specs/$$b ;\ - done - -info: -install-info: -clean-info: - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. && $(SHELL) config.status diff --git a/libgloss/pru/Makefile.inc b/libgloss/pru/Makefile.inc new file mode 100644 index 000000000..f8408b28f --- /dev/null +++ b/libgloss/pru/Makefile.inc @@ -0,0 +1,48 @@ +## SPDX-License-Identifier: BSD-2-Clause-FreeBSD +## +## Copyright 2018-2024 Dimitar Dimitrov <dimitar@dinux.eu> +## All rights reserved. +## +## 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. +## 2. Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## 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. + +multilibtool_DATA += \ + %D%/crt0.o \ + %D%/crt0-minrt.o + +libobjs_a_SOURCES += \ + %D%/crt0.S \ + %D%/crt0-minrt.S + +multilibtool_LIBRARIES += %D%/libgloss.a +%C%_libgloss_a_SOURCES = \ + %D%/do_global_dtors.c \ + %D%/gettimeofday.c \ + %D%/isatty.c \ + %D%/putnum.c \ + %D%/raise.c \ + %D%/inbyte.c \ + %D%/outbyte.c \ + %D%/sbrk.c \ + %D%/stat.c \ + %D%/syscalls.S + +pru_devicespecsdir = $(multilibtooldir)/device-specs +pru_devicespecs_DATA = %D%/device-specs/sim diff --git a/libgloss/pru/crt0-minrt.S b/libgloss/pru/crt0-minrt.S new file mode 100644 index 000000000..60647d372 --- /dev/null +++ b/libgloss/pru/crt0-minrt.S @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * crt0-minrt.S -- Minimal PRU startup code + * + * Copyright (c) 2024 Dimitar Dimitrov <dimitar@dinux.eu> + * All rights reserved. + * + * 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. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 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 "newlib.h" + + .extern main + + .text + .section .init0, "x" + .global _start +_start: + /* Initialize stack pointer. */ + ldi32 sp, _stack_top + + /* DATA and BSS are handled by the loader, so nothing to do here. */ + + /* Just in case main() tries to access argc, argv[] and envp. */ + zero r14, 3 * 4 + + /* Call main. */ + call main + + /* We should never reach here. */ +_crt_exit: + halt + jmp _crt_exit + + /* PRU obviously has no shared libraries, but dso_handle + helps to achieve better GCC test coverage. Besides, + it should be free with minrt. */ + .section .data + .global __dso_handle + .weak __dso_handle +__dso_handle: + .long 0 diff --git a/libgloss/pru/crt0.S b/libgloss/pru/crt0.S index b3f0d53a9..ad31cc9cc 100644 --- a/libgloss/pru/crt0.S +++ b/libgloss/pru/crt0.S @@ -39,7 +39,6 @@ _start: /* DATA and BSS are handled by the loader, so nothing to do here. */ -#if !defined(MINRT) .extern _do_global_dtors /* Ensure destructors get called. Call is per GNU ABI (i.e. 32-bit function pointers). But it is also compatible with the TI ABI @@ -60,27 +59,22 @@ ctors_loop: add r5, r5, 2 jmp ctors_loop ctors_done: -#endif /* Just in case main() tries to access argc, argv[] and envp. */ zero r14, 3 * 4 -#if !defined(MINRT) .weak __c_args__ ldi32 r5, __c_args__ qbeq __skip_c_args, r5, 0 lbbo r14, r5, 0, 4 /* argc */ add r15, r5, 4 /* argv */ __skip_c_args: -#endif /* Call main */ call main -#if !defined(MINRT) /* Call exit */ call exit -#endif /* We should never reach here. */ _crt_exit: |