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)
----------------------------------------------
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
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
checked for errors, but the whole file containing the same
category.
[PR libc/207]
[PR libc/207 and PR libc/454]
[ *] The libm-ieee `gamma' function gives wrong results (at least for
-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>
* 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
with that library's distribution terms, it is also permitted for
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.

View File

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

View File

@ -1,5 +1,5 @@
/* 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.
The GNU C Library is free software; you can redistribute it and/or
@ -41,3 +41,8 @@
#ifndef END
#define END(sym)
#endif
/* Local label name for asm code. */
#ifndef L
#define L(name) name
#endif

View File

@ -35,7 +35,7 @@
#define s2_limb ebp
.text
ENRTY(__mpn_addmul_1)
ENTRY(__mpn_addmul_1)
INSN1(push,l ,R(edi))
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.
Contributed by Richard Henderson (rth@tamu.edu)
@ -59,6 +59,7 @@ ENTRY(__clone)
jl syscall_error
jz thread_start
L(pseudo_end):
ret
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.
The GNU C Library is free software; you can redistribute it and/or
@ -40,6 +40,7 @@ ENTRY (__mmap)
ja syscall_error
/* Successful; return the syscall's value. */
L(pseudo_end):
ret
PSEUDO_END (__mmap)

View File

@ -1,5 +1,5 @@
/* 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.
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. */
cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
#endif
ret /* Return to caller. */
L(pseudo_end):
PSEUDO_END (__syscall_pread64)

View File

@ -1,5 +1,5 @@
/* 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.
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. */
cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
#endif
L(pseudo_end):
ret /* Return to caller. */
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)
{
struct kernel_sigaction kact, koact;
int saved_errno = errno;
if (act)
{
@ -76,6 +77,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
return result;
}
__set_errno (saved_errno);
__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.
The GNU C Library is free software; you can redistribute it and/or
@ -58,6 +58,7 @@ ENTRY (__socket)
jae syscall_error
/* Successful; return the syscall's value. */
L(pseudo_end):
ret
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.
The GNU C Library is free software; you can redistribute it and/or
@ -31,6 +31,7 @@ ENTRY (syscall)
POPARGS_5 /* Restore register contents. */
cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
L(pseudo_end):
ret /* Return to caller. */
PSEUDO_END (syscall)

View File

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

View File

@ -50,6 +50,7 @@ __sigaction (sig, act, oact)
if (!__libc_missing_rt_sigs)
{
struct kernel_sigaction kact, koact;
int saved_errno = errno;
if (act)
{
@ -80,6 +81,7 @@ __sigaction (sig, act, oact)
return result;
}
__set_errno (saved_errno);
__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
real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigpending (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__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
real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigprocmask (how, set, oset, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__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
real size of the user-level sigset_t. */
int saved_errno = errno;
int result = __syscall_rt_sigsuspend (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__libc_missing_rt_sigs = 1;
}