* grp/putgrent.c (putgrent): Don't write 0 as group
authorUlrich Drepper <drepper@redhat.com>
Wed, 12 Jan 2005 03:12:43 +0000 (03:12 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 12 Jan 2005 03:12:43 +0000 (03:12 +0000)
ID if groupname starts with + or -.
* pwd/putpwent.c (putpwent): Don't write 0 as user or
group ID if user name starts with + or -.

2005-01-09  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

* sysdeps/generic/ldsodefs.h (struct audit_ifaces): Add sh variants.
* sysdeps/elf/tst-auditmod1.c: Add sh support.
* sysdeps/sh/bits/link.h: New.
* sysdeps/sh/dl-machine.h: Remove trampoline code here.  Define
ARCH_LA_PLTENTER and ARCH_LA_PLTEXIT.  Remove obsolete comments.
(RTLD_START): Define __fpscr_values.
* sysdeps/sh/dl-trampoline.S: New file.
* sysdeps/sh/sh4/dl-trampoline.S: New file.
* sysdeps/sh/sh4/Versions [ld]: Add __fpscr_values.
* sysdeps/sh/sh4/dl-machine.h: Remove.

2005-01-10  Jakub Jelinek  <jakub@redhat.com>

* time/tst-strptime.c (day_tests): Add 2 new tests.
(test_tm, main): Issue an error instead of segfaulting if
strptime returns NULL.

2005-01-10  H.J. Lu  <hongjiu.lu@intel.com>

* sysdeps/alpha/libc-tls.c (__tls_get_addr): Updated for dtv_t union.
* sysdeps/ia64/libc-tls.c (__tls_get_addr): Likewise.

14 files changed:
ChangeLog
elf/tst-auditmod1.c
grp/putgrent.c
pwd/putpwent.c
sysdeps/alpha/libc-tls.c
sysdeps/generic/ldsodefs.h
sysdeps/ia64/libc-tls.c
sysdeps/sh/bits/link.h
sysdeps/sh/dl-machine.h
sysdeps/sh/dl-trampoline.S [new file with mode: 0644]
sysdeps/sh/sh4/Versions [new file with mode: 0644]
sysdeps/sh/sh4/dl-machine.h [deleted file]
sysdeps/sh/sh4/dl-trampoline.S [new file with mode: 0644]
time/tst-strptime.c

index 9ffe21aaaa054e87e7d7e41f5bf77995bd350f18..1f98fbf6ef8639a6bfab55553afacf7fc4215904 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2005-01-11  Thorsten Kukuk  <kukuk@suse.de>
+
+       * grp/putgrent.c (putgrent): Don't write 0 as group
+       ID if groupname starts with + or -.
+       * pwd/putpwent.c (putpwent): Don't write 0 as user or
+       group ID if user name starts with + or -.
+
+2005-01-09  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+       * sysdeps/generic/ldsodefs.h (struct audit_ifaces): Add sh variants.
+       * sysdeps/elf/tst-auditmod1.c: Add sh support.
+       * sysdeps/sh/bits/link.h: New.
+       * sysdeps/sh/dl-machine.h: Remove trampoline code here.  Define
+       ARCH_LA_PLTENTER and ARCH_LA_PLTEXIT.  Remove obsolete comments.
+       (RTLD_START): Define __fpscr_values.
+       * sysdeps/sh/dl-trampoline.S: New file.
+       * sysdeps/sh/sh4/dl-trampoline.S: New file.
+       * sysdeps/sh/sh4/Versions [ld]: Add __fpscr_values.
+       * sysdeps/sh/sh4/dl-machine.h: Remove.
+
+2005-01-10  Jakub Jelinek  <jakub@redhat.com>
+
+       * time/tst-strptime.c (day_tests): Add 2 new tests.
+       (test_tm, main): Issue an error instead of segfaulting if
+       strptime returns NULL.
+
+2005-01-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * sysdeps/alpha/libc-tls.c (__tls_get_addr): Updated for dtv_t union.
+       * sysdeps/ia64/libc-tls.c (__tls_get_addr): Likewise.
+
 2005-01-11  Ulrich Drepper  <drepper@redhat.com>
 
        * malloc/malloc.h: Remove no-glibc support.
index 054c27dba2217fad8b4ed6ae1e9a987c30e853a7..ae7677647f5aaf9508ebc3edc377522aa67a5742 100644 (file)
@@ -194,6 +194,29 @@ la_ppc64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
   return 0;
 }
+#elif defined __sh__
+uintptr_t
+la_sh_gnu_pltenter (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
+                   uintptr_t *defcook, La_sh_regs *regs,
+                   unsigned int *flags, const char *symname,
+                   long int *framesizep)
+{
+  printf ("sh_pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
+         symname, (long int) sym->st_value, ndx, *flags);
+
+  return sym->st_value;
+}
+
+unsigned int
+la_sh_gnu_pltexit (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
+                  uintptr_t *defcook, const La_sh_regs *inregs,
+                  La_sh_retval *outregs, const char *symname)
+{
+  printf ("sh_pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n",
+         symname, (long int) sym->st_value, ndx, outregs->lrv_r0);
+
+  return 0;
+}
 #else
 # error "architecture specific code needed"
 #endif
index cb9b6b1f79956802ecf8c23c5977b3f4946151c1..382d6a4daa88a8666ead0761d08899e7192b0a5f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 96, 98, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,96,98,99,2000,2005 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
@@ -44,8 +44,13 @@ putgrent (gr, stream)
 
   flockfile (stream);
 
-  retval = fprintf (stream, "%s:%s:%u:",
-                   gr->gr_name, _S (gr->gr_passwd), gr->gr_gid);
+  if (gr->gr_name[0] == '+' || gr->gr_name[0] == '-')
+    retval = fprintf (stream, "%s:%s::",
+                     gr->gr_name, _S (gr->gr_passwd));
+  else
+    retval = fprintf (stream, "%s:%s:%lu:",
+                     gr->gr_name, _S (gr->gr_passwd),
+                     (unsigned long int) gr->gr_gid);
   if (__builtin_expect (retval, 0) < 0)
     {
       funlockfile (stream);
index 8b7767bd4a7e12ae2f03d193eecbe1cafe2a66d8..a1041ec1c22b555daf44f4d740f405559f2daf97 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1996,1997,1998,2005 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
@@ -20,7 +20,7 @@
 #include <stdio.h>
 #include <pwd.h>
 
-#define _S(x)  x ? x : ""
+#define _S(x)  x ?: ""
 
 /* Write an entry to the given stream.
    This must know the format of the password file.  */
@@ -35,11 +35,21 @@ putpwent (p, stream)
       return -1;
     }
 
-  if (fprintf (stream, "%s:%s:%lu:%lu:%s:%s:%s\n",
-              p->pw_name, _S (p->pw_passwd),
-              (unsigned long int) p->pw_uid, (unsigned long int) p->pw_gid,
-              _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
-    return -1;
-
+  if (p->pw_name[0] == '+' || p->pw_name[0] == '-')
+    {
+      if (fprintf (stream, "%s:%s:::%s:%s:%s\n",
+                  p->pw_name, _S (p->pw_passwd),
+                  _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
+       return -1;
+    }
+  else
+    {
+      if (fprintf (stream, "%s:%s:%lu:%lu:%s:%s:%s\n",
+                  p->pw_name, _S (p->pw_passwd),
+                  (unsigned long int) p->pw_uid,
+                  (unsigned long int) p->pw_gid,
+                  _S (p->pw_gecos), _S (p->pw_dir), _S (p->pw_shell)) < 0)
+       return -1;
+    }
   return 0;
 }
index 434d5d931308a22e10c0221b75aff7c3f01f4f6a..a3b68e928f3a08f37f66bb2c4053ea844a64b067 100644 (file)
@@ -31,7 +31,7 @@ void *
 __tls_get_addr (tls_index *ti)
 {
   dtv_t *dtv = THREAD_DTV ();
-  return (char *) dtv[1].pointer + ti->ti_offset;
+  return (char *) dtv[1].pointer.val + ti->ti_offset;
 }
 
 #endif
index 7364f321debd52dd8a6e8ff3496fcb20843d0d2b..e4024419e3b590d487d547ef88933b8044e1a2fe 100644 (file)
@@ -183,6 +183,8 @@ struct La_ppc32_regs;
 struct La_ppc32_retval;
 struct La_ppc64_regs;
 struct La_ppc64_retval;
+struct La_sh_regs;
+struct La_sh_retval;
 
 
 struct audit_ifaces
@@ -216,6 +218,10 @@ struct audit_ifaces
                                      uintptr_t *, struct La_ppc64_regs *,
                                      unsigned int *, const char *name,
                                      long int *framesizep);
+    uintptr_t (*sh_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *,
+                                 uintptr_t *, const struct La_sh_regs *,
+                                 unsigned int *, const char *name,
+                                 long int *framesizep);
   };
   union
   {
@@ -235,6 +241,9 @@ struct audit_ifaces
                                       uintptr_t *,
                                       const struct La_ppc64_regs *,
                                       struct La_ppc64_retval *, const char *);
+    unsigned int (*sh_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *,
+                                   uintptr_t *, const struct La_sh_regs *,
+                                   struct La_sh_retval *, const char *);
   };
   unsigned int (*objclose) (uintptr_t *);
 
index f1df4cd12ee9e9de0d87393ccfe61dbd37c7a739..3a6b8e5532ff119272c1b22d9d532bc821c45f6b 100644 (file)
@@ -30,7 +30,7 @@ void *
 __tls_get_addr (size_t m, size_t offset)
 {
   dtv_t *dtv = THREAD_DTV ();
-  return (char *) dtv[1].pointer + offset;
+  return (char *) dtv[1].pointer.val + offset;
 }
 
 #endif
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2826677336507855900791740a07365d05a0fe6e 100644 (file)
@@ -0,0 +1,70 @@
+/* Copyright (C) 2005 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef        _LINK_H
+# error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+
+/* Registers for entry into PLT on SH.  */
+typedef struct La_sh_regs
+{
+  uint32_t lr_r2;
+  uint32_t lr_r3;
+  uint32_t lr_r4;
+  uint32_t lr_r5;
+  uint32_t lr_r6;
+  uint32_t lr_r7;
+  uint32_t lr_fpscr;
+  float lr_fr4;
+  float lr_fr5;
+  float lr_fr6;
+  float lr_fr7;
+  float lr_fr8;
+  float lr_fr9;
+  float lr_fr10;
+  float lr_fr11;
+} La_sh_regs;
+
+/* Return values for calls from PLT on SH.  */
+typedef struct La_sh_retval
+{
+  uint32_t lrv_r0;
+  uint32_t lrv_r1;
+  float lrv_fr0;
+  float lrv_fr1;
+} La_sh_retval;
+
+
+__BEGIN_DECLS
+
+extern Elf32_Addr la_sh_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
+                                     uintptr_t *__refcook,
+                                     uintptr_t *__defcook,
+                                     La_sh_regs *__regs,
+                                     unsigned int *__flags,
+                                     const char *__symname,
+                                     long int *__framesizep);
+extern unsigned int la_sh_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
+                                      uintptr_t *__refcook,
+                                      uintptr_t *__defcook,
+                                      const La_sh_regs *__inregs,
+                                      La_sh_retval *__outregs,
+                                      const char *symname);
+
+__END_DECLS
index 271666a2a3b730fa03fcc8fe3b2583bc27e0e580..2b21f1b08ea0c2c735316f859d4ae8f09d4f60eb 100644 (file)
@@ -1,5 +1,5 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  SH version.
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -21,8 +21,6 @@
 #ifndef dl_machine_h
 #define dl_machine_h
 
-/* Only dummy. This doesn't work. */
-
 #define ELF_MACHINE_NAME "SH"
 
 #include <sys/param.h>
@@ -106,7 +104,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
        {
          got[2] = (Elf32_Addr) &_dl_runtime_profile;
          /* Say that we really want profiling and the timers are started.  */
-         GL(dl_profile_map) = l;
+         if (GLRO(dl_profile) != NULL
+             && _dl_name_match_p (GLRO(dl_profile), l))
+           GL(dl_profile_map) = l;
        }
       else
        /* This function will get called to fix up the GOT entry indicated by
@@ -116,273 +116,8 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
   return lazy;
 }
 
-/* This code is used in dl-runtime.c to call the `fixup' function
-   and then redirect to the address it returns.         */
-
 #define ELF_MACHINE_RUNTIME_FIXUP_ARGS int plt_type
 
-#ifdef SHARED
-#define FUN_ADDR       "\
-       mov.l 1f,r2\n\
-       mova 1f,r0\n\
-        bra 2f\n\
-        add r0,r2              ! Get GOT address in r2\n\
-0:     .align 2\n\
-1:     .long _GLOBAL_OFFSET_TABLE_\n\
-2:     mov.l 3f,r0\n\
-       add r2,r0"
-#define GOTJMP(x)      #x "@GOTOFF"
-#else
-#define FUN_ADDR       "\
-       mov.l 3f,r0"
-#define GOTJMP(x)      #x
-#endif
-
-#ifdef HAVE_FPU
-#define FGR_SAVE       "\
-       sts.l   fpscr, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov     #8,r3\n\
-       swap.w  r3, r3\n\
-       lds     r3, fpscr\n\
-       fmov.s  fr11, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr10, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr9, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr8, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr7, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr6, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr5, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       fmov.s  fr4, @-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4)
-#define FGR_LOAD       "\
-       fmov.s  @r15+, fr4\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr5\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr6\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr7\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr8\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr9\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr10\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       fmov.s  @r15+, fr11\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       lds.l   @r15+, fpscr\n\
-       " CFI_ADJUST_CFA_OFFSET (-4)
-#else
-#define FGR_SAVE       ""
-#define FGR_LOAD       ""
-#endif
-
-#ifndef PROF
-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
-       .text\n\
-       .globl _dl_runtime_resolve\n\
-       .type _dl_runtime_resolve, @function\n\
-       " CFI_STARTPROC "\n\
-       .align 5\n\
-_dl_runtime_resolve:\n\
-       mov.l r2,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r4,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r5,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r6,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r7,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r12,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       movt r3                 ! Save T flag.\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       " FGR_SAVE "\n\
-       sts.l pr,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       tst r0,r0\n\
-       bt 1f\n\
-       mov r0,r2\n\
-1:\n\
-       mov r0,r4               ! PLT type\n\
-       mov r2,r5               ! link map address\n\
-       " FUN_ADDR "\n\
-       jsr @r0                 ! Call resolver.\n\
-        mov r1,r6              ! reloc offset\n\
-       lds.l @r15+,pr          ! Get register content back.\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       " FGR_LOAD "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       shal r3                 ! Lode T flag.\n\
-       mov.l @r15+,r12\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r7\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r6\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r5\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r4\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       jmp @r0                 ! Jump to function address.\n\
-        mov.l @r15+,r2\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       .align 2\n\
-3:\n\
-       .long " GOTJMP (fixup) "\n\
-       " CFI_ENDPROC "\n\
-       .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
-\n\
-       .globl _dl_runtime_profile\n\
-       .type _dl_runtime_profile, @function\n\
-       " CFI_STARTPROC "\n\
-       .align 5\n\
-_dl_runtime_profile:\n\
-       mov.l r2,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r4,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r5,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r6,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r7,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r12,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       movt r3                 ! Save T flag.\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       " FGR_SAVE "\n\
-       sts.l pr,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       tst r0,r0\n\
-       bt 1f\n\
-       mov r0,r2\n\
-1:\n\
-       mov r0,r4               ! PLT type\n\
-       mov r2,r5               ! link map address\n\
-       sts pr,r7               ! return address\n\
-       " FUN_ADDR "\n\
-       jsr @r0                 ! Call resolver.\n\
-        mov r1,r6              ! reloc offset\n\
-       lds.l @r15+,pr          ! Get register content back.\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       " FGR_LOAD "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       shal r3                 ! Lode T flag.\n\
-       mov.l @r15+,r12\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r7\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r6\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r5\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r4\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       jmp @r0                 ! Jump to function address.\n\
-        mov.l @r15+,r2\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       .align 2\n\
-3:\n\
-       .long " GOTJMP (profile_fixup) "\n\
-       " CFI_ENDPROC "\n\
-       .size _dl_runtime_profile, .-_dl_runtime_profile\n\
-       .previous\n\
-");
-#else
-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
-       .text\n\
-       .globl _dl_runtime_resolve\n\
-       .globl _dl_runtime_profile\n\
-       .type _dl_runtime_resolve, @function\n\
-       .type _dl_runtime_profile, @function\n\
-       .align 5\n\
-_dl_runtime_resolve:\n\
-_dl_runtime_profile:\n\
-       mov.l r2,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r4,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r5,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r6,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r7,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       mov.l r12,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       movt r3                 ! Save T flag.\n\
-       mov.l r3,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       " FGR_SAVE "\n\
-       sts.l pr,@-r15\n\
-       " CFI_ADJUST_CFA_OFFSET (4) "\n\
-       tst r0,r0\n\
-       bt 1f\n\
-       mov r0,r2\n\
-1:\n\
-       mov r0,r4               ! PLT type\n\
-       mov r2,r5               ! link map address\n\
-       sts pr,r7               ! return address\n\
-       " FUN_ADDR "\n\
-       jsr @r0                 ! Call resolver.\n\
-        mov r1,r6              ! reloc offset\n\
-       lds.l @r15+,pr          ! Get register content back.\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       " FGR_LOAD "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       shal r3                 ! Lode T flag.\n\
-       mov.l @r15+,r12\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r7\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r6\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r5\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r4\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       mov.l @r15+,r3\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       jmp @r0                 ! Jump to function address.\n\
-        mov.l @r15+,r2\n\
-       " CFI_ADJUST_CFA_OFFSET (-4) "\n\
-       .align 2\n\
-3:\n\
-       .long " GOTJMP (fixup) "\n\
-       " CFI_ENDPROC "\n\
-       .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
-       .size _dl_runtime_profile, .-_dl_runtime_profile\n\
-       .previous\n\
-");
-#endif
-
 /* Mask identifying addresses reserved for the user program,
    where the dynamic linker should not map anything.  */
 #define ELF_MACHINE_USER_ADDRESS_MASK  0x80000000UL
@@ -459,6 +194,12 @@ _dl_start_user:\n\
        .long _rtld_local@GOT\n\
 .L_dl_fini:\n\
        .long _dl_fini@GOT\n\
+       .type __fpscr_values,@object\n\
+       .global __fpscr_values\n\
+__fpscr_values:\n\
+       .long   0\n\
+       .long   0x80000\n\
+       .weak __fpscr_values\n\
 .previous\n\
 ");
 
@@ -510,9 +251,12 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
   return value + reloc->r_addend;
 }
 
+#define ARCH_LA_PLTENTER sh_gnu_pltenter
+#define ARCH_LA_PLTEXIT sh_gnu_pltexit
+
 #endif /* !dl_machine_h */
 
-#ifdef RESOLVE
+#ifdef RESOLVE_MAP
 
 /* SH never uses Elf32_Rel relocations.         */
 #define ELF_MACHINE_NO_REL 1
@@ -579,17 +323,14 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
   else
     {
       const Elf32_Sym *const refsym = sym;
-#if defined USE_TLS && !defined RTLD_BOOTSTRAP
+#ifndef RTLD_BOOTSTRAP
       struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
 
       value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
 #else
 
       value = RESOLVE (&sym, version, r_type);
-# ifndef RTLD_BOOTSTRAP
-      if (sym != NULL)
-# endif
-       value += sym->st_value;
+      value += sym->st_value;
 #endif
       value += reloc->r_addend;
 
@@ -736,4 +477,4 @@ elf_machine_lazy_rel (struct link_map *map,
     _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
 }
 
-#endif /* RESOLVE */
+#endif /* RESOLVE_MAP */
diff --git a/sysdeps/sh/dl-trampoline.S b/sysdeps/sh/dl-trampoline.S
new file mode 100644 (file)
index 0000000..79493d5
--- /dev/null
@@ -0,0 +1,431 @@
+/* PLT trampolines.  SH version.
+   Copyright (C) 2005 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <sysdep.h>
+
+       .text
+       .globl _dl_runtime_resolve
+       .type _dl_runtime_resolve, @function
+       cfi_startproc
+       .align 5
+_dl_runtime_resolve:
+       mov.l r2,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r3,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r4,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r5,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r6,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r7,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r12,@-r15
+       cfi_adjust_cfa_offset (4)
+       sts.l macl,@-r15
+       cfi_adjust_cfa_offset (4)
+       sts.l mach,@-r15
+       cfi_adjust_cfa_offset (4)
+       movt r3                 ! Save T flag.
+       mov.l r3,@-r15
+       cfi_adjust_cfa_offset (4)
+#ifdef HAVE_FPU
+       sts.l   fpscr,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov     #8,r3
+       swap.w  r3,r3
+       lds     r3,fpscr
+       fmov.s  fr11,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr10,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr9,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr8,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr7,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr6,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr5,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr4,@-r15
+       cfi_adjust_cfa_offset (4)
+#endif
+       sts.l pr,@-r15
+       cfi_adjust_cfa_offset (4)
+       tst r0,r0
+       bt 1f
+       mov r0,r2
+1:
+       mov r0,r4               ! PLT type
+       mov r2,r5               ! link map address
+#ifdef SHARED
+       mov.l 2f,r2
+       mova 2f,r0
+       add r0,r2               ! Get GOT address in r2
+       mov.l 3f,r0
+       add r2,r0
+#else
+       mov.l 3f,r0
+#endif
+       jsr @r0                 ! Call resolver.
+        mov r1,r6              ! reloc offset
+       lds.l @r15+,pr          ! Get register content back.
+       cfi_adjust_cfa_offset (-4)
+#ifdef HAVE_FPU
+       fmov.s  @r15+,fr4
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr5
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr6
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr7
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr8
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr9
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr10
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr11
+       cfi_adjust_cfa_offset (-4)
+       lds.l   @r15+,fpscr
+       cfi_adjust_cfa_offset (-4)
+#endif
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       shal r3                 ! Lode T flag.
+       lds.l @r15+,mach
+       cfi_adjust_cfa_offset (-4)
+       lds.l @r15+,macl
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r12
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r7
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r6
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r5
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r4
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       jmp @r0                 ! Jump to function address.
+        mov.l @r15+,r2
+       cfi_adjust_cfa_offset (-4)
+       .align 2
+#ifdef SHARED
+2:     .long _GLOBAL_OFFSET_TABLE_
+3:     .long _dl_fixup@GOTOFF
+#else
+3:     .long _dl_fixup
+#endif
+       cfi_endproc
+       .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+
+       .globl _dl_runtime_profile
+       .type _dl_runtime_profile,@function
+       cfi_startproc
+       .align 5
+_dl_runtime_profile:
+       mov.l r12,@-r15
+       cfi_adjust_cfa_offset (4)
+#ifdef HAVE_FPU
+       sts.l   fpscr,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov     #8,r12
+       swap.w  r12,r12
+       lds     r12,fpscr
+       fmov.s  fr11,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr10,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr9,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr8,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr7,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr6,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr5,@-r15
+       cfi_adjust_cfa_offset (4)
+       fmov.s  fr4,@-r15
+       cfi_adjust_cfa_offset (4)
+#else
+       add #-36,r15
+       cfi_adjust_cfa_offset (36)
+#endif
+       mov.l r7,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r6,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r5,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r4,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r3,@-r15
+       cfi_adjust_cfa_offset (4)
+       mov.l r2,@-r15
+       cfi_adjust_cfa_offset (4)
+       sts.l macl,@-r15
+       cfi_adjust_cfa_offset (4)
+       sts.l mach,@-r15
+       cfi_adjust_cfa_offset (4)
+       movt r3                 ! Save T flag.
+       mov.l r3,@-r15
+       cfi_adjust_cfa_offset (4)
+       sts.l pr,@-r15
+       cfi_adjust_cfa_offset (4)
+       tst r0,r0
+       bt 1f
+       mov r0,r2
+1:
+       mov r0,r4               ! PLT type
+       mov r2,r5               ! link map address
+       sts pr,r7               ! return address
+       add #-24,r15
+       cfi_adjust_cfa_offset (24)
+       mov #40,r0
+       add r15,r0
+       mov.l r0,@r15           ! Address of the register structure
+       mov #-1,r0
+       mov.l r0,@(8,r15)
+       mov #8,r0
+       add r15,r0
+       mov.l r0,@(4,r15)
+       mov.l r5,@(12,r15)
+       mov.l r1,@(16,r15)
+#ifdef SHARED
+       mov.l 2f,r12
+       mova 2f,r0
+       add r0,r12              ! Get GOT address in r12
+       mov.l 3f,r0
+       add r12,r0
+#else
+       mov.l 3f,r0
+#endif
+       jsr @r0                 ! Call resolver.
+        mov r1,r6              ! reloc offset
+       mov.l @(8,r15),r1
+       cmp/pz r1
+       bt 4f
+       add #24,r15
+       cfi_adjust_cfa_offset (-24)
+       lds.l @r15+,pr          ! Get register content back.
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       shal r3                 ! Lode T flag.
+       lds.l @r15+,mach
+       cfi_adjust_cfa_offset (-4)
+       lds.l @r15+,macl
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r2
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r4
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r5
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r6
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r7
+       cfi_adjust_cfa_offset (-4)
+#ifdef HAVE_FPU
+       fmov.s  @r15+,fr4
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr5
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr6
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr7
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr8
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr9
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr10
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr11
+       cfi_adjust_cfa_offset (-4)
+       lds.l   @r15+,fpscr
+       cfi_adjust_cfa_offset (-4)
+#else
+       add #36,r15
+       cfi_adjust_cfa_offset (-36)
+#endif
+       jmp @r0                 ! Jump to function address.
+        mov.l @r15+,r12
+       cfi_adjust_cfa_offset (-4)
+       .align 2
+#ifdef SHARED
+2:     .long _GLOBAL_OFFSET_TABLE_
+3:     .long _dl_profile_fixup@GOTOFF
+#else
+3:     .long _dl_profile_fixup
+#endif
+
+       cfi_adjust_cfa_offset (104)
+4:
+       mov #104,r3
+       add r15,r3              ! Original stack
+       mov.l r8,@(20,r15)
+       cfi_rel_offset (r8, 20)
+       mov r15,r8
+       sub r1,r15
+       shlr2 r15
+       shll2 r15
+       mov r15,r4
+       shlr2 r1
+       tst r1,r1
+5:     
+       bt/s 6f
+        dt r1
+       mov.l @r3+,r2
+       mov.l r2,@r4
+       bra 5b
+        add #4,r4
+6:
+       mov.l @r8,r12
+       mov.l @r12+,r2
+       mov.l @r12+,r3
+       mov.l @r12+,r4
+       mov.l @r12+,r5
+       mov.l @r12+,r6
+       mov.l @r12+,r7
+#ifdef HAVE_FPU
+       fmov.s  @r12+,fr4
+       fmov.s  @r12+,fr5
+       fmov.s  @r12+,fr6
+       fmov.s  @r12+,fr7
+       fmov.s  @r12+,fr8
+       fmov.s  @r12+,fr9
+       fmov.s  @r12+,fr10
+       fmov.s  @r12+,fr11
+       lds.l   @r12+,fpscr
+#else
+       add #36,r2
+#endif
+       jsr @r0                 ! Call function.
+        nop
+       mov r8,r15
+       mov.l @(12,r15),r4      ! link map address
+       mov.l @(16,r15),r5      ! reloc offset
+       mov.l @r15,r6           ! input registers
+#ifdef HAVE_FPU
+       mov #16,r8
+       add r15,r8
+       fmov.s fr1,@-r8
+       fmov.s fr0,@-r8
+#else
+       mov #8,r8
+       add r15,r8
+#endif
+       mov.l r1,@-r8
+       mov.l r0,@-r8
+       mov.l @(20,r15),r8
+       cfi_restore (r8)
+#ifdef SHARED
+       mov.l 7f,r12
+       mova 7f,r0
+       add r0,r12              ! Get GOT address in r12
+       mov.l 8f,r0
+       add r12,r0
+#else
+       mov.l 8f,r0
+#endif
+       jsr @r0
+        mov r15,r7             ! output registers
+       mov.l @r15+,r0
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r1
+       cfi_adjust_cfa_offset (-4)
+#ifdef HAVE_FPU
+       fmov.s @r15+,fr0
+       cfi_adjust_cfa_offset (-4)
+       fmov.s @r15+,fr1
+       cfi_adjust_cfa_offset (-4)
+       add #8,r15
+       cfi_adjust_cfa_offset (-8)
+#else
+       add #16,r15
+       cfi_adjust_cfa_offset (-16)
+#endif
+       lds.l @r15+,pr          ! Get register content back.
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       shal r3                 ! Lode T flag.
+       lds.l @r15+,mach
+       cfi_adjust_cfa_offset (-4)
+       lds.l @r15+,macl
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r2
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r3
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r4
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r5
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r6
+       cfi_adjust_cfa_offset (-4)
+       mov.l @r15+,r7
+       cfi_adjust_cfa_offset (-4)
+#ifdef HAVE_FPU
+       fmov.s  @r15+,fr4
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr5
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr6
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr7
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr8
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr9
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr10
+       cfi_adjust_cfa_offset (-4)
+       fmov.s  @r15+,fr11
+       cfi_adjust_cfa_offset (-4)
+       lds.l   @r15+,fpscr
+       cfi_adjust_cfa_offset (-4)
+#else
+       add #36,r15
+       cfi_adjust_cfa_offset (-36)
+#endif
+       rts                     ! Jump to function address.
+        mov.l @r15+,r12
+       cfi_adjust_cfa_offset (-4)
+       cfi_endproc
+       .align 2
+#ifdef SHARED
+7:     .long _GLOBAL_OFFSET_TABLE_
+8:     .long _dl_call_pltexit@GOTOFF
+#else
+8:     .long _dl_call_pltexit
+#endif
+       .size _dl_runtime_profile, .-_dl_runtime_profile
diff --git a/sysdeps/sh/sh4/Versions b/sysdeps/sh/sh4/Versions
new file mode 100644 (file)
index 0000000..8cc1c7b
--- /dev/null
@@ -0,0 +1,5 @@
+ld {
+  GLIBC_PRIVATE {
+    __fpscr_values;
+  }
+}
diff --git a/sysdeps/sh/sh4/dl-machine.h b/sysdeps/sh/sh4/dl-machine.h
deleted file mode 100644 (file)
index ec9f6f7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#define HAVE_FPU
-#include <sysdeps/sh/dl-machine.h>
diff --git a/sysdeps/sh/sh4/dl-trampoline.S b/sysdeps/sh/sh4/dl-trampoline.S
new file mode 100644 (file)
index 0000000..f952985
--- /dev/null
@@ -0,0 +1,2 @@
+#define HAVE_FPU
+#include <sysdeps/sh/dl-trampoline.S>
index a0b2ebedd2a29f7a8f2d21b4973c23453a7ec3a2..6356aa0d41d1dd4a00bbcfaa209b8f70390d409e 100644 (file)
@@ -42,6 +42,10 @@ static const struct
   { "C", "19990502123412", "%Y%m%d%H%M%S", 0, 121, 4, 2 },
   { "C", "2001 20 Mon", "%Y %U %a", 1, 140, 4, 21 },
   { "C", "2001 21 Mon", "%Y %W %a", 1, 140, 4, 21 },
+  { "ja_JP.EUC-JP", "2000-01-01 08:12:21 AM", "%Y-%m-%d %I:%M:%S %p",
+    6, 0, 0, 1 },
+  { "en_US.ISO-8859-1", "2000-01-01 08:12:21 PM", "%Y-%m-%d %I:%M:%S %p",
+    6, 0, 0, 1 },
   { "ja_JP.EUC-JP", "2001 20 \xb7\xee", "%Y %U %a", 1, 140, 4, 21 },
   { "ja_JP.EUC-JP", "2001 21 \xb7\xee", "%Y %W %a", 1, 140, 4, 21 },
 };
@@ -73,7 +77,14 @@ test_tm (void)
     {
       memset (&tm, '\0', sizeof (tm));
 
-      if (*strptime (tm_tests[i].input, tm_tests[i].format, &tm) != '\0')
+      char *ret = strptime (tm_tests[i].input, tm_tests[i].format, &tm);
+      if (ret == NULL)
+       {
+         printf ("strptime returned NULL for `%s'\n", tm_tests[i].input);
+         result = 1;
+         continue;
+       }
+      else if (*ret != '\0')
        {
          printf ("not all of `%s' read\n", tm_tests[i].input);
          result = 1;
@@ -127,7 +138,14 @@ main (int argc, char *argv[])
          exit (EXIT_FAILURE);
        }
 
-      if (*strptime (day_tests[i].input, day_tests[i].format, &tm) != '\0')
+      char *ret = strptime (day_tests[i].input, day_tests[i].format, &tm);
+      if (ret == NULL)
+       {
+         printf ("strptime returned NULL for `%s'\n", day_tests[i].input);
+         result = 1;
+         continue;
+       }
+      else if (*ret != '\0')
        {
          printf ("not all of `%s' read\n", day_tests[i].input);
          result = 1;