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
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).
+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.
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.
const char *name;
uintptr_t addr;
size_t size;
+
+ uintmax_t ticks;
};
/* 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);
{
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. */
* sizeof (struct here_cg_arc_record)));
if (do_test)
- {
-#define SCALE_1_TO_1 0x10000L
+ printf ("expected size: %Zd\n", result->expected_size);
- printf ("expected size: %Zd\n", result->expected_size);
+#define SCALE_1_TO_1 0x10000L
- 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 (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;
-
- 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)
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;
-
- for (n = 0; n < symidx; ++n)
- if (sortsym[n]->addr <= factor * idx
- && sortsym[n]->addr + sortsym[n]->size > factor * idx)
- 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];
- }
+ uintptr_t start = sortsym[sidx]->addr;
+ uintptr_t end = start + sortsym[sidx]->size;
+
+ while (kidx < maxkidx && factor * kidx < start)
+ ++kidx;
+ if (kidx == maxkidx)
+ break;
- printf ("total ticks: %10" PRId64 "\n", sum);
+ while (kidx < maxkidx && factor * kidx < end)
+ sortsym[sidx]->ticks += kcount[kidx++];
+ if (kidx == maxkidx)
+ break;
+
+ total_ticks += sortsym[sidx++]->ticks;
+ }
}
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;
}
newsym->name = name0;
newsym->addr = last_addr;
newsym->size = *((uint32_t *) (shobj->stab + idx + VALOFF));
+ newsym->ticks = 0;
tsearch (newsym, &symroot, symorder);
++n;
newsym->name = &strtab[symtab->st_name];
newsym->addr = symtab->st_value;
newsym->size = symtab->st_size;
+ newsym->ticks = 0;
tsearch (newsym, &symroot, symorder);
++n;
/* 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
#ifndef END
#define END(sym)
#endif
+
+/* Local label name for asm code. */
+#ifndef L
+#define L(name) name
+#endif
#define s2_limb ebp
.text
-ENRTY(__mpn_addmul_1)
+ENTRY(__mpn_addmul_1)
INSN1(push,l ,R(edi))
INSN1(push,l ,R(esi))
-/* 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)
jl syscall_error
jz thread_start
+L(pseudo_end):
ret
thread_start:
-/* 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
ja syscall_error
/* Successful; return the syscall's value. */
+L(pseudo_end):
ret
PSEUDO_END (__mmap)
/* 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
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)
/* 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
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)
if (!__libc_missing_rt_sigs)
{
struct kernel_sigaction kact, koact;
+ int saved_errno = errno;
if (act)
{
return result;
}
+ __set_errno (saved_errno);
__libc_missing_rt_sigs = 1;
}
-/* 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
jae syscall_error
/* Successful; return the syscall's value. */
+L(pseudo_end):
ret
PSEUDO_END (__socket)
-/* 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
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)
#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
if (!__libc_missing_rt_sigs)
{
struct kernel_sigaction kact, koact;
+ int saved_errno = errno;
if (act)
{
return result;
}
+ __set_errno (saved_errno);
__libc_missing_rt_sigs = 1;
}
{
/* 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;
}
{
/* 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;
}
{
/* 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;
}