mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
* 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.
This commit is contained in:
parent
8bf139c95b
commit
537e7234f7
31
ChangeLog
31
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.
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 *);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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 */
|
||||
|
431
sysdeps/sh/dl-trampoline.S
Normal file
431
sysdeps/sh/dl-trampoline.S
Normal file
@ -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
|
5
sysdeps/sh/sh4/Versions
Normal file
5
sysdeps/sh/sh4/Versions
Normal file
@ -0,0 +1,5 @@
|
||||
ld {
|
||||
GLIBC_PRIVATE {
|
||||
__fpscr_values;
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
#define HAVE_FPU
|
||||
#include <sysdeps/sh/dl-machine.h>
|
2
sysdeps/sh/sh4/dl-trampoline.S
Normal file
2
sysdeps/sh/sh4/dl-trampoline.S
Normal file
@ -0,0 +1,2 @@
|
||||
#define HAVE_FPU
|
||||
#include <sysdeps/sh/dl-trampoline.S>
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user