1998-03-03 17:55  Ulrich Drepper  <drepper@cygnus.com>

	* elf/sprof.c: Cleanup a bit.

1998-03-03 08:01  H.J. Lu  <hjl@gnu.org>

	* sysdeps/generic/sysdep.h (L): New. Define.

	* sysdeps/unix/sysv/linux/i386/sysdep.h (L): New. Define.

	* sysdeps/i386/i586/addmul_1.S: Fix a typo.

	* sysdeps/unix/sysv/linux/i386/clone.S: Follow Intel's advice
	to have only one exit point for functions.
	* sysdeps/unix/sysv/linux/i386/mmap.S: Likewise.
	* sysdeps/unix/sysv/linux/i386/s_pread64.S: Likewise.
	* sysdeps/unix/sysv/linux/i386/s_pwrite64.S: Likewise.
	* sysdeps/unix/sysv/linux/i386/socket.S: Likewise.
	* sysdeps/unix/sysv/linux/i386/syscall.S: Likewise.

1998-03-03  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* sysdeps/unix/sysv/linux/sigaction.c (__sigaction): Safe and
	reset errno so that errno isn't set to ENOSYS in the first call.
	* sysdeps/unix/sysv/linux/i386/sigaction.c (__sigaction): Likewise.
	* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
	* sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): Likewise.
	* sysdeps/unix/sysv/linux/sigpending.c (sigpending): Likewise.
This commit is contained in:
Ulrich Drepper 1998-03-03 17:58:38 +00:00
parent ae828bc6f9
commit 8fb3e0079a
18 changed files with 117 additions and 63 deletions

4
BUGS
View File

@ -1,7 +1,7 @@
List of known bugs (certainly very incomplete) List of known bugs (certainly very incomplete)
---------------------------------------------- ----------------------------------------------
Time-stamp: <1998-02-27T13:05:49-0800 drepper> Time-stamp: <1998-03-03T15:29:53-0800 drepper>
This following list contains those bugs which I'm aware of. Please This following list contains those bugs which I'm aware of. Please
make sure that bugs you report are not listed here. If you can fix one make sure that bugs you report are not listed here. If you can fix one
@ -52,7 +52,7 @@ Severity: [ *] to [***]
directive, with localedef, not only the copied category is directive, with localedef, not only the copied category is
checked for errors, but the whole file containing the same checked for errors, but the whole file containing the same
category. category.
[PR libc/207] [PR libc/207 and PR libc/454]
[ *] The libm-ieee `gamma' function gives wrong results (at least for [ *] The libm-ieee `gamma' function gives wrong results (at least for
-0.5). -0.5).

View File

@ -1,3 +1,32 @@
1998-03-03 17:55 Ulrich Drepper <drepper@cygnus.com>
* elf/sprof.c: Cleanup a bit.
1998-03-03 08:01 H.J. Lu <hjl@gnu.org>
* sysdeps/generic/sysdep.h (L): New. Define.
* sysdeps/unix/sysv/linux/i386/sysdep.h (L): New. Define.
* sysdeps/i386/i586/addmul_1.S: Fix a typo.
* sysdeps/unix/sysv/linux/i386/clone.S: Follow Intel's advice
to have only one exit point for functions.
* sysdeps/unix/sysv/linux/i386/mmap.S: Likewise.
* sysdeps/unix/sysv/linux/i386/s_pread64.S: Likewise.
* sysdeps/unix/sysv/linux/i386/s_pwrite64.S: Likewise.
* sysdeps/unix/sysv/linux/i386/socket.S: Likewise.
* sysdeps/unix/sysv/linux/i386/syscall.S: Likewise.
1998-03-03 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* sysdeps/unix/sysv/linux/sigaction.c (__sigaction): Safe and
reset errno so that errno isn't set to ENOSYS in the first call.
* sysdeps/unix/sysv/linux/i386/sigaction.c (__sigaction): Likewise.
* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
* sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): Likewise.
* sysdeps/unix/sysv/linux/sigpending.c (sigpending): Likewise.
1998-03-02 17:55 Ulrich Drepper <drepper@cygnus.com> 1998-03-02 17:55 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/i386/add_n.S: Change to use ENTRY and END macro. * sysdeps/i386/add_n.S: Change to use ENTRY and END macro.

View File

@ -2,7 +2,7 @@ As a special exception, when Berkeley DB is distributed along with the
GNU C Library, in any program which uses the GNU C Library in accord GNU C Library, in any program which uses the GNU C Library in accord
with that library's distribution terms, it is also permitted for with that library's distribution terms, it is also permitted for
Berkeley DB to be loaded dynamically by the GNU C Library to implement Berkeley DB to be loaded dynamically by the GNU C Library to implement
standard ISO/IEC 9945 (POSIX 1003) and Unix interface functionality. standard ISO/IEC 9945 and Unix interface functionality.
Sleepycat Software, Inc. Sleepycat Software, Inc.

View File

@ -144,6 +144,8 @@ struct known_symbol
const char *name; const char *name;
uintptr_t addr; uintptr_t addr;
size_t size; size_t size;
uintmax_t ticks;
}; };
@ -192,8 +194,9 @@ struct profdata
/* Search tree for symbols. */ /* Search tree for symbols. */
void *symroot; void *symroot;
static const struct known_symbol **sortsym; static struct known_symbol **sortsym;
static size_t symidx; static size_t symidx;
static uintmax_t total_ticks;
/* Prototypes for local functions. */ /* Prototypes for local functions. */
static struct shobj *load_shobj (const char *name); static struct shobj *load_shobj (const char *name);
@ -280,6 +283,14 @@ no filename for profiling data given and shared object `%s' has no soname"),
{ {
case COUNT_TOTAL: case COUNT_TOTAL:
count_total_ticks (shobj_handle, profdata_handle); count_total_ticks (shobj_handle, profdata_handle);
{
size_t n;
for (n = 0; n < symidx; ++n)
if (sortsym[n]->ticks != 0)
printf ("Name: %-30s, Ticks: %" PRIdMAX "\n", sortsym[n]->name,
sortsym[n]->ticks);
printf ("Total ticks: %" PRIdMAX "\n", total_ticks);
}
break; break;
case NONE: case NONE:
/* Do nothing. */ /* Do nothing. */
@ -443,32 +454,31 @@ load_shobj (const char *name)
* sizeof (struct here_cg_arc_record))); * sizeof (struct here_cg_arc_record)));
if (do_test) if (do_test)
{ printf ("expected size: %Zd\n", result->expected_size);
#define SCALE_1_TO_1 0x10000L #define SCALE_1_TO_1 0x10000L
printf ("expected size: %Zd\n", result->expected_size); if (result->kcountsize < result->highpc - result->lowpc)
{
size_t range = result->highpc - result->lowpc;
size_t quot = range / result->kcountsize;
if (result->kcountsize < result->highpc - result->lowpc) if (quot >= SCALE_1_TO_1)
{ result->s_scale = 1;
size_t range = result->highpc - result->lowpc; else if (quot >= SCALE_1_TO_1 / 256)
size_t quot = range / result->kcountsize; result->s_scale = SCALE_1_TO_1 / quot;
else if (range > ULONG_MAX / 256)
if (quot >= SCALE_1_TO_1) result->s_scale = ((SCALE_1_TO_1 * 256)
result->s_scale = 1; / (range / (result->kcountsize / 256)));
else if (quot >= SCALE_1_TO_1 / 256)
result->s_scale = SCALE_1_TO_1 / quot;
else if (range > ULONG_MAX / 256)
result->s_scale = ((SCALE_1_TO_1 * 256)
/ (range / (result->kcountsize / 256)));
else
result->s_scale = ((SCALE_1_TO_1 * 256)
/ ((range * 256) / result->kcountsize));
}
else else
result->s_scale = SCALE_1_TO_1; result->s_scale = ((SCALE_1_TO_1 * 256)
/ ((range * 256) / result->kcountsize));
printf ("s_scale: %d\n", result->s_scale);
} }
else
result->s_scale = SCALE_1_TO_1;
if (do_test)
printf ("s_scale: %d\n", result->s_scale);
/* Determine the string table. */ /* Determine the string table. */
if (map->l_info[DT_STRTAB] == NULL) if (map->l_info[DT_STRTAB] == NULL)
@ -775,32 +785,28 @@ static void
count_total_ticks (struct shobj *shobj, struct profdata *profdata) count_total_ticks (struct shobj *shobj, struct profdata *profdata)
{ {
volatile uint16_t *kcount = profdata->kcount; volatile uint16_t *kcount = profdata->kcount;
uint64_t sum = 0; size_t maxkidx = shobj->kcountsize;
size_t idx;
size_t factor = 2 * (65536 / shobj->s_scale); size_t factor = 2 * (65536 / shobj->s_scale);
size_t kidx = 0;
size_t sidx = 0;
for (idx = shobj->kcountsize / sizeof (*kcount); idx > 0; ) while (sidx < symidx)
{ {
--idx; uintptr_t start = sortsym[sidx]->addr;
if (kcount[idx] != 0) uintptr_t end = start + sortsym[sidx]->size;
{
size_t n;
for (n = 0; n < symidx; ++n) while (kidx < maxkidx && factor * kidx < start)
if (sortsym[n]->addr <= factor * idx ++kidx;
&& sortsym[n]->addr + sortsym[n]->size > factor * idx) if (kidx == maxkidx)
break; break;
if (n < symidx) while (kidx < maxkidx && factor * kidx < end)
printf ("idx = %d, count = %d, name = %s\n", idx, kcount[idx], sortsym[sidx]->ticks += kcount[kidx++];
sortsym[n]->name); if (kidx == maxkidx)
else break;
printf ("idx = %d, N/A\n", idx);
} total_ticks += sortsym[sidx++]->ticks;
sum += kcount[idx];
} }
printf ("total ticks: %10" PRId64 "\n", sum);
} }
@ -818,14 +824,7 @@ static void
printsym (const void *node, VISIT value, int level) printsym (const void *node, VISIT value, int level)
{ {
if (value == leaf || value == postorder) if (value == leaf || value == postorder)
{ sortsym[symidx++] = *(const struct known_symbol **) node;
const struct known_symbol *sym = *(const struct known_symbol **) node;
printf ("Name: %30s, Start: %6x, Len: %5d\n",
sym->name, sym->addr, sym->size);
sortsym[symidx++] = sym;
}
} }
@ -882,6 +881,7 @@ read_symbols (struct shobj *shobj)
newsym->name = name0; newsym->name = name0;
newsym->addr = last_addr; newsym->addr = last_addr;
newsym->size = *((uint32_t *) (shobj->stab + idx + VALOFF)); newsym->size = *((uint32_t *) (shobj->stab + idx + VALOFF));
newsym->ticks = 0;
tsearch (newsym, &symroot, symorder); tsearch (newsym, &symroot, symorder);
++n; ++n;
@ -920,6 +920,7 @@ read_symbols (struct shobj *shobj)
newsym->name = &strtab[symtab->st_name]; newsym->name = &strtab[symtab->st_name];
newsym->addr = symtab->st_value; newsym->addr = symtab->st_value;
newsym->size = symtab->st_size; newsym->size = symtab->st_size;
newsym->ticks = 0;
tsearch (newsym, &symroot, symorder); tsearch (newsym, &symroot, symorder);
++n; ++n;

View File

@ -1,5 +1,5 @@
/* Generic asm macros used on many machines. /* Generic asm macros used on many machines.
Copyright (C) 1991, 92, 93, 96 Free Software Foundation, Inc. Copyright (C) 1991, 92, 93, 96, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -41,3 +41,8 @@
#ifndef END #ifndef END
#define END(sym) #define END(sym)
#endif #endif
/* Local label name for asm code. */
#ifndef L
#define L(name) name
#endif

View File

@ -35,7 +35,7 @@
#define s2_limb ebp #define s2_limb ebp
.text .text
ENRTY(__mpn_addmul_1) ENTRY(__mpn_addmul_1)
INSN1(push,l ,R(edi)) INSN1(push,l ,R(edi))
INSN1(push,l ,R(esi)) INSN1(push,l ,R(esi))

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Richard Henderson (rth@tamu.edu) Contributed by Richard Henderson (rth@tamu.edu)
@ -59,6 +59,7 @@ ENTRY(__clone)
jl syscall_error jl syscall_error
jz thread_start jz thread_start
L(pseudo_end):
ret ret
thread_start: thread_start:

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -40,6 +40,7 @@ ENTRY (__mmap)
ja syscall_error ja syscall_error
/* Successful; return the syscall's value. */ /* Successful; return the syscall's value. */
L(pseudo_end):
ret ret
PSEUDO_END (__mmap) PSEUDO_END (__mmap)

View File

@ -1,5 +1,5 @@
/* pread64 syscall for Linux/ix86. /* pread64 syscall for Linux/ix86.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -48,7 +48,8 @@ ENTRY (__syscall_pread64)
POPARGS_5 /* Restore register contents. */ POPARGS_5 /* Restore register contents. */
cmpl $-4095, %eax /* Check %eax for error. */ cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */ jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
#endif #endif
ret /* Return to caller. */
L(pseudo_end):
PSEUDO_END (__syscall_pread64) PSEUDO_END (__syscall_pread64)

View File

@ -1,5 +1,5 @@
/* pwrite64 syscall for Linux/ix86. /* pwrite64 syscall for Linux/ix86.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -48,7 +48,8 @@ ENTRY (__syscall_pwrite64)
POPARGS_5 /* Restore register contents. */ POPARGS_5 /* Restore register contents. */
cmpl $-4095, %eax /* Check %eax for error. */ cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */ jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
#endif #endif
L(pseudo_end):
ret /* Return to caller. */
PSEUDO_END (__syscall_pwrite64) PSEUDO_END (__syscall_pwrite64)

View File

@ -48,6 +48,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
if (!__libc_missing_rt_sigs) if (!__libc_missing_rt_sigs)
{ {
struct kernel_sigaction kact, koact; struct kernel_sigaction kact, koact;
int saved_errno = errno;
if (act) if (act)
{ {
@ -76,6 +77,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
return result; return result;
} }
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1; __libc_missing_rt_sigs = 1;
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -58,6 +58,7 @@ ENTRY (__socket)
jae syscall_error jae syscall_error
/* Successful; return the syscall's value. */ /* Successful; return the syscall's value. */
L(pseudo_end):
ret ret
PSEUDO_END (__socket) PSEUDO_END (__socket)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -31,6 +31,7 @@ ENTRY (syscall)
POPARGS_5 /* Restore register contents. */ POPARGS_5 /* Restore register contents. */
cmpl $-4095, %eax /* Check %eax for error. */ cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */ jae syscall_error /* Jump to error handler if error. */
L(pseudo_end):
ret /* Return to caller. */ ret /* Return to caller. */
PSEUDO_END (syscall) PSEUDO_END (syscall)

View File

@ -30,6 +30,9 @@
#undef SYS_ify #undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name #define SYS_ify(syscall_name) __NR_##syscall_name
/* ELF-like local names start with `.L'. */
#undef L
#define L(name) .L##name
#ifdef ASSEMBLER #ifdef ASSEMBLER

View File

@ -50,6 +50,7 @@ __sigaction (sig, act, oact)
if (!__libc_missing_rt_sigs) if (!__libc_missing_rt_sigs)
{ {
struct kernel_sigaction kact, koact; struct kernel_sigaction kact, koact;
int saved_errno = errno;
if (act) if (act)
{ {
@ -80,6 +81,7 @@ __sigaction (sig, act, oact)
return result; return result;
} }
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1; __libc_missing_rt_sigs = 1;
} }

View File

@ -40,11 +40,13 @@ sigpending (set)
{ {
/* XXX The size argument hopefully will have to be changed to the /* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */ real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigpending (set, _NSIG / 8); int result = __syscall_rt_sigpending (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS) if (result >= 0 || errno != ENOSYS)
return result; return result;
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1; __libc_missing_rt_sigs = 1;
} }

View File

@ -41,11 +41,13 @@ __sigprocmask (how, set, oset)
{ {
/* XXX The size argument hopefully will have to be changed to the /* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */ real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigprocmask (how, set, oset, _NSIG / 8); int result = __syscall_rt_sigprocmask (how, set, oset, _NSIG / 8);
if (result >= 0 || errno != ENOSYS) if (result >= 0 || errno != ENOSYS)
return result; return result;
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1; __libc_missing_rt_sigs = 1;
} }

View File

@ -40,11 +40,13 @@ __sigsuspend (set)
{ {
/* XXX The size argument hopefully will have to be changed to the /* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */ real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigsuspend (set, _NSIG / 8); int result = __syscall_rt_sigsuspend (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS) if (result >= 0 || errno != ENOSYS)
return result; return result;
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1; __libc_missing_rt_sigs = 1;
} }