2001-04-09  Ulrich Drepper  <drepper@redhat.com>

	* libio/Makefile (distribute): Add fd_to_filename.h.
This commit is contained in:
Ulrich Drepper 2001-04-10 03:10:20 +00:00
parent c44a663dca
commit 1dc843f70a
19 changed files with 1045 additions and 45 deletions

View File

@ -1,3 +1,7 @@
2001-04-09 Ulrich Drepper <drepper@redhat.com>
* libio/Makefile (distribute): Add fd_to_filename.h.
2001-04-05 David S. Miller <davem@redhat.com>
Add hp-timing support for sparcv9/sparc64 targets.

View File

@ -93,7 +93,8 @@ shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops \
oldiofgetpos oldiofgetpos64 oldiofsetpos \
oldiofsetpos64
distribute := iolibio.h libioP.h strfile.h Banner test-freopen.sh
distribute := iolibio.h libioP.h strfile.h Banner test-freopen.sh \
fd_to_filename.h
include ../Rules

View File

@ -812,16 +812,14 @@ otherwise the character @var{wc} is returned.
@comment POSIX
@deftypefun int fputc_unlocked (int @var{c}, FILE *@var{stream})
The @code{fputc_unlocked} function is equivalent to the @code{fputc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment POSIX
@deftypefun wint_t fputwc_unlocked (wint_t @var{wc}, FILE *@var{stream})
The @code{fputwc_unlocked} function is equivalent to the @code{fputwc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -850,16 +848,14 @@ use for writing a single wide character.
@comment POSIX
@deftypefun int putc_unlocked (int @var{c}, FILE *@var{stream})
The @code{putc_unlocked} function is equivalent to the @code{putc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment GNU
@deftypefun wint_t putwc_unlocked (wchar_t @var{wc}, FILE *@var{stream})
The @code{putwc_unlocked} function is equivalent to the @code{putwc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -882,16 +878,14 @@ The @code{putwchar} function is equivalent to @code{putwc} with
@comment POSIX
@deftypefun int putchar_unlocked (int @var{c})
The @code{putchar_unlocked} function is equivalent to the @code{putchar}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment GNU
@deftypefun wint_t putwchar_unlocked (wchar_t @var{wc})
The @code{putwchar_unlocked} function is equivalent to the @code{putwchar}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -935,8 +929,7 @@ a non-negative value.
@comment GNU
@deftypefun int fputs_unlocked (const char *@var{s}, FILE *@var{stream})
The @code{fputs_unlocked} function is equivalent to the @code{fputs}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -945,8 +938,7 @@ This function is a GNU extension.
@comment GNU
@deftypefun int fputws_unlocked (const wchar_t *@var{ws}, FILE *@var{stream})
The @code{fputws_unlocked} function is equivalent to the @code{fputws}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1023,16 +1015,14 @@ occurs, @code{WEOF} is returned instead.
@comment POSIX
@deftypefun int fgetc_unlocked (FILE *@var{stream})
The @code{fgetc_unlocked} function is equivalent to the @code{fgetc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment GNU
@deftypefun wint_t fgetwc_unlocked (FILE *@var{stream})
The @code{fgetwc_unlocked} function is equivalent to the @code{fgetwc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1060,16 +1050,14 @@ best function to use to read a single wide character.
@comment POSIX
@deftypefun int getc_unlocked (FILE *@var{stream})
The @code{getc_unlocked} function is equivalent to the @code{getc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment GNU
@deftypefun wint_t getwc_unlocked (FILE *@var{stream})
The @code{getwc_unlocked} function is equivalent to the @code{getwc}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1092,16 +1080,14 @@ as the value of the @var{stream} argument.
@comment POSIX
@deftypefun int getchar_unlocked (void)
The @code{getchar_unlocked} function is equivalent to the @code{getchar}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
@comment wchar.h
@comment GNU
@deftypefun wint_t getwchar_unlocked (void)
The @code{getwchar_unlocked} function is equivalent to the @code{getwchar}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1278,8 +1264,7 @@ message.
@comment GNU
@deftypefun {char *} fgets_unlocked (char *@var{s}, int @var{count}, FILE *@var{stream})
The @code{fgets_unlocked} function is equivalent to the @code{fgets}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1288,8 +1273,7 @@ This function is a GNU extension.
@comment GNU
@deftypefun {wchar_t *} fgetws_unlocked (wchar_t *@var{ws}, int @var{count}, FILE *@var{stream})
The @code{fgetws_unlocked} function is equivalent to the @code{fgetws}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1497,8 +1481,7 @@ object. Therefore, the stream remains at the actual end of the file.
@comment GNU
@deftypefun size_t fread_unlocked (void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream})
The @code{fread_unlocked} function is equivalent to the @code{fread}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -1516,8 +1499,7 @@ some sort of error, such as running out of space.
@comment GNU
@deftypefun size_t fwrite_unlocked (const void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream})
The @code{fwrite_unlocked} function is equivalent to the @code{fwrite}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -3966,8 +3948,7 @@ This symbol is declared in @file{stdio.h}.
@comment GNU
@deftypefun int feof_unlocked (FILE *@var{stream})
The @code{feof_unlocked} function is equivalent to the @code{feof}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@ -3988,8 +3969,7 @@ This symbol is declared in @file{stdio.h}.
@comment GNU
@deftypefun int ferror_unlocked (FILE *@var{stream})
The @code{ferror_unlocked} function is equivalent to the @code{ferror}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@ -4026,8 +4006,7 @@ end-of-file indicator for the stream.
@comment GNU
@deftypefun void clearerr_unlocked (FILE *@var{stream})
The @code{clearerr_unlocked} function is equivalent to the @code{clearerr}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
This function is a GNU extension.
@end deftypefun
@ -4564,8 +4543,7 @@ otherwise.
@comment POSIX
@deftypefun int fflush_unlocked (FILE *@var{stream})
The @code{fflush_unlocked} function is equivalent to the @code{fflush}
function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}.
function except that it does not implicitly lock the stream.
@end deftypefun
The @code{fflush} function can be used to flush all streams currently

1
sysdeps/cris/Dist Normal file
View File

@ -0,0 +1 @@
_mcount.S

3
sysdeps/cris/Implies Normal file
View File

@ -0,0 +1,3 @@
wordsize-32
ieee754/flt-32
ieee754/dbl-64

44
sysdeps/cris/Makefile Normal file
View File

@ -0,0 +1,44 @@
# Copyright (C) 1999, 2000, 2001 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 Library General Public License
# as published by the Free Software Foundation; either version 2 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
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
# License along with the GNU C Library; see the file COPYING.LIB. If not,
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# We don't support long doubles as a distinct type. We don't need to set
# this variable; it's here mostly for documentational purposes.
long-double-fcts = no
# FIXME: Note that this is a machine-specific stub; profiling is not
# implemented.
ifeq ($(subdir),gmon)
sysdep_routines += _mcount
endif
# FIXME: This test seems generally bogus. Wrong types in function calls
# and assumes FE_TONEAREST is defined. Does it work somewhere?
# Presumably it does, so let's settle for filtering it out target-wise
# until it's agreed what should be done.
ifeq ($(subdir),math)
tests := $(filter-out test-fenv, $(tests))
endif
# PIC code must be assembled with special options, passed on by gcc when
# given the -fpic option.
ASFLAGS-.os = -fpic
# Overflow occurs at 2**15/4 (8192) symbols. Glibc uses about 2000.
# So use -fpic: smaller-size relocs; smaller, faster code.
pic-ccflag = -fpic

38
sysdeps/cris/__longjmp.S Normal file
View File

@ -0,0 +1,38 @@
/* longjmp for CRIS.
Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _SETJMP_H
#define _ASM
#include <bits/setjmp.h>
.syntax no_register_prefix
/* Saving and restoring CCR is meaningless, so we don't do it. */
ENTRY (__longjmp)
/* Note that r10 = jmp_buf, r11 = retval. */
move [r10+16*4],srp
test.d r11
beq 0f /* Already a 1 in place. */
nop
/* Offset for r9, the return value (see setjmp). */
move.d r11,[r10+6*4]
0:
movem [r10],pc
END (__longjmp)

36
sysdeps/cris/_mcount.S Normal file
View File

@ -0,0 +1,36 @@
/* Machine-specific calling sequence for `mcount' profiling function for CRIS.
Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* FIXME: This isn't implemented yet. This is just a machine-specific
stub. Perhaps a real implementation can make use of it. */
#include <sysdep.h>
#undef CALL_MCOUNT
#define CALL_MCOUNT
ENTRY (_mcount)
SETUP_PIC
/* Sorry, isn't implemented yet.
Can't call abort; that will recurse. Force SEGV instead. */
test.d [99]
1:
ba 1b
nop
END (_mcount)

View File

@ -0,0 +1,7 @@
/* CRIS is little-endian. */
#ifndef _ENDIAN_H
# error "Never use <bits/endian.h> directly; include <endian.h> instead."
#endif
#define __BYTE_ORDER __LITTLE_ENDIAN

View File

@ -0,0 +1,54 @@
/* 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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Define the machine-dependent type `jmp_buf', CRIS version. */
/* Note that saving and restoring CCR has no meaning in user mode, so we
don't actually do it; the slot is now reserved.
jmp_buf[0] - PC
jmp_buf[1] - SP (R14)
jmp_buf[2] - R13
jmp_buf[3] - R12
jmp_buf[4] - R11
jmp_buf[5] - R10
jmp_buf[6] - R9
jmp_buf[7] - R8
jmp_buf[8] - R7
jmp_buf[9] - R6
jmp_buf[10] - R5
jmp_buf[11] - R4
jmp_buf[12] - R3
jmp_buf[13] - R2
jmp_buf[14] - R1
jmp_buf[15] - R0
jmp_buf[16] - SRP
jmp_buf[17] - CCR */
#ifndef _ASM
typedef unsigned long int __jmp_buf[18];
#endif
#if defined (__USE_MISC) || defined (_ASM)
#define JB_SP 1
#endif
/* Test if longjmp to JMPBUF would unwind the frame
containing a local variable at ADDRESS. */
#define _JMPBUF_UNWINDS(jmpbuf, address) \
((unsigned long int) (address) < (jmpbuf)[JB_SP])

View File

@ -0,0 +1,26 @@
/* Optimized, inlined string functions. CRIS version.
Copyright (C) 1997, 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _STRING_H
# error "Never use <bits/string.h> directly; include <string.h> instead."
#endif
/* Currently the only purpose of this file is to tell the generic inline
macros that unaligned memory access is possible. */
#define _STRING_ARCH_unaligned 1

392
sysdeps/cris/dl-machine.h Normal file
View File

@ -0,0 +1,392 @@
/* Machine-dependent ELF dynamic relocation inline functions. CRIS version.
Copyright (C) 1996,1997,1998,1999,2000,2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef dl_machine_h
#define dl_machine_h
#define ELF_MACHINE_NAME "CRIS"
#include <sys/param.h>
#ifdef __PIC__
# define CALL_FN(x) \
"move.d $pc,$r9\n\t" \
"add.d " #x " - .,$r9\n\t" \
"jsr $r9"
#else
# define CALL_FN(x) "jsr " #x
#endif
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int
elf_machine_matches_host (const Elf32_Ehdr *ehdr)
{
return ehdr->e_machine == EM_CRIS;
}
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
first element of the GOT. This must be inlined in a function which
uses global data. */
static inline Elf32_Addr
elf_machine_dynamic (void)
{
/* Don't just set this to an asm variable "r0" since that's not logical
(like, the variable is uninitialized and the register is fixed) and
may make GCC trip over itself doing register allocation. Yes, I'm
paranoid. Why do you ask? */
Elf32_Addr *got;
__asm__ ("move.d $r0,%0" : "=rm" (got));
return *got;
}
/* Return the run-time load address of the shared object. We do it like
m68k and i386, by taking an arbitrary local symbol, forcing a GOT entry
for it, and peeking into the GOT table, which is set to the link-time
file-relative symbol value (regardless of whether the target is REL or
RELA). We subtract this link-time file-relative value from the "local"
value we calculate from GOT position and GOT offset. FIXME: Perhaps
there's some other symbol we could use, that we don't *have* to force a
GOT entry for. */
static inline Elf32_Addr
elf_machine_load_address (void)
{
Elf32_Addr gotaddr_diff;
__asm__ ("sub.d [$r0+_dl_start:GOT16],$r0,%0\n\t"
"add.d _dl_start:GOTOFF,%0" : "=r" (gotaddr_diff));
return gotaddr_diff;
}
/* Set up the loaded object described by L so its unrelocated PLT
entries will jump to the on-demand fixup code in dl-runtime.c. */
static inline int
elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
{
Elf32_Addr *got;
extern void _dl_runtime_resolve (Elf32_Word);
extern void _dl_runtime_profile (Elf32_Word);
if (l->l_info[DT_JMPREL] && lazy)
{
/* The GOT entries for functions in the PLT have not yet been
filled in. Their initial contents will arrange when called
to push an offset into the .rela.plt section, push
_GLOBAL_OFFSET_TABLE_[1], and then jump to
_GLOBAL_OFFSET_TABLE_[2]. */
got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
got[1] = (Elf32_Addr) l; /* Identify this shared object. */
/* The got[2] entry contains the address of a function which gets
called to get the address of a so far unresolved function and
jump to it. The profiling extension of the dynamic linker allows
to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also
end in this function. */
if (__builtin_expect (profile, 0))
{
got[2] = (Elf32_Addr) &_dl_runtime_profile;
if (_dl_name_match_p (_dl_profile, l))
{
/* This is the object we are looking for. Say that we really
want profiling and the timers are started. */
_dl_profile_map = l;
}
}
else
/* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */
got[2] = (Elf32_Addr) &_dl_runtime_resolve;
}
return lazy;
}
/* This code is used in dl-runtime.c to call the `fixup' function
and then redirect to the address it returns.
We get here with the offset into the relocation table pushed on stack,
and the link map in MOF. */
#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \
"; Trampoline for " #fixup_name "
.globl " #tramp_name "
.type " #tramp_name ", @function
" #tramp_name ":
push $r13
push $r12
push $r11
push $r10
push $r9
push $srp
move.d [$sp+6*4],$r11
move $mof,$r10
" CALL_FN (fixup_name) "
move.d $r10,[$sp+6*4]
pop $srp
pop $r9
pop $r10
pop $r11
pop $r12
pop $r13
jump [$sp+]
.size " #tramp_name ", . - " #tramp_name "\n"
#ifndef PROF
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \
TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup));
#else
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \
".globl _dl_runtime_profile\n" \
".set _dl_runtime_profile, _dl_runtime_resolve");
#endif
/* Mask identifying addresses reserved for the user program,
where the dynamic linker should not map anything. */
#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL
/* Initial entry point code for the dynamic linker.
The C function `_dl_start' is the real entry point;
its return value is the user program's entry point. */
#define RTLD_START asm ("\
.text
.globl _start
.type _start,@function
_start:
move.d $sp,$r10
" CALL_FN (_dl_start) "
/* FALLTHRU */
.globl _dl_start_user
.type _dl_start_user,@function
_dl_start_user:
; Save the user entry point address in R1.
move.d $r10,$r1
; Point R0 at the GOT.
move.d $pc,$r0
sub.d .:GOTOFF,$r0
; Remember the highest stack address.
move.d [$r0+__libc_stack_end:GOT16],$r13
move.d $sp,[$r13]
; See if we were run as a command with the executable file
; name as an extra leading argument.
move.d [$r0+_dl_skip_args:GOT16],$r13
move.d [$r13],$r9
; Get the original argument count
move.d [$sp],$r11
; Subtract _dl_skip_args from it.
sub.d $r9,$r11
; Adjust the stack pointer to skip _dl_skip_args words.
addi $r9.d,$sp
; Put the new argc in place as expected by the user entry.
move.d $r11,[$sp]
; Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
; env: skip scaled argc and skip stored argc and NULL at end of argv[].
move.d $sp,$r13
addi $r11.d,$r13
addq 8,$r13
; argv: skip stored argc.
move.d $sp,$r12
addq 4,$r12
; main_map: at _dl_loaded.
move.d [$r0+_dl_loaded:GOT16],$r9
move.d [$r9],$r10
move.d _dl_init:PLTG,$r9
add.d $r0,$r9
jsr $r9
; Pass our finalizer function to the user in R10.
move.d [$r0+_dl_fini:GOT16],$r10
; Terminate the frame-pointer.
moveq 0,$r8
; Cause SEGV if user entry returns.
move $r8,$srp
; Jump to the user's entry point.
jump $r1
.size _dl_start_user, . - _dl_start_user
.previous");
/* Nonzero iff TYPE describes a relocation that should
skip the executable when looking up the symbol value. */
#define elf_machine_lookup_noexec_p(type) ((type) == R_CRIS_COPY)
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
#define elf_machine_lookup_noplt_p(type) ((type) == R_CRIS_JUMP_SLOT)
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_CRIS_JUMP_SLOT
/* CRIS never uses Elf32_Rel relocations. */
#define ELF_MACHINE_NO_REL 1
/* We define an initialization functions. This is called very early in
_dl_sysdep_start. */
#define DL_PLATFORM_INIT dl_platform_init ()
extern const char *_dl_platform;
static inline void __attribute__ ((unused))
dl_platform_init (void)
{
if (_dl_platform != NULL && *_dl_platform == '\0')
/* Avoid an empty string which would disturb us. */
_dl_platform = NULL;
}
static inline Elf32_Addr
elf_machine_fixup_plt (struct link_map *map, lookup_t t,
const Elf32_Rela *reloc,
Elf32_Addr *reloc_addr, Elf32_Addr value)
{
return *reloc_addr = value;
}
/* Return the final value of a plt relocation. */
static inline Elf32_Addr
elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
Elf32_Addr value)
{
return value + reloc->r_addend;
}
#endif /* !dl_machine_h */
#ifdef RESOLVE
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
static inline void
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
const Elf32_Sym *sym, const struct r_found_version *version,
Elf32_Addr *const reloc_addr)
{
#ifndef RTLD_BOOTSTRAP
/* This is defined in rtld.c, but nowhere in the static libc.a; make the
reference weak so static programs can still link. This declaration
cannot be done when compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP)
because rtld.c contains the common defn for _dl_rtld_map, which is
incompatible with a weak decl in the same file. */
weak_extern (_dl_rtld_map);
#endif
if (ELF32_R_TYPE (reloc->r_info) == R_CRIS_RELATIVE)
{
#ifndef RTLD_BOOTSTRAP
if (map != &_dl_rtld_map) /* Already done in rtld itself. */
#endif
*reloc_addr = map->l_addr + reloc->r_addend;
}
else
{
#ifndef RTLD_BOOTSTRAP
const Elf32_Sym *const refsym = sym;
#endif
Elf32_Addr value;
if (sym->st_shndx != SHN_UNDEF &&
ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
value = map->l_addr;
else
{
value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
if (sym)
value += sym->st_value;
}
value += reloc->r_addend; /* Assume copy relocs have zero addend. */
switch (ELF32_R_TYPE (reloc->r_info))
{
#ifndef RTLD_BOOTSTRAP
case R_CRIS_COPY:
if (sym == NULL)
/* This can happen in trace mode if an object could not be
found. */
break;
if (sym->st_size > refsym->st_size
|| (_dl_verbose && sym->st_size < refsym->st_size))
{
extern char **_dl_argv;
const char *strtab;
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
_dl_error_printf ("\
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
_dl_argv[0] ?: "<program name unknown>",
strtab + refsym->st_name);
}
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
refsym->st_size));
break;
case R_CRIS_32:
#endif
case R_CRIS_GLOB_DAT:
case R_CRIS_JUMP_SLOT:
*reloc_addr = value;
break;
#ifndef RTLD_BOOTSTRAP
case R_CRIS_8:
*(char *) reloc_addr = value;
break;
case R_CRIS_16:
*(short *) reloc_addr = value;
break;
case R_CRIS_8_PCREL:
*(char *) reloc_addr
= value + reloc->r_addend - (Elf32_Addr) reloc_addr - 1;
break;
case R_CRIS_16_PCREL:
*(short *) reloc_addr
= value + reloc->r_addend - (Elf32_Addr) reloc_addr - 2;
break;
case R_CRIS_32_PCREL:
*reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 4;
break;
#endif
case R_CRIS_NONE:
break;
#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
default:
_dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break;
#endif
}
}
}
static inline void
elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rela *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
if (__builtin_expect (ELF32_R_TYPE (reloc->r_info), R_CRIS_JUMP_SLOT)
== R_CRIS_JUMP_SLOT)
*reloc_addr += l_addr;
else
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
}
#endif /* RESOLVE */

123
sysdeps/cris/elf/start.S Normal file
View File

@ -0,0 +1,123 @@
/* Startup code compliant to the ELF CRIS ABI (to-be-written).
Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
/* This is the canonical entry point, usually the first thing in the text
segment. When the entry point runs, most registers' values are
unspecified, except for:
R10 Contains a function pointer to be registered with `atexit'.
This is how the dynamic linker arranges to have DT_FINI
functions called for shared libraries that have been loaded
before this code runs.
SP The stack contains the arguments and environment:
[SP] argc
[SP+4] argv[0]
...
[SP+4*argc] NULL
[SP+4*(argc+1)] envp[0]
...
NULL
*/
.syntax no_register_prefix
.text
.globl _start
_start:
/* Clear the frame pointer, to mark the outermost frame. */
moveq 0,r8
/* Move the shared library termination function to the right place
for __libc_main. */
move.d r10,r9
/* Extract the arguments as encoded on the stack and set up the
arguments for `main': argc, argv. envp will be determined
later in __libc_start_main. */
/* Get the argument count. */
move.d [sp],r11
/* Store the stack pointer as end of stack. We overwrite
the incoming argc. */
move.d sp,[sp]
/* The argument vector starts just after the argument count. */
move.d sp,r12
addq 4,r12
/* There are seven arguments to __libc_start_main:
r10: main - Address of it.
r11: argc
r12: argv
r13: init - Function to call.
[sp]: fini - Function to register with atexit.
[sp+4]: rtld_fini - Another function to register with atexit.
[sp+8]: stack_end - Top of stack (actually same as argv).
The last two are passed on stack. */
/* Store the fini function coming from the dynamic loader. */
push r9
/* Get the addresses of our own entry points to `.fini' and
`.init'. */
#ifdef __PIC__
/* If for some reason this program is compiled as PIC, set up R0. */
move.d pc,r0
sub.d .:GOTOFF,r0
move.d _init:PLTG,r13
add.d r0,r13
move.d _fini:PLTG,r9
add.d r0,r9
move.d main:PLTG,r10
add.d r0,r10
#else
move.d _init,r13
move.d _fini,r9
move.d main,r10
#endif
push r9
/* Call the user's main function, and exit with its value. But
let the libc call main. */
PLTCALL (__libc_start_main)
/* Crash if somehow `exit' does return. We have at least 8192
invalid addresses to choose from. */
test.d [6502]
/* Stop the unstoppable. */
0:
ba 0b
nop
/* Define a symbol for the first piece of initialized data. */
.data
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start

View File

@ -0,0 +1,28 @@
/* PowerPC-specific implementation of profiling support.
Copyright (C) 1997, 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
void __mcount_internal (unsigned long frompc, unsigned long selfpc);
#define _MCOUNT_DECL(frompc, selfpc) \
void __mcount_internal (unsigned long frompc, unsigned long selfpc)
/* Define MCOUNT as empty since we have the implementation in another
file. FIXME: Just stubs, currently. */
#define MCOUNT

57
sysdeps/cris/memcopy.h Normal file
View File

@ -0,0 +1,57 @@
/* Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdeps/generic/memcopy.h>
/* We override the word-copying macros, partly because misalignment in one
pointer isn't cause for a special function, partly because we want to
get rid of wordcopy.c; these macros are only used in memmove.c (and
it's sibling bcopy) since we have arch-specific mempcpy, memcpy and
memset. */
#undef OP_T_THRES
#define OP_T_THRES OPSIZ
#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \
do \
{ \
unsigned long enddst_bp = dst_bp + nbytes - (nbytes % OPSIZ); \
nbytes_left = (nbytes % OPSIZ); \
while (dst_bp < (unsigned long) enddst_bp) \
{ \
op_t x = *(op_t *) src_bp; \
src_bp += sizeof x; \
*(op_t *) dst_bp = x; \
dst_bp += sizeof x; \
} \
} while (0)
#define WORD_COPY_BWD(dst_bp, src_bp, nbytes_left, nbytes) \
do \
{ \
unsigned long enddst_bp = dst_bp - nbytes + (nbytes % OPSIZ); \
nbytes_left = (nbytes % OPSIZ); \
while (dst_bp > enddst_bp) \
{ \
op_t x; \
src_bp -= sizeof x; \
x = *(op_t *) src_bp; \
dst_bp -= sizeof x; \
*(op_t *) dst_bp = x; \
} \
} while (0)

27
sysdeps/cris/memusage.h Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* No asm variables, just for reasons of solid healthy paranoia. */
#define GETSP() \
({ \
uintptr_t stack_ptr; \
__asm__ ("move.d $sp,%0" : "=rm" (stack_ptr)); \
stack_ptr; \
})
#include <sysdeps/generic/memusage.h>

66
sysdeps/cris/setjmp.S Normal file
View File

@ -0,0 +1,66 @@
/* setjmp for CRIS.
Copyright (C) 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _SETJMP_H
#define _ASM
#include <bits/setjmp.h>
.syntax no_register_prefix
ENTRY (__sigsetjmp)
.Local__sigsetjmp:
moveq 1,r9
movem sp,[r10+1*4]
#ifdef __PIC__
move.d pc,r9
addq 0f-.,r9
#else
move.d 0f,r9
#endif
move.d r9,[r10]
move srp,[r10+16*4]
move ccr,[r10+17*4]
PLTJUMP (__sigjmp_save)
0: /* This is where longjmp returns. (Don't use "ret" - it's a macro. */
Ret
move.d r9,r10
END (__sigsetjmp)
/* Binary compatibility entry points. Having these in separate files
is not meaningful and just adds library overhead. */
ENTRY (__setjmp)
ba .Local__sigsetjmp
moveq 0,r11
END (__setjmp)
ENTRY (_setjmp)
ba .Local__sigsetjmp
moveq 0,r11
END (_setjmp)
ENTRY (setjmp)
ba .Local__sigsetjmp
moveq 1,r11
END (setjmp)
weak_extern (__setjmp)
weak_extern (_setjmp)
weak_extern (setjmp)

114
sysdeps/cris/sysdep.h Normal file
View File

@ -0,0 +1,114 @@
/* Assembler macros for CRIS.
Copyright (C) 1999, 2000, 2001 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdeps/generic/sysdep.h>
#ifndef HAVE_ELF
# error ELF is assumed. Generalize the code and retry.
#endif
#ifndef NO_UNDERSCORES
# error User-label prefix (underscore) assumed absent. Generalize the code and retry.
#endif
#ifdef __ASSEMBLER__
/* Syntactic details of assembly-code. */
/* It is *not* generally true that "ELF uses byte-counts for .align, most
others use log2 of count of bytes", like some neighboring configs say.
See "align" in gas/read.c which is not overridden by
gas/config/obj-elf.c. It takes a log2 argument. *Some* targets
override it to take a byte argument. People should read source instead
of relying on hearsay. */
# define ALIGNARG(log2) log2
# define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
/* The non-PIC jump is preferred, since it does not stall, and does not
invoke generation of a PLT. These macros assume that $r0 is set up as
GOT register. */
# ifdef __PIC__
# define PLTJUMP(_x) \
add.d C_SYMBOL_NAME (_x):PLT,$pc
# define PLTCALL(_x) \
move.d C_SYMBOL_NAME (_x):PLTG,$r9 @ \
add.d $r0,$r9 @ \
jsr $r9
# define SETUP_PIC \
push $r0 @ \
move.d $pc,$r0 @ \
sub.d .:GOTOFF,$r0
# define TEARDOWN_PIC pop $r0
# else
# define PLTJUMP(_x) jump C_SYMBOL_NAME (_x)
# define PLTCALL(_x) jsr C_SYMBOL_NAME (_x)
# define SETUP_PIC
# define TEARDOWN_PIC
# endif
/* Define an entry point visible from C. */
# define ENTRY(name) \
.text @ \
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) @ \
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function) @ \
.align ALIGNARG (2) @ \
C_LABEL(name) @ \
CALL_MCOUNT
# undef END
# define END(name) \
ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name))
/* If compiled for profiling, call `mcount' at the start of each function.
FIXME: Note that profiling is not actually implemented. This is just
example code which might not even compile, though it is believed to be
correct. */
# ifdef PROF
# define CALL_MCOUNT \
push $srp @ \
push $r9 @ \
push $r10 @ \
push $r11 @ \
push $r12 @ \
push $r13 @ \
SETUP_PIC @ \
PLTCALL (mcount) @ \
TEARDOWN_PIC @ \
pop $r13 @ \
pop $r12 @ \
pop $r11 @ \
pop $r10 @ \
pop $r9 @ \
pop $srp
# else
# define CALL_MCOUNT /* Do nothing. */
# endif
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
# define syscall_error __syscall_error
# define mcount _mcount
#endif /* __ASSEMBLER__ */

1
sysdeps/cris/wordcopy.c Normal file
View File

@ -0,0 +1 @@
/* Empty; not needed. */