[PATCH v4 1/2] libgloss: merge pru into top-level Makefile

Dimitar Dimitrov <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
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 <[email protected]>
---
Changes since v3:
 - Rebased.

Changes since v2:
 - Rearrange Makefile.inc code chunks.
 - Whitespace fix.

Changes since v1:
 - Retained copyright in pru/Makefile.inc.
 - Addec crt0*.s to libobjs_a_SOURCES.
 - Rebased.

 libgloss/Makefile.am      |   3 +
 libgloss/configure.ac     |   7 +-
 libgloss/pru/Makefile.in  | 145 --------------------------------------
 libgloss/pru/Makefile.inc |  48 +++++++++++++
 libgloss/pru/crt0-minrt.S |  59 ++++++++++++++++
 libgloss/pru/crt0.S       |   6 --
 6 files changed, 113 insertions(+), 155 deletions(-)
 delete mode 100644 libgloss/pru/Makefile.in
 create mode 100644 libgloss/pru/Makefile.inc
 create mode 100644 libgloss/pru/crt0-minrt.S

diff --git a/libgloss/Makefile.am b/libgloss/Makefile.am
index 333ff846a..084d433d3 100644
--- a/libgloss/Makefile.am
+++ b/libgloss/Makefile.am
@@ -155,6 +155,9 @@ endif
 if CONFIG_OR1K
 include or1k/Makefile.inc
 endif
+if CONFIG_PRU
+include pru/Makefile.inc
+endif
 if CONFIG_RISCV
 include riscv/Makefile.inc
 endif
diff --git a/libgloss/configure.ac b/libgloss/configure.ac
index 55f4261d1..79457cc79 100644
--- a/libgloss/configure.ac
+++ b/libgloss/configure.ac
@@ -207,8 +207,7 @@ case "${target}" in
 	config_or1k=true
 	;;
   pru-*-*)
-	AC_CONFIG_FILES([pru/Makefile])
-	subdirs="$subdirs pru"
+	config_pru=true
 	;;
   nios2-*-*)
 	config_nios2=true
@@ -222,8 +221,8 @@ m4_foreach_w([SUBDIR], [
   aarch64 arc arm bfin csky d30v epiphany fr30 frv ft32 i386 i960 iq2000
   libnosys lm32
   m32r mcore microblaze mn10200 mn10300 moxie msp430
-  nds32 nios2 or1k riscv rl78 rx sparc sparc_leon tic6x v850 visium wince
-  xstormy16 xtensa
+  nds32 nios2 or1k pru riscv rl78 rx sparc sparc_leon tic6x v850 visium
+  wince xstormy16 xtensa
 ], [dnl
   AM_CONDITIONAL([CONFIG_]m4_toupper(SUBDIR), [test x$config_]SUBDIR = xtrue)
 ])
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 <[email protected]>
-# 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 <[email protected]>
+## 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 <[email protected]>
+ * 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:
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.