This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: supplying _foo_r functions when -DREENTRANT_SYSCALLS_PROVIDED


On Thu, Mar 20, 2008 at 03:39:08PM -0700, Patrick Mansfield wrote:

> I am trying to build SPU with -DSIGNAL_PROVIDED, -DREENTRANT_SYSCALLS_PROVIDED,
> and -DMISSING_SYSCALL_NAMES, since the SPU doesn't need reentrant calls
> (no threading, no signals), and setting these defines can save some space
> and time.
> 
> But with those defines, I end up with these undefined functions:
> 
> 	_gettimeofday_r - in time.c
> 	_sbrk_r - mallocr.c
> 	_times_r - in clock.c
> 	_write_r - in __dprintf.c (don't know if this is an issue)
> 
> How should I fix these? Supply SPU specific defines for them? 
> 
> Or have generic defines for these if REENTRANT_SYSCALLS_PROVIDED is defined?
> 
> i.e. defines like:
> 
> #define _sbrk_r(ptr, incr)	sbrk(incr)

Here's RFC patch, it shows the reent.h with changes per above.

Where should these defines go? 

Is this the right way to make this change?

This does reduce SPU code size some, but only for newlib code using the
_fff_r functions. Like malloc - programs using it were by 992 bytes
smaller. Code reductions for it are mainly because malloc needs _sbrk_r,
_sbrk_r wants an int errno, int errno is supplied in reent.o. Building
with _sbrk_r defined to sbrk means we always use the struct reent _errno
value (at least for SPU), and don't pull in the (now empty) reent.o.

I couldn't find any existing defines (without modifying the build) to
prevent use of these defines when reent.h is included from user space code.

Anway: patch gets rid of undefined _fff_r functions when SPU is built with
SIGNAL_PROVIDED, REENTRANT_SYSCALLS_PROVIDED and MISSING_SYSCALL_NAMES
defined.

Also gets rid of signal code on SPU, so for SPU we have to supply our own
assert, and don't supply a raise() function.

2008-03-24 Patrick Mansfield <patmans@us.ibm.com>
	* configure.host: Change SPU to build with -DSIGNAL_PROVIDED,
	  -DREENTRANT_SYSCALLS_PROVIDED, and -DMISSING_SYSCALL_NAMES.
	* libc/include/reent.h: Define some _fff_r functions to call fff,
	  so we do not have undefined _fff_r functions (at least for SPU).
	* libc/machine/spu/Makefile.am: Add assert.c and raise.c.
	* libc/machine/spu/Makefile.in: Regenerated.
	* libc/machine/spu/assert.c: New file, implement assert() 
	  without the use of signals.
	* libc/machine/spu/raise.c: New file, we override the
	  default raise.c, and do not supply a raise().

Index: quilt/newlib/libc/include/reent.h
===================================================================
--- quilt.orig/newlib/libc/include/reent.h
+++ quilt/newlib/libc/include/reent.h
@@ -59,6 +59,27 @@ struct tms;
 struct timeval;
 struct timezone;
 
+#ifdef _REENT_ONLY
+#ifndef REENTRANT_SYSCALLS_PROVIDED
+#define REENTRANT_SYSCALLS_PROVIDED
+#endif
+#endif
+
+#ifdef REENTRANT_SYSCALLS_PROVIDED
+
+/*
+ * These functions are called internally by newlib, even if
+ * REENTRANT_SYSCALLS_PROVIDED is defined.
+ *
+ * XXX Neither _COMPILING_NEWLIB nor INTERNAL_NEWLIB can be used here
+ * without other changes - we don't want user code to see these.
+ */
+#define _gettimeofday_r(reent, t, z)	gettimeofday(t, z)
+#define _sbrk_r(ptr, incr)		sbrk(incr)
+#define _times_r(ptr, ptms)		times(ptms)
+#define _write_r(ptr, fd, buf, cnt)	write(fd, buf, cnt)
+
+#else
 /* Reentrant versions of system calls.  */
 
 extern int _close_r _PARAMS ((struct _reent *, int));
@@ -96,6 +117,8 @@ extern int _fstat64_r _PARAMS ((struct _
 extern int _open64_r _PARAMS ((struct _reent *, const char *, int, int));
 #endif
 
+#endif
+
 #ifdef __cplusplus
 }
 #endif
Index: quilt/newlib/configure.host
===================================================================
--- quilt.orig/newlib/configure.host
+++ quilt/newlib/configure.host
@@ -268,7 +268,7 @@ case "${host_cpu}" in
 	stdio_dir=
 	libm_machine_dir=spu
 	machine_dir=spu
-	newlib_cflags="${newlib_cflags} -D_POSIX_MODE -ffunction-sections -fdata-sections "
+	newlib_cflags="${newlib_cflags} -D_POSIX_MODE -DSIGNAL_PROVIDED -DREENTRANT_SYSCALLS_PROVIDED -DMISSING_SYSCALL_NAMES -ffunction-sections -fdata-sections "
 	;;
   *)
 	echo '***' "Newlib does not support CPU ${host_cpu}" 1>&2
Index: quilt/newlib/libc/machine/spu/assert.c
===================================================================
--- /dev/null
+++ quilt/newlib/libc/machine/spu/assert.c
@@ -0,0 +1,35 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* func can be NULL, in which case no function information is given.  */
+void
+_DEFUN (__assert_func, (file, line, func, failedexpr),
+	const char *file _AND
+	int line _AND
+	const char *func _AND
+	const char *failedexpr)
+{
+  fiprintf(stderr,
+	   "assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
+	   failedexpr, file, line,
+	   func ? ", function: " : "", func ? func : "");
+  /*
+   * On the SPU, we do not have signaling. Previously, standard newlib
+   * abort code was used. That eventually leads to a kill(SIGABRT), and
+   * for SPU too an exit(SIGABRT). SIGABRT was 6, so just use that value
+   * here.
+   */
+  exit(6);
+  /* NOTREACHED */
+}
+
+void
+_DEFUN (__assert, (file, line, failedexpr),
+	const char *file _AND
+	int line _AND
+	const char *failedexpr)
+{
+   __assert_func (file, line, NULL, failedexpr);
+  /* NOTREACHED */
+}
Index: quilt/newlib/libc/machine/spu/Makefile.in
===================================================================
--- quilt.orig/newlib/libc/machine/spu/Makefile.in
+++ quilt/newlib/libc/machine/spu/Makefile.in
@@ -73,6 +73,7 @@ DIST_COMMON = $(srcdir)/../../../../conf
 	$(srcdir)/../../../../compile $(srcdir)/../../../../compile \
 	$(srcdir)/../../../../compile $(srcdir)/../../../../compile \
 	$(srcdir)/../../../../compile $(srcdir)/../../../../compile \
+	$(srcdir)/../../../../compile $(srcdir)/../../../../compile \
 	$(srcdir)/../../../../compile
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -88,25 +89,26 @@ LIBRARIES = $(noinst_LIBRARIES)
 ARFLAGS = cru
 lib_a_AR = $(AR) $(ARFLAGS)
 lib_a_LIBADD =
-am_lib_a_OBJECTS = lib_a-setjmp.$(OBJEXT) lib_a-clearerr.$(OBJEXT) \
-	lib_a-creat.$(OBJEXT) lib_a-fclose.$(OBJEXT) \
-	lib_a-feof.$(OBJEXT) lib_a-ferror.$(OBJEXT) \
-	lib_a-fflush.$(OBJEXT) lib_a-fgetc.$(OBJEXT) \
-	lib_a-fgetpos.$(OBJEXT) lib_a-fgets.$(OBJEXT) \
-	lib_a-fileno.$(OBJEXT) lib_a-fiprintf.$(OBJEXT) \
-	lib_a-fiscanf.$(OBJEXT) lib_a-fopen.$(OBJEXT) \
-	lib_a-fprintf.$(OBJEXT) lib_a-fputc.$(OBJEXT) \
-	lib_a-fputs.$(OBJEXT) lib_a-fread.$(OBJEXT) \
-	lib_a-freopen.$(OBJEXT) lib_a-fscanf.$(OBJEXT) \
-	lib_a-fseek.$(OBJEXT) lib_a-fsetpos.$(OBJEXT) \
-	lib_a-ftell.$(OBJEXT) lib_a-fwrite.$(OBJEXT) \
-	lib_a-getc.$(OBJEXT) lib_a-getchar.$(OBJEXT) \
-	lib_a-gets.$(OBJEXT) lib_a-iprintf.$(OBJEXT) \
-	lib_a-iscanf.$(OBJEXT) lib_a-memcpy.$(OBJEXT) \
-	lib_a-memmove.$(OBJEXT) lib_a-memset.$(OBJEXT) \
-	lib_a-perror.$(OBJEXT) lib_a-printf.$(OBJEXT) \
-	lib_a-putc.$(OBJEXT) lib_a-putchar.$(OBJEXT) \
-	lib_a-puts.$(OBJEXT) lib_a-remove.$(OBJEXT) \
+am_lib_a_OBJECTS = lib_a-setjmp.$(OBJEXT) lib_a-assert.$(OBJEXT) \
+	lib_a-clearerr.$(OBJEXT) lib_a-creat.$(OBJEXT) \
+	lib_a-fclose.$(OBJEXT) lib_a-feof.$(OBJEXT) \
+	lib_a-ferror.$(OBJEXT) lib_a-fflush.$(OBJEXT) \
+	lib_a-fgetc.$(OBJEXT) lib_a-fgetpos.$(OBJEXT) \
+	lib_a-fgets.$(OBJEXT) lib_a-fileno.$(OBJEXT) \
+	lib_a-fiprintf.$(OBJEXT) lib_a-fiscanf.$(OBJEXT) \
+	lib_a-fopen.$(OBJEXT) lib_a-fprintf.$(OBJEXT) \
+	lib_a-fputc.$(OBJEXT) lib_a-fputs.$(OBJEXT) \
+	lib_a-fread.$(OBJEXT) lib_a-freopen.$(OBJEXT) \
+	lib_a-fscanf.$(OBJEXT) lib_a-fseek.$(OBJEXT) \
+	lib_a-fsetpos.$(OBJEXT) lib_a-ftell.$(OBJEXT) \
+	lib_a-fwrite.$(OBJEXT) lib_a-getc.$(OBJEXT) \
+	lib_a-getchar.$(OBJEXT) lib_a-gets.$(OBJEXT) \
+	lib_a-iprintf.$(OBJEXT) lib_a-iscanf.$(OBJEXT) \
+	lib_a-memcpy.$(OBJEXT) lib_a-memmove.$(OBJEXT) \
+	lib_a-memset.$(OBJEXT) lib_a-perror.$(OBJEXT) \
+	lib_a-printf.$(OBJEXT) lib_a-putc.$(OBJEXT) \
+	lib_a-putchar.$(OBJEXT) lib_a-puts.$(OBJEXT) \
+	lib_a-raise.$(OBJEXT) lib_a-remove.$(OBJEXT) \
 	lib_a-rename.$(OBJEXT) lib_a-rewind.$(OBJEXT) \
 	lib_a-scanf.$(OBJEXT) lib_a-setbuf.$(OBJEXT) \
 	lib_a-setvbuf.$(OBJEXT) lib_a-siprintf.$(OBJEXT) \
@@ -203,6 +205,11 @@ STRIP = @STRIP@
 USE_LIBTOOL_FALSE = @USE_LIBTOOL_FALSE@
 USE_LIBTOOL_TRUE = @USE_LIBTOOL_TRUE@
 VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_READELF = @ac_ct_READELF@
+ac_ct_STRIP = @ac_ct_STRIP@
 aext = @aext@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
@@ -218,23 +225,18 @@ build_cpu = @build_cpu@
 build_os = @build_os@
 build_vendor = @build_vendor@
 datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
 exec_prefix = @exec_prefix@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
 host_os = @host_os@
 host_vendor = @host_vendor@
-htmldir = @htmldir@
 includedir = @includedir@
 infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libm_machine_dir = @libm_machine_dir@
-localedir = @localedir@
 localstatedir = @localstatedir@
 lpfx = @lpfx@
 machine_dir = @machine_dir@
@@ -243,10 +245,8 @@ mkdir_p = @mkdir_p@
 newlib_basedir = @newlib_basedir@
 oext = @oext@
 oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
-psdir = @psdir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sys_dir = @sys_dir@
@@ -256,19 +256,20 @@ AUTOMAKE_OPTIONS = cygnus
 INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
 noinst_LIBRARIES = lib.a
 AM_CCASFLAGS = $(INCLUDES)
-lib_a_SOURCES = setjmp.S clearerr.c creat.c fclose.c feof.c ferror.c fflush.c \
-	fgetc.c fgetpos.c fgets.c fileno.c fiprintf.S fiscanf.S fopen.c \
-	fprintf.S fputc.c fputs.c fread.c freopen.c fscanf.S fseek.c \
-	fsetpos.c ftell.c fwrite.c getc.c getchar.c gets.c iprintf.S \
-	iscanf.S memcpy.c memmove.c memset.c perror.c printf.S \
-	putc.c putchar.c puts.c remove.c rename.c rewind.c scanf.S \
-	setbuf.c setvbuf.c siprintf.S siscanf.S sleep.c sniprintf.S \
-	snprintf.S sprintf.S sscanf.S stdio.c strcat.c strchr.c strcmp.c \
-	strcpy.c strcspn.c strlen.c strncat.c strncmp.c strncpy.c strpbrk.c \
-	strrchr.c strspn.c strxfrm.c tmpfile.c tmpnam.c ungetc.c usleep.c \
-	vfiprintf.c vfiscanf.c vfprintf.c vfscanf.c viprintf.c viscanf.c \
-	vprintf.c vscanf.c vsiprintf.c vsiscanf.c vsniprintf.c vsnprintf.c \
-	vsprintf.c vsscanf.c stack_reg_va.S
+lib_a_SOURCES = setjmp.S assert.c clearerr.c creat.c fclose.c feof.c \
+	ferror.c fflush.c fgetc.c fgetpos.c fgets.c fileno.c fiprintf.S \
+	fiscanf.S fopen.c fprintf.S fputc.c fputs.c fread.c freopen.c \
+	fscanf.S fseek.c fsetpos.c ftell.c fwrite.c getc.c getchar.c \
+	gets.c iprintf.S iscanf.S memcpy.c memmove.c memset.c perror.c \
+	printf.S putc.c putchar.c puts.c raise.c remove.c rename.c \
+	rewind.c scanf.S setbuf.c setvbuf.c siprintf.S siscanf.S sleep.c \
+	sniprintf.S snprintf.S sprintf.S sscanf.S stdio.c strcat.c \
+	strchr.c strcmp.c strcpy.c strcspn.c strlen.c strncat.c strncmp.c \
+	strncpy.c strpbrk.c strrchr.c strspn.c strxfrm.c tmpfile.c \
+	tmpnam.c ungetc.c usleep.c vfiprintf.c vfiscanf.c vfprintf.c \
+	vfscanf.c viprintf.c viscanf.c vprintf.c vscanf.c vsiprintf.c \
+	vsiscanf.c vsniprintf.c vsnprintf.c vsprintf.c vsscanf.c \
+	stack_reg_va.S
 
 lib_a_CCASFLAGS = $(AM_CCASFLAGS)
 lib_a_CFLAGS = $(AM_CFLAGS)
@@ -433,6 +434,12 @@ lib_a-stack_reg_va.obj: stack_reg_va.S
 .c.obj:
 	$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
+lib_a-assert.o: assert.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
+
+lib_a-assert.obj: assert.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
+
 lib_a-clearerr.o: clearerr.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-clearerr.o `test -f 'clearerr.c' || echo '$(srcdir)/'`clearerr.c
 
@@ -607,6 +614,12 @@ lib_a-puts.o: puts.c
 lib_a-puts.obj: puts.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-puts.obj `if test -f 'puts.c'; then $(CYGPATH_W) 'puts.c'; else $(CYGPATH_W) '$(srcdir)/puts.c'; fi`
 
+lib_a-raise.o: raise.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-raise.o `test -f 'raise.c' || echo '$(srcdir)/'`raise.c
+
+lib_a-raise.obj: raise.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-raise.obj `if test -f 'raise.c'; then $(CYGPATH_W) 'raise.c'; else $(CYGPATH_W) '$(srcdir)/raise.c'; fi`
+
 lib_a-remove.o: remove.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-remove.o `test -f 'remove.c' || echo '$(srcdir)/'`remove.c
 
Index: quilt/newlib/libc/machine/spu/Makefile.am
===================================================================
--- quilt.orig/newlib/libc/machine/spu/Makefile.am
+++ quilt/newlib/libc/machine/spu/Makefile.am
@@ -8,19 +8,20 @@ noinst_LIBRARIES = lib.a
 
 AM_CCASFLAGS = $(INCLUDES)
 
-lib_a_SOURCES = setjmp.S clearerr.c creat.c fclose.c feof.c ferror.c fflush.c \
-	fgetc.c fgetpos.c fgets.c fileno.c fiprintf.S fiscanf.S fopen.c \
-	fprintf.S fputc.c fputs.c fread.c freopen.c fscanf.S fseek.c \
-	fsetpos.c ftell.c fwrite.c getc.c getchar.c gets.c iprintf.S \
-	iscanf.S memcpy.c memmove.c memset.c perror.c printf.S \
-	putc.c putchar.c puts.c remove.c rename.c rewind.c scanf.S \
-	setbuf.c setvbuf.c siprintf.S siscanf.S sleep.c sniprintf.S \
-	snprintf.S sprintf.S sscanf.S stdio.c strcat.c strchr.c strcmp.c \
-	strcpy.c strcspn.c strlen.c strncat.c strncmp.c strncpy.c strpbrk.c \
-	strrchr.c strspn.c strxfrm.c tmpfile.c tmpnam.c ungetc.c usleep.c \
-	vfiprintf.c vfiscanf.c vfprintf.c vfscanf.c viprintf.c viscanf.c \
-	vprintf.c vscanf.c vsiprintf.c vsiscanf.c vsniprintf.c vsnprintf.c \
-	vsprintf.c vsscanf.c stack_reg_va.S
+lib_a_SOURCES = setjmp.S assert.c clearerr.c creat.c fclose.c feof.c \
+	ferror.c fflush.c fgetc.c fgetpos.c fgets.c fileno.c fiprintf.S \
+	fiscanf.S fopen.c fprintf.S fputc.c fputs.c fread.c freopen.c \
+	fscanf.S fseek.c fsetpos.c ftell.c fwrite.c getc.c getchar.c \
+	gets.c iprintf.S iscanf.S memcpy.c memmove.c memset.c perror.c \
+	printf.S putc.c putchar.c puts.c raise.c remove.c rename.c \
+	rewind.c scanf.S setbuf.c setvbuf.c siprintf.S siscanf.S sleep.c \
+	sniprintf.S snprintf.S sprintf.S sscanf.S stdio.c strcat.c \
+	strchr.c strcmp.c strcpy.c strcspn.c strlen.c strncat.c strncmp.c \
+	strncpy.c strpbrk.c strrchr.c strspn.c strxfrm.c tmpfile.c \
+	tmpnam.c ungetc.c usleep.c vfiprintf.c vfiscanf.c vfprintf.c \
+	vfscanf.c viprintf.c viscanf.c vprintf.c vscanf.c vsiprintf.c \
+	vsiscanf.c vsniprintf.c vsnprintf.c vsprintf.c vsscanf.c \
+	stack_reg_va.S
 
 lib_a_CCASFLAGS = $(AM_CCASFLAGS)
 lib_a_CFLAGS = $(AM_CFLAGS)
Index: quilt/newlib/libc/machine/spu/raise.c
===================================================================
--- /dev/null
+++ quilt/newlib/libc/machine/spu/raise.c
@@ -0,0 +1 @@
+/* Empty so we do not supply the default raise */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]