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