mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Update.
2001-04-09 Ulrich Drepper <drepper@redhat.com> * libio/Makefile (distribute): Add fd_to_filename.h.
This commit is contained in:
parent
c44a663dca
commit
1dc843f70a
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
1
sysdeps/cris/Dist
Normal file
@ -0,0 +1 @@
|
||||
_mcount.S
|
3
sysdeps/cris/Implies
Normal file
3
sysdeps/cris/Implies
Normal file
@ -0,0 +1,3 @@
|
||||
wordsize-32
|
||||
ieee754/flt-32
|
||||
ieee754/dbl-64
|
44
sysdeps/cris/Makefile
Normal file
44
sysdeps/cris/Makefile
Normal 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
38
sysdeps/cris/__longjmp.S
Normal 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
36
sysdeps/cris/_mcount.S
Normal 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)
|
7
sysdeps/cris/bits/endian.h
Normal file
7
sysdeps/cris/bits/endian.h
Normal 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
|
54
sysdeps/cris/bits/setjmp.h
Normal file
54
sysdeps/cris/bits/setjmp.h
Normal 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])
|
26
sysdeps/cris/bits/string.h
Normal file
26
sysdeps/cris/bits/string.h
Normal 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
392
sysdeps/cris/dl-machine.h
Normal 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
123
sysdeps/cris/elf/start.S
Normal 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
|
28
sysdeps/cris/machine-gmon.h
Normal file
28
sysdeps/cris/machine-gmon.h
Normal 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
57
sysdeps/cris/memcopy.h
Normal 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
27
sysdeps/cris/memusage.h
Normal 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
66
sysdeps/cris/setjmp.S
Normal 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
114
sysdeps/cris/sysdep.h
Normal 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
1
sysdeps/cris/wordcopy.c
Normal file
@ -0,0 +1 @@
|
||||
/* Empty; not needed. */
|
Loading…
Reference in New Issue
Block a user