1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>

* string/strnlen.c: New file.
	* string/Makefile (routines): Add strnlen.
	* string/string.h [__USE_GNU] (strnlen): Declare new function.
	[__OPTIMIZE__]: Define extern inline implementation of it.

	* stdlib/erand48_r.c: Use __mpn_construct_double instead of ldexp and
	addition, to avoid using anything from -lm.

Mon Mar  4 21:57:14 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/m68k/Makefile: New file.

	* sysdeps/unix/sysv/linux/m68k/sysdep.h (SYS_ify): Redefine.
	(CALL_MCOUNT): New macro, empty unless [PROF].
	(ENTRY): Do CALL_MCOUNT just after the label.
	(JUMPTARGET): New macro.
	(SYSCALL_ERROR_HANDLER): Fix syntax.

Thu Mar 14 04:20:48 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>

	* sysdeps/unix/sysv/linux/init-first.c (init): Call `__personality'
	function instead of using inline asm i386 syscall.
	* sysdeps/unix/sysv/linux/syscalls.list: Add personality syscall.

	* posix/unistd.h [__USE_BSD]: Declare usleep.

	* misc/efgcvt.c (MAXDIG): New macro computed from <floats.h> constants.
	(fcvt, ecvt): Use it for buffer size.

	* stdlib/drand48-iter.c (__drand48_iterate): Use u_int64_t instead of
	conditionalizing long vs long long.

	* stdlib/drand48-iter.c (__drand48_iterate): Don't check for null
	pointers; never return EFAULT.
	* stdlib/drand48_r.c (drand48_r): Likewise.
	* stdlib/erand48_r.c (erand48_r): Likewise.
This commit is contained in:
Roland McGrath
1996-03-14 11:20:03 +00:00
parent 6c46dada59
commit 52e9a9d118
13 changed files with 152 additions and 333 deletions

View File

@ -1,5 +1,44 @@
Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* string/strnlen.c: New file.
* string/Makefile (routines): Add strnlen.
* string/string.h [__USE_GNU] (strnlen): Declare new function.
[__OPTIMIZE__]: Define extern inline implementation of it.
* stdlib/erand48_r.c: Use __mpn_construct_double instead of ldexp and
addition, to avoid using anything from -lm.
Mon Mar 4 21:57:14 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/m68k/Makefile: New file.
* sysdeps/unix/sysv/linux/m68k/sysdep.h (SYS_ify): Redefine.
(CALL_MCOUNT): New macro, empty unless [PROF].
(ENTRY): Do CALL_MCOUNT just after the label.
(JUMPTARGET): New macro.
(SYSCALL_ERROR_HANDLER): Fix syntax.
Thu Mar 14 04:20:48 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* sysdeps/unix/sysv/linux/init-first.c (init): Call `__personality'
function instead of using inline asm i386 syscall.
* sysdeps/unix/sysv/linux/syscalls.list: Add personality syscall.
* posix/unistd.h [__USE_BSD]: Declare usleep.
Tue Mar 12 04:57:57 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu> Tue Mar 12 04:57:57 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* misc/efgcvt.c (MAXDIG): New macro computed from <floats.h> constants.
(fcvt, ecvt): Use it for buffer size.
* stdlib/drand48-iter.c (__drand48_iterate): Use u_int64_t instead of
conditionalizing long vs long long.
* stdlib/drand48-iter.c (__drand48_iterate): Don't check for null
pointers; never return EFAULT.
* stdlib/drand48_r.c (drand48_r): Likewise.
* stdlib/erand48_r.c (erand48_r): Likewise.
* setjmp/Makefile (tests): Add jmpbug. * setjmp/Makefile (tests): Add jmpbug.
* setjmp/jmpbug.c: New file. * setjmp/jmpbug.c: New file.

5
NEWS
View File

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2 January 1996 GNU C Library NEWS -- history of user-visible changes. 14 March 1996
Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
See the end for copying conditions. See the end for copying conditions.
@ -179,6 +179,9 @@ Version 1.10
* New macro `strdupa' copies a string like `strdup', but uses local stack * New macro `strdupa' copies a string like `strdup', but uses local stack
space from `alloca' instead of dynamic heap space from `malloc'. space from `alloca' instead of dynamic heap space from `malloc'.
* New function `strnlen' is like `strlen' but searches only a given maximum
number of characters for the null terminator.
Version 1.09 Version 1.09

View File

@ -1,5 +1,5 @@
/* [efg]cvt -- compatibility functions for floating point formatting. /* [efg]cvt -- compatibility functions for floating point formatting.
Copyright (C) 1995 Free Software Foundation, Inc. Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,13 +19,16 @@ Cambridge, MA 02139, USA. */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <float.h>
#define MAXDIG (DBL_DIG + DBL_MAX_10_EXP)
char * char *
fcvt (value, ndigit, decpt, sign) fcvt (value, ndigit, decpt, sign)
double value; double value;
int ndigit, *decpt, *sign; int ndigit, *decpt, *sign;
{ {
static char buf[100]; static char buf[MAXDIG];
(void) fcvt_r (value, ndigit, decpt, sign, buf, sizeof buf); (void) fcvt_r (value, ndigit, decpt, sign, buf, sizeof buf);
@ -37,7 +40,7 @@ ecvt (value, ndigit, decpt, sign)
double value; double value;
int ndigit, *decpt, *sign; int ndigit, *decpt, *sign;
{ {
static char buf[100]; static char buf[MAXDIG];
(void) ecvt_r (value, ndigit, decpt, sign, buf, sizeof buf); (void) ecvt_r (value, ndigit, decpt, sign, buf, sizeof buf);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. /* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -180,6 +180,12 @@ extern unsigned int alarm __P ((unsigned int __seconds));
error, but if `sleep' returns SECONDS, it probably didn't work. */ error, but if `sleep' returns SECONDS, it probably didn't work. */
extern unsigned int sleep __P ((unsigned int __seconds)); extern unsigned int sleep __P ((unsigned int __seconds));
#ifdef __USE_BSD
/* Sleep USECONDS microseconds, or until a signal arrives that is not blocked
or ignored. Return value is not necessarily useful. */
extern unsigned int usleep __P ((unsigned __useconds));
#endif
/* Suspend the process until a signal arrives. /* Suspend the process until a signal arrives.
This always returns -1 and sets `errno' to EINTR. */ This always returns -1 and sets `errno' to EINTR. */

View File

@ -10,23 +10,31 @@ sub5 (jmp_buf buf)
longjmp (buf, 1); longjmp (buf, 1);
} }
int void
main (void) test (int x)
{ {
jmp_buf buf; jmp_buf buf;
char *foo; char *foo;
int arr[100]; int arr[100];
arr[77] = 76; arr[77] = x;
if (setjmp (buf)) if (setjmp (buf))
{ {
printf ("made it ok; %d\n", arr[77]); printf ("made it ok; %d\n", arr[77]);
exit (0); return;
} }
foo = (char *) alloca (128); foo = (char *) alloca (128);
sub5 (buf); sub5 (buf);
}
/* NOTREACHED */
return 1; int
main (void)
{
int i;
for (i = 123; i < 345; ++i)
test (i);
return 0;
} }

View File

@ -20,7 +20,7 @@ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h> #include <limits.h>
#include <sys/types.h>
/* Global state for non-reentrent functions. */ /* Global state for non-reentrent functions. */
struct drand48_data __libc_drand48_data; struct drand48_data __libc_drand48_data;
@ -31,12 +31,7 @@ __drand48_iterate (xsubi, buffer)
unsigned short int xsubi[3]; unsigned short int xsubi[3];
struct drand48_data *buffer; struct drand48_data *buffer;
{ {
/* Be generous for the arguments, detect some errors. */ u_int64_t X, a, result;
if (xsubi == NULL || buffer == NULL)
{
errno = EFAULT;
return -1;
}
/* Initialize buffer, if not yet done. */ /* Initialize buffer, if not yet done. */
if (!buffer->init) if (!buffer->init)
@ -58,42 +53,28 @@ __drand48_iterate (xsubi, buffer)
48 bits. Because we compute the modulus it does not care how 48 bits. Because we compute the modulus it does not care how
many bits really are computed. */ many bits really are computed. */
if (sizeof (long int) >= 6) if (sizeof (unsigned short int) == 2)
{ {
/* The `long' data type is sufficent. */ X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0];
unsigned long int X, a, result; a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0];
#define ONE_STEP \ result = X * a + buffer->c;
if (sizeof (unsigned short int) == 2) \
{ \ xsubi[0] = result & 0xffff;
X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0]; \ result >>= 16;
a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0]; \ xsubi[1] = result & 0xffff;
\ result >>= 16;
result = X * a + buffer->c; \ xsubi[2] = result & 0xffff;
\
xsubi[0] = result & 0xffff; \
result >>= 16; \
xsubi[1] = result & 0xffff; \
result >>= 16; \
xsubi[2] = result & 0xffff; \
} \
else \
{ \
X = xsubi[2] << 16 | xsubi[1] >> 16; \
a = buffer->a[2] << 16 | buffer->a[1] >> 16; \
\
result = X * a + buffer->c; \
\
xsubi[0] = result >> 16 & 0xffffffffl; \
xsubi[1] = result << 16 & 0xffff0000l; \
}
ONE_STEP;
} }
else else
{ {
/* We have to use the `long long' data type. */ X = xsubi[2] << 16 | xsubi[1] >> 16;
unsigned long long int X, a, result; a = buffer->a[2] << 16 | buffer->a[1] >> 16;
ONE_STEP;
result = X * a + buffer->c;
xsubi[0] = result >> 16 & 0xffffffffl;
xsubi[1] = result << 16 & 0xffff0000l;
} }
return 0; return 0;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -26,12 +26,5 @@ drand48_r (buffer, result)
struct drand48_data *buffer; struct drand48_data *buffer;
double *result; double *result;
{ {
/* be generous for the arguments, detect some errors. */
if (buffer == NULL)
{
errno = EFAULT;
return -1;
}
return erand48_r (buffer->X, buffer, result); return erand48_r (buffer->X, buffer, result);
} }

View File

@ -17,9 +17,15 @@ 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, not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <math.h>
#include <stdlib.h> #include <stdlib.h>
#include "gmp.h"
#include "gmp-mparam.h"
#include <float.h>
/* Function to construct a floating point number from an MP integer
containing the fraction bits, a base 2 exponent, and a sign flag. */
extern double __mpn_construct_double (mp_srcptr mpn, int exponent, int neg);
int int
erand48_r (xsubi, buffer, result) erand48_r (xsubi, buffer, result)
@ -27,26 +33,30 @@ erand48_r (xsubi, buffer, result)
struct drand48_data *buffer; struct drand48_data *buffer;
double *result; double *result;
{ {
int i; mp_limb mpn[(3 * sizeof (unsigned short int) + sizeof (mp_limb) - 1)
/ sizeof (mp_limb)];
/* Be generous for the arguments, detect some errors. */
if (result == NULL)
{
errno = EFAULT;
return -1;
}
/* Compute next state. */ /* Compute next state. */
if (__drand48_iterate (xsubi, buffer) < 0) if (__drand48_iterate (xsubi, buffer) < 0)
return -1; return -1;
*result = 0.0; /* Build a 48-bit mpn containing the 48 random bits. */
for (i = 4 / sizeof (unsigned short int); i >= 0; --i)
{
double factor = ldexp (1.0, (i - 6) * sizeof (unsigned short int));
*result += factor * (double) xsubi[i]; #if BITS_PER_MP_LIMB == 64
} mpn[0] = (xsubi[0] << 32) | (xsubi[1] << 16) | xsubi[2];
#elif BITS_PER_MP_LIMB == 32
mpn[0] = (xsubi[1] << 16) | xsubi[2];
mpn[1] = xsubi[0];
#else
#error "BITS_PER_MP_LIMB value not handled"
#endif
/* Shift them up so they are most significant bits of the fraction. */
__mpn_lshift (mpn, mpn, sizeof mpn / sizeof mpn[0], DBL_MANT_DIG - 48);
/* Construct a positive double using those bits for the fractional part,
and a zero exponent so the resulting FP number is [0.0,1.0). */
*result = __mpn_construct_double (mpn, 0, 0);
return 0; return 0;
} }

View File

@ -1,76 +0,0 @@
/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
sum in a third limb vector.
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 16)
size (sp + 12)
*/
#include "asm-syntax.h"
TEXT
ALIGN
GLOBL ___mpn_add_n
LAB(___mpn_add_n)
/* Save used registers on the stack. */
INSN2(move,l ,MEM_PREDEC(sp),d2)
INSN2(move,l ,MEM_PREDEC(sp),a2)
/* Copy the arguments to registers. Better use movem? */
INSN2(move,l ,a2,MEM_DISP(sp,12))
INSN2(move,l ,a0,MEM_DISP(sp,16))
INSN2(move,l ,a1,MEM_DISP(sp,20))
INSN2(move,l ,d2,MEM_DISP(sp,24))
INSN2(eor,w ,d2,#1)
INSN2(lsr,l ,d2,#1)
bcc L1
INSN2(subq,l ,d2,#1) /* clears cy as side effect */
LAB(Loop)
INSN2(move,l ,d0,MEM_POSTINC(a0))
INSN2(move,l ,d1,MEM_POSTINC(a1))
INSN2(addx,l ,d0,d1)
INSN2(move,l ,MEM_POSTINC(a2),d0)
LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0))
INSN2(move,l ,d1,MEM_POSTINC(a1))
INSN2(addx,l ,d0,d1)
INSN2(move,l ,MEM_POSTINC(a2),d0)
dbf d2,Loop /* loop until 16 lsb of %4 == -1 */
INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
INSN2(sub,l ,d2,#0x10000)
bcs L2
INSN2(add,l ,d0,d0) /* restore cy */
bra Loop
LAB(L2)
INSN1(neg,l ,d0)
/* Restore used registers from stack frame. */
INSN2(move,l ,a2,MEM_POSTINC(sp))
INSN2(move,l ,d2,MEM_POSTINC(sp))
rts

View File

@ -1,105 +0,0 @@
/* asm.h -- Definitions for 68k syntax variations.
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef MIT_SYNTAX
#define MEM(base)base@
#define MEM_DISP(base,displacement)base@(displacement)
#define MEM_PREDEC(memory_base)memory_base@-
#define MEM_POSTINC(memory_base)memory_base@+
#ifdef __STDC__
#define INSN1(mnemonic,size_suffix,dst)mnemonic##size_suffix dst
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic##size_suffix src,dst
#else
#define INSN1(mnemonic,size_suffix,dst)mnemonic/**/size_suffix dst
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic/**/size_suffix src,dst
#endif
#define LAB(label) label:
#define TEXT .text
#define ALIGN .even
#define GLOBL .globl
#endif
#ifdef SONY_SYNTAX
#define MEM(base)(base)
#define MEM_DISP(base,displacement)(displacement,base)
#define MEM_PREDEC(memory_base)-(memory_base)
#define MEM_POSTINC(memory_base)(memory_base)+
#define INSN1(mnemonic,size_suffix,dst)mnemonic.size_suffix dst
#ifdef __STDC__
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src##,dst
#else
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src/**/,dst
#endif
#define LAB(label) label:
#define TEXT .text
#define ALIGN .even
#define GLOBL .globl
#endif
#ifdef MOTOROLA_SYNTAX
#define MEM(base)(base)
#define MEM_DISP(base,displacement)(displacement,base)
#define MEM_PREDEC(memory_base)-(memory_base)
#define MEM_POSTINC(memory_base)(memory_base)+
#define INSN1(mnemonic,size_suffix,dst)mnemonic.size_suffix dst
#ifdef __STDC__
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src##,dst
#else
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic.size_suffix src/**/,dst
#endif
#define LAB(label) label
#define TEXT
#define ALIGN
#define GLOBL XDEF
#define l L
#define w W
#define move MOVE
#define eor EOR
#define lsr LSR
#define add ADD
#define addx ADDX
#define addq ADDQ
#define sub SUB
#define subx SUBX
#define subq SUBQ
#define neg NEG
#define bcc BCC
#define bcs BCS
#define bra BRA
#define dbf DBF
#define rts RTS
#define d0 D0
#define d1 D1
#define d2 D2
#define d3 D3
#define d4 D4
#define d5 D5
#define d6 D6
#define d7 D7
#define a0 A0
#define a1 A1
#define a2 A2
#define a3 A3
#define a4 A4
#define a5 A5
#define a6 A6
#define a7 A7
#define sp SP
#endif

View File

@ -1,76 +0,0 @@
/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
store difference in a third limb vector.
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/*
INPUT PARAMETERS
res_ptr (sp + 4)
s1_ptr (sp + 8)
s2_ptr (sp + 16)
size (sp + 12)
*/
#include "asm-syntax.h"
TEXT
ALIGN
GLOBL ___mpn_sub_n
LAB(___mpn_sub_n)
/* Save used registers on the stack. */
INSN2(move,l ,MEM_PREDEC(sp),d2)
INSN2(move,l ,MEM_PREDEC(sp),a2)
/* Copy the arguments to registers. Better use movem? */
INSN2(move,l ,a2,MEM_DISP(sp,12))
INSN2(move,l ,a0,MEM_DISP(sp,16))
INSN2(move,l ,a1,MEM_DISP(sp,20))
INSN2(move,l ,d2,MEM_DISP(sp,24))
INSN2(eor,w ,d2,#1)
INSN2(lsr,l ,d2,#1)
bcc L1
INSN2(subq,l ,d2,#1) /* clears cy as side effect */
LAB(Loop)
INSN2(move,l ,d0,MEM_POSTINC(a0))
INSN2(move,l ,d1,MEM_POSTINC(a1))
INSN2(subx,l ,d0,d1)
INSN2(move,l ,MEM_POSTINC(a2),d0)
LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0))
INSN2(move,l ,d1,MEM_POSTINC(a1))
INSN2(subx,l ,d0,d1)
INSN2(move,l ,MEM_POSTINC(a2),d0)
dbf d2,Loop /* loop until 16 lsb of %4 == -1 */
INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
INSN2(sub,l ,d2,#0x10000)
bcs L2
INSN2(add,l ,d0,d0) /* restore cy */
bra Loop
LAB(L2)
INSN1(neg,l ,d0)
/* Restore used registers from stack frame. */
INSN2(move,l ,a2,MEM_POSTINC(sp))
INSN2(move,l ,d2,MEM_POSTINC(sp))
rts

View File

@ -0,0 +1,3 @@
# Linux/m68k uses Motorola asm syntax and the ELF format.
m68k-syntax-flag = -DMOTOROLA_SYNTAX

View File

@ -23,6 +23,17 @@ Cambridge, MA 02139, USA. */
#include <sysdeps/unix/sysdep.h> #include <sysdeps/unix/sysdep.h>
/* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h
of the kernel. But these symbols do not follow the SYS_* syntax
so we have to redefine the `SYS_ify' macro here. */
#undef SYS_ify
#ifdef __STDC__
# define SYS_ify(syscall_name) __NR_##syscall_name
#else
# define SYS_ify(syscall_name) __NR_/**/syscall_name
#endif
#ifdef ASSEMBLER #ifdef ASSEMBLER
#define POUND # #define POUND #
@ -32,7 +43,26 @@ Cambridge, MA 02139, USA. */
.globl name; \ .globl name; \
.type name, @function; \ .type name, @function; \
.align 4; \ .align 4; \
name##: C_LABEL(name) \
CALL_MCOUNT
/* If compiled for profiling, call `_mcount' at the start of each function. */
#ifdef PROF
/* The mcount code relies on a normal frame pointer being on the stack
to locate our caller, so push one just for its benefit. */
#define CALL_MCOUNT \
move.l %fp, -(%sp); move.l %sp, %fp; \
jbsr JUMPTARGET (_mcount); \
move.l (%sp)+, %fp;
#else
#define CALL_MCOUNT /* Do nothing. */
#endif
#ifdef PIC
#define JUMPTARGET(name) name##@PLTPC
#else
#define JUMPTARGET(name) name
#endif
/* Since C identifiers are not normally prefixed with an underscore /* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the on this system, the asm identifier `syscall_error' intrudes on the
@ -53,7 +83,7 @@ Cambridge, MA 02139, USA. */
/* Store (- %d0) into errno through the GOT. */ /* Store (- %d0) into errno through the GOT. */
#define SYSCALL_ERROR_HANDLER \ #define SYSCALL_ERROR_HANDLER \
syscall_error: \ syscall_error: \
move.l (errno@GOTPC.l, %pc), %a0; \ move.l (errno@GOTPC, %pc), %a0; \
neg.l %d0; \ neg.l %d0; \
move.l %d0, (%a0); \ move.l %d0, (%a0); \
move.l POUND -1, %d0; \ move.l POUND -1, %d0; \