svn commit: branches/uClibc-nptl: libc/stdlib libc/string/i386 libc/sysde etc...

carmelo at uclibc.org carmelo at uclibc.org
Thu Dec 11 15:02:23 UTC 2008


Author: carmelo
Date: 2008-12-11 07:02:23 -0800 (Thu, 11 Dec 2008)
New Revision: 24384

Log:
Synch with trunk @ 24379
Step 24: miscellaneous merge from trunk.


Added:
   branches/uClibc-nptl/libc/sysdeps/linux/common/brk.c

Modified:
   branches/uClibc-nptl/Makefile.help
   branches/uClibc-nptl/Makefile.in
   branches/uClibc-nptl/Rules.mak
   branches/uClibc-nptl/libc/stdlib/setenv.c
   branches/uClibc-nptl/libc/string/i386/memcpy.c


Changeset:
Modified: branches/uClibc-nptl/Makefile.help
===================================================================
--- branches/uClibc-nptl/Makefile.help	2008-12-11 15:01:15 UTC (rev 24383)
+++ branches/uClibc-nptl/Makefile.help	2008-12-11 15:02:23 UTC (rev 24384)
@@ -14,6 +14,9 @@
 	@echo 'Build:'
 	@echo '  all			- libraries and generated headers'
 	@echo '  pregen		- generate headers'
+	@echo '  utils			- build target utilities'
+	@echo '			  (readelf, ldd, ldconfig, locale, iconv)'
+	@echo '  hostutils		- build host utilities (see utils)'
 	@echo
 	@echo 'Configuration:'
 	@echo '  allnoconfig		- disable all symbols in .config'
@@ -30,6 +33,8 @@
 	@echo '  install_runtime	- install the libraries'
 	@echo '  install_dev		- install all headers and static libs'
 	@echo '  install_headers	- install headers excluding generated ones'
+	@echo '  install_utils		- install target utilities'
+	@echo '  install_hostutils	- install host utilities'
 	@echo
 	@echo 'Development:'
 	@echo '  check			- run testsuite'
@@ -37,9 +42,18 @@
 	@echo '  release		- create a distribution tarball'
 	@echo
 	@echo 'Environment variables:'
-	@echo '     			- Quiet build'
+	@echo '  V="" 			- Quiet build (default)'
 	@echo '  V=1			- Verbose build'
 	@echo '  V=2			- Very verbose build'
 	@echo '  CROSS=		- Override CROSS_COMPILER_PREFIX from .config'
 	@echo '  SHELL=		- Shell to use for make'
 	@echo '  CONFIG_SHELL=		- Shell to use for menuconfig'
+	@echo
+	@echo '  PREFIX=		- Prepended prefix'
+	@echo '  RUNTIME_PREFIX=	- Prefix for the libdir containing shared objects'
+	@echo '			  (usually "/")'
+	@echo '  DEVEL_PREFIX=		- Prefix for the libdir containing static objects'
+	@echo '			  and the include dir (usually "/usr")'
+	@echo '  SHARED_LIB_LOADER_PREFIX=	- Directory where the shared loader resides.'
+	@echo '			  (usually "/lib")'
+

Modified: branches/uClibc-nptl/Makefile.in
===================================================================
--- branches/uClibc-nptl/Makefile.in	2008-12-11 15:01:15 UTC (rev 24383)
+++ branches/uClibc-nptl/Makefile.in	2008-12-11 15:02:23 UTC (rev 24384)
@@ -466,6 +466,9 @@
 install_utils: utils
 	$(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C utils utils_install
 
+install_hostutils: hostutils
+	$(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C utils utils_install DOTHOST=.host
+
 endif # ifeq ($(HAVE_DOT_CONFIG),y)
 
 include/bits include/config:

Modified: branches/uClibc-nptl/Rules.mak
===================================================================
--- branches/uClibc-nptl/Rules.mak	2008-12-11 15:01:15 UTC (rev 24383)
+++ branches/uClibc-nptl/Rules.mak	2008-12-11 15:02:23 UTC (rev 24384)
@@ -528,7 +528,6 @@
 
 LDFLAGS:=$(LDFLAGS_NOSTRIP) -Wl,-z,defs
 ifeq ($(DODEBUG),y)
-#CFLAGS += -g3
 CFLAGS += -O0 -g3 -DDEBUG
 else
 CFLAGS += $(OPTIMIZATION) $(XARCH_CFLAGS) -DNDEBUG

Modified: branches/uClibc-nptl/libc/stdlib/setenv.c
===================================================================
--- branches/uClibc-nptl/libc/stdlib/setenv.c	2008-12-11 15:01:15 UTC (rev 24383)
+++ branches/uClibc-nptl/libc/stdlib/setenv.c	2008-12-11 15:02:23 UTC (rev 24384)
@@ -46,116 +46,109 @@
    is then placed in the environment, while the argument of `putenv'
    must be used directly.  This is all complicated by the fact that we try
    to reuse values once generated for a `setenv' call since we can never
-   free the strings.  */
-int __add_to_environ (const char *name, const char *value,
-	const char *combined, int replace) attribute_hidden;
-int __add_to_environ (const char *name, const char *value,
-					  const char *combined, int replace)
+   free the strings. [in uclibc, we do not]  */
+static int __add_to_environ(const char *name, const char *value,
+ 		int replace)
 {
-    register char **ep;
-    register size_t size;
-    const size_t namelen = strlen (name);
-    const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
-    int rv = -1;
+	register char **ep;
+	register size_t size;
+	char *var_val;
+	char **new_environ;
+	/* name may come from putenv() and thus may contain "=VAL" part */
+	const size_t namelen = strchrnul(name, '=') - name;
+	int rv = -1;
 
-    __UCLIBC_MUTEX_LOCK(mylock);
+	__UCLIBC_MUTEX_LOCK(mylock);
 
-    /* We have to get the pointer now that we have the lock and not earlier
-       since another thread might have created a new environment.  */
-    ep = __environ;
+	/* We have to get the pointer now that we have the lock and not earlier
+	   since another thread might have created a new environment.  */
+	ep = __environ;
 
-    size = 0;
-    if (ep != NULL) {
-		for (; *ep != NULL; ++ep) {
-			if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
-				break;
-			else
-				++size;
+	size = 0;
+	if (ep != NULL) {
+		while (*ep != NULL) {
+			if (!strncmp(*ep, name, namelen) && (*ep)[namelen] == '=') {
+				/* Found */
+				if (!replace)
+					goto DONE_OK;
+				goto REPLACE;
+			}
+			++size;
+			++ep;
 		}
-    }
+	}
 
-    if (ep == NULL || *ep == NULL) {
-		char **new_environ;
+	/* Not found, add at the end */
 
-		/* We allocated this space; we can extend it.  */
-		new_environ = (char **) realloc (last_environ, (size + 2) * sizeof (char *));
-		if (new_environ == NULL) {
-			goto DONE;
-		}
+	/* We allocated this space; we can extend it.  */
+	new_environ = realloc(last_environ, (size + 2) * sizeof(char *));
+	if (new_environ == NULL) {
+		__set_errno(ENOMEM);
+		goto DONE;
+	}
+	if (__environ != last_environ) {
+		memcpy(new_environ, __environ, size * sizeof(char *));
+	}
+	last_environ = __environ = new_environ;
 
-		/* If the whole entry is given add it.  */
-		if (combined != NULL) {
-			/* We must not add the string to the search tree since it belongs
-			   to the user.  */
-			new_environ[size] = (char *) combined;
-		} else {
-			/* See whether the value is already known.  */
-			new_environ[size] = (char *) malloc (namelen + 1 + vallen);
-			if (new_environ[size] == NULL) {
-				__set_errno (ENOMEM);
-				goto DONE;
-			}
+	ep = &new_environ[size];
+	/* Ensure env is NULL terminated in case malloc below fails */
+	ep[0] = NULL;
+	ep[1] = NULL;
 
-			memcpy (new_environ[size], name, namelen);
-			new_environ[size][namelen] = '=';
-			memcpy (&new_environ[size][namelen + 1], value, vallen);
-		}
+ REPLACE:
+	var_val = (char*) name;
+	/* Build VAR=VAL if we called by setenv, not putenv.  */
+	if (value != NULL) {
+		const size_t vallen = strlen(value) + 1;
 
-		if (__environ != last_environ) {
-			memcpy ((char *) new_environ, (char *) __environ,
-					size * sizeof (char *));
+		var_val = malloc(namelen + 1 + vallen);
+		if (var_val == NULL) {
+			__set_errno(ENOMEM);
+			goto DONE;
 		}
+		memcpy(var_val, name, namelen);
+		var_val[namelen] = '=';
+		memcpy(&var_val[namelen + 1], value, vallen);
+	}
+	*ep = var_val;
 
-		new_environ[size + 1] = NULL;
-		last_environ = __environ = new_environ;
-    } else if (replace) {
-		char *np;
+ DONE_OK:
+	rv = 0;
 
-		/* Use the user string if given.  */
-		if (combined != NULL) {
-			np = (char *) combined;
-		} else {
-			np = malloc (namelen + 1 + vallen);
-			if (np == NULL) {
-				goto DONE;
-			}
-			memcpy (np, name, namelen);
-			np[namelen] = '=';
-			memcpy (&np[namelen + 1], value, vallen);
-		}
-		*ep = np;
-    }
-
-    rv = 0;
-
  DONE:
-    __UCLIBC_MUTEX_UNLOCK(mylock);
-    return rv;
+	__UCLIBC_MUTEX_UNLOCK(mylock);
+	return rv;
 }
 
 /* libc_hidden_proto(setenv) */
-int setenv (const char *name, const char *value, int replace)
+int setenv(const char *name, const char *value, int replace)
 {
-    return __add_to_environ (name, value, NULL, replace);
+	/* NB: setenv("VAR", NULL, 1) inserts "VAR=" string */
+	return __add_to_environ(name, value ? value : "", replace);
 }
 libc_hidden_def(setenv)
 
 /* libc_hidden_proto(unsetenv) */
-int unsetenv (const char *name)
+int unsetenv(const char *name)
 {
-    size_t len;
-    char **ep;
+	const char *eq;
+	size_t len;
+	char **ep;
 
-    if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) {
-		__set_errno (EINVAL);
+	if (name == NULL || *name == '\0'
+	 || *(eq = strchrnul(name, '=')) == '='
+	) {
+		__set_errno(EINVAL);
 		return -1;
-    }
+	}
+	len = eq - name; /* avoiding strlen this way */
 
-    len = strlen (name);
-    __UCLIBC_MUTEX_LOCK(mylock);
-    ep = __environ;
-    while (*ep != NULL) {
-		if (!strncmp (*ep, name, len) && (*ep)[len] == '=') {
+	__UCLIBC_MUTEX_LOCK(mylock);
+	ep = __environ;
+	/* NB: clearenv(); unsetenv("foo"); should not segfault */
+	if (ep)	while (*ep != NULL) {
+		if (!strncmp(*ep, name, len) && (*ep)[len] == '=') {
 			/* Found it.  Remove this pointer by moving later ones back.  */
 			char **dp = ep;
 			do {
@@ -165,42 +158,34 @@
 		} else {
 			++ep;
 		}
-    }
-    __UCLIBC_MUTEX_UNLOCK(mylock);
-    return 0;
+	}
+	__UCLIBC_MUTEX_UNLOCK(mylock);
+	return 0;
 }
 libc_hidden_def(unsetenv)
 
 /* The `clearenv' was planned to be added to POSIX.1 but probably
    never made it.  Nevertheless the POSIX.9 standard (POSIX bindings
    for Fortran 77) requires this function.  */
-int clearenv (void)
+int clearenv(void)
 {
-    __UCLIBC_MUTEX_LOCK(mylock);
-    if (__environ == last_environ && __environ != NULL) {
-		/* We allocated this environment so we can free it.  */
-		free (__environ);
-		last_environ = NULL;
-    }
-    /* Clear the environment pointer removes the whole environment.  */
-    __environ = NULL;
-    __UCLIBC_MUTEX_UNLOCK(mylock);
-    return 0;
+	__UCLIBC_MUTEX_LOCK(mylock);
+	/* If we allocated this environment we can free it.
+	 * If we did not allocate this environment, it's NULL already
+	 * and is safe to free().  */
+	free(last_environ);
+	last_environ = NULL;
+	/* Clearing environ removes the whole environment.  */
+	__environ = NULL;
+	__UCLIBC_MUTEX_UNLOCK(mylock);
+	return 0;
 }
 
 /* Put STRING, which is of the form "NAME=VALUE", in the environment.  */
-int putenv (char *string)
+int putenv(char *string)
 {
-    int result;
-    const char *const name_end = strchr (string, '=');
-
-    if (name_end != NULL) {
-		char *name = strndup(string, name_end - string);
-		result = __add_to_environ (name, NULL, string, 1);
-		free(name);
-		return(result);
-    }
-    unsetenv (string);
-    return 0;
+	if (strchr(string, '=') != NULL) {
+		return __add_to_environ(string, NULL, 1);
+	}
+	return unsetenv(string);
 }
-

Modified: branches/uClibc-nptl/libc/string/i386/memcpy.c
===================================================================
--- branches/uClibc-nptl/libc/string/i386/memcpy.c	2008-12-11 15:01:15 UTC (rev 24383)
+++ branches/uClibc-nptl/libc/string/i386/memcpy.c	2008-12-11 15:02:23 UTC (rev 24384)
@@ -35,19 +35,20 @@
 /* Experimentally off - libc_hidden_proto(memcpy) */
 void *memcpy(void * to, const void * from, size_t n)
 {
-    int d0, d1, d2;
-    __asm__ __volatile__(
-	    "rep ; movsl\n\t"
-	    "testb $2,%b4\n\t"
-	    "je 1f\n\t"
-	    "movsw\n"
-	    "1:\ttestb $1,%b4\n\t"
-	    "je 2f\n\t"
-	    "movsb\n"
-	    "2:"
-	    : "=&c" (d0), "=&D" (d1), "=&S" (d2)
-	    :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
-	    : "memory");
-    return (to);
+	int d0, d1, d2;
+	__asm__ __volatile__(
+		"	rep; movsl\n"
+		"	movl %4,%%ecx\n"
+		"	andl $3,%%ecx\n"
+		/* jz is optional. avoids "rep; movsb" with ecx == 0,
+		 * but adds a branch, which is currently (2008) faster */
+		"	jz 1f\n"
+		"	rep; movsb\n"
+		"1:\n"
+		: "=&c" (d0), "=&D" (d1), "=&S" (d2)
+		: "0" (n / 4), "g" (n), "1" ((long)to), "2" ((long)from)
+		: "memory"
+	);
+	return to;
 }
 libc_hidden_def(memcpy)

Added: branches/uClibc-nptl/libc/sysdeps/linux/common/brk.c
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/common/brk.c	                        (rev 0)
+++ branches/uClibc-nptl/libc/sysdeps/linux/common/brk.c	2008-12-11 15:02:23 UTC (rev 24384)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+libc_hidden_proto(brk)
+
+#define __NR___syscall_brk __NR_brk
+static inline _syscall1(void *, __syscall_brk, void *, end)
+
+/* This must be initialized data because commons can't have aliases.  */
+void * __curbrk attribute_hidden = 0;
+
+int brk(void *addr)
+{
+	void *newbrk = __syscall_brk(addr);
+
+	__curbrk = newbrk;
+
+	if (newbrk < addr) {
+		__set_errno (ENOMEM);
+		return -1;
+	}
+
+	return 0;
+}
+libc_hidden_def(brk)




More information about the uClibc-cvs mailing list