Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 3 Mar 1998 17:58:38 +0000 (17:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 3 Mar 1998 17:58:38 +0000 (17:58 +0000)
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.

18 files changed:
BUGS
ChangeLog
db2/README
elf/sprof.c
sysdeps/generic/sysdep.h
sysdeps/i386/i586/addmul_1.S
sysdeps/unix/sysv/linux/i386/clone.S
sysdeps/unix/sysv/linux/i386/mmap.S
sysdeps/unix/sysv/linux/i386/s_pread64.S
sysdeps/unix/sysv/linux/i386/s_pwrite64.S
sysdeps/unix/sysv/linux/i386/sigaction.c
sysdeps/unix/sysv/linux/i386/socket.S
sysdeps/unix/sysv/linux/i386/syscall.S
sysdeps/unix/sysv/linux/i386/sysdep.h
sysdeps/unix/sysv/linux/sigaction.c
sysdeps/unix/sysv/linux/sigpending.c
sysdeps/unix/sysv/linux/sigprocmask.c
sysdeps/unix/sysv/linux/sigsuspend.c

diff --git a/BUGS b/BUGS
index 546fab2..ccb6077 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -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).
index 0e93f14..b7ef62a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 0793d74..cf527ab 100644 (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.
 
index 0d50806..7049012 100644 (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)
-    {
-#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)
@@ -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;
-
-         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;
+    }
 }
 
 
@@ -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;
index 014cd1c..2ba01f4 100644 (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
index b97799f..76bf25f 100644 (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))
index 0aec95e..88d0e27 100644 (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:
index 30bbcdf..5c2449e 100644 (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)
index 9e14aa8..7f8816b 100644 (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)
index a21fe2f..7b72d12 100644 (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)
index a6d2b63..0110a80 100644 (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;
     }
 
index f649470..4326676 100644 (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)
index 6a020e0..349408d 100644 (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)
index 7455e8d..4ebcc6c 100644 (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
 
index 49cb3b6..773bfa0 100644 (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;
     }
 
index 4d5514a..1776fdd 100644 (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;
     }
 
index 476f46a..064179e 100644 (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;
     }
 
index 1970154..a5d2eb0 100644 (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;
     }