diff options
-rw-r--r-- | ChangeLog | 21 | ||||
-rw-r--r-- | configure.in | 8 | ||||
-rw-r--r-- | io/fts.c | 5 | ||||
-rw-r--r-- | sysdeps/generic/backtrace.c | 59 | ||||
-rw-r--r-- | sysdeps/generic/getenv.c | 2 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/w_exp10.c | 2 |
6 files changed, 86 insertions, 11 deletions
@@ -1,3 +1,24 @@ +1998-06-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/generic/getenv.c: Fix last change. + +1998-06-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/generic/backtrace.c: Provide generic implementation. + +1998-06-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * configure.in: Give visual feedback of the default directories we + added. + +1998-06-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * io/fts.c (fts_build): Define oflag only if needed. + +1998-06-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/libm-ieee754/w_exp10.c: Add missing close comment. + 1998-06-11 Ulrich Drepper <drepper@cygnus.com> * libc.map: Don't export argp's fmtstream handling functions. diff --git a/configure.in b/configure.in index 06c5496..5084d8e 100644 --- a/configure.in +++ b/configure.in @@ -429,14 +429,14 @@ changequote([,])dnl done # Add the default directories. +default_sysnames=sysdeps/generic if test "$elf" = yes; then - sysnames="$names sysdeps/generic/elf sysdeps/generic" -else - sysnames="$names sysdeps/generic" + default_sysnames="sysdeps/generic/elf $default_sysnames" fi +sysnames="$names $default_sysnames" AC_SUBST(sysnames) # The other names were emitted during the scan. -AC_MSG_RESULT(sysdeps/generic) +AC_MSG_RESULT($default_sysnames) ### Locate tools. @@ -578,8 +578,11 @@ fts_build(sp, type) FTSENT *cur, *tail; DIR *dirp; void *adjaddr; - int cderrno, descend, len, level, maxlen, nlinks, oflag, saved_errno; + int cderrno, descend, len, level, maxlen, nlinks, saved_errno; char *cp; +#ifdef DTF_HIDEW + int oflag; +#endif /* Set current node pointer. */ cur = sp->fts_cur; diff --git a/sysdeps/generic/backtrace.c b/sysdeps/generic/backtrace.c index 26bf9d4..7ac1d5f 100644 --- a/sysdeps/generic/backtrace.c +++ b/sysdeps/generic/backtrace.c @@ -1,4 +1,4 @@ -/* Return backtrace of current program state. +/* Return backtrace of current program state. Generic version. Copyright (C) 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -21,14 +21,63 @@ #include <execinfo.h> +/* This is a global variable set at program start time. It marks the + highest used stack address. */ +extern void *__libc_stack_end; + + +/* This implementation assumes a stack layout that matches the defaults + used by gcc's `__builtin_frame_address' and `__builtin_return_address' + (FP is the frame pointer register): + + +-----------------+ +-----------------+ + FP -> | previous FP --------> | previous FP ------>... + | | | | + | return address | | return address | + +-----------------+ +-----------------+ + + */ + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#ifndef CURRENT_STACK_FRAME +# define CURRENT_STACK_FRAME ({ char __csf; &__csf; }) +#endif + +struct layout +{ + struct layout *next; + void *return_address; +}; + int __backtrace (array, size) void **array; int size; { - /* We don't generally have the possibility to determine the stack - trace. Even gcc's `__builtin_return_address' feature cannot help - since it requires a constant argument. */ - return 0; + struct layout *current; + void *top_frame; + void *top_stack; + int cnt = 0; + + top_frame = __builtin_frame_address (0); + top_stack = CURRENT_STACK_FRAME; + + /* We skip the call to this function, it makes no sense to record it. */ + current = (struct layout *) top_frame; + while (cnt < size) + { + if ((void *) current < top_stack || (void *) current > __libc_stack_end) + /* This means the address is out of range. Note that for the + toplevel we see a frame pointer with value NULL which clearly is + out of range. */ + break; + + array[cnt++] = current->return_address; + + current = current->next; + } + + return cnt; } weak_alias (__backtrace, backtrace) diff --git a/sysdeps/generic/getenv.c b/sysdeps/generic/getenv.c index b6f405d..584b120 100644 --- a/sysdeps/generic/getenv.c +++ b/sysdeps/generic/getenv.c @@ -37,7 +37,7 @@ char * getenv (name) const char *name; { - const size_t len = strlen (name); + size_t len = strlen (name); char **ep; uint16_t name_start; diff --git a/sysdeps/libm-ieee754/w_exp10.c b/sysdeps/libm-ieee754/w_exp10.c index cb27159..bf0d361 100644 --- a/sysdeps/libm-ieee754/w_exp10.c +++ b/sysdeps/libm-ieee754/w_exp10.c @@ -1,5 +1,7 @@ /* @(#)w_exp10.c * Conversion to exp10 by Ulrich Drepper <drepper@cygnus.com>. + */ + /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |