aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-03-25 05:15:51 +0000
committerUlrich Drepper <drepper@redhat.com>2001-03-25 05:15:51 +0000
commit0a45b76c6238f4685c07ba5c5db371ae9b95d661 (patch)
tree2f2102508869d2b1d9d31799f81c65e691904911
parent8c0fe2900498fea31db0d0f3bb2f4f13b8e393ce (diff)
downloadglibc-0a45b76c6238f4685c07ba5c5db371ae9b95d661.zip
glibc-0a45b76c6238f4685c07ba5c5db371ae9b95d661.tar.gz
glibc-0a45b76c6238f4685c07ba5c5db371ae9b95d661.tar.bz2
Update.
2001-03-23 Jes Sorensen <jes@linuxcare.com> * sysdeps/unix/sysv/linux/ia64/sysdep.h (ENTRY): Moved to ... * sysdeps/ia64/sysdep.h: ...here. * sysdeps/ia64/sysdep.h (LOCAL_ENTRY): Define. * sysdeps/ia64/sysdep.h (LOCAL_LEAF): Define. * sysdeps/ia64/_mcount.S (_mcount_ret_helper): Use LOCAL_LEAF() to declare instead of LEAF(). Suggestion from David Mosberger. 2001-03-21 David Mosberger <davidm@hpl.hp.com> * sysdeps/unix/sysv/linux/ia64/sysdep.h (CALL_MCOUNT): Add unwind directives. (PSEUDO): Drop .psr and .lsb directives. * sysdeps/unix/sysv/linux/ia64/setjmp.S: Ditto. Add unwind directives. * sysdeps/unix/sysv/linux/ia64/sysdep.S: Ditto. * sysdeps/ia64/elf/start.S: Misc cleanup: remove .psr and .lsb directives etc. * sysdeps/unix/sysv/linux/ia64/brk.S: Ditto. * sysdeps/unix/sysv/linux/ia64/__longjmp.S: Ditto. * sysdeps/ia64/_mcount.S: Remove .psr and .lsb directives (no longer needed). Add unwind directives. * sysdeps/ia64/sysdep.h: Define ASM_UNW_PRLG_RP, ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_PSP, ASM_UNW_PRLG_PR, and ASM_UNW_PRLG_GRSAVE. 2001-03-21 Paul Eggert <eggert@twinsun.com> * posix/regex.h (RE_INVALID_INTERVAL_ORD): New macro. (RE_SYNTAX_POSIX_EGREP): Use it. * posix/regex.c (regex_compile): Implement it. 2001-03-21 Paul Eggert <eggert@twinsun.com> * posix/regex.c (GET_UNSIGNED_NUMBER): Check for overflow. Rewrite to avoid duplicate code. 2001-03-21 H.J. Lu <hjl@gnu.org> * elf/Makefile (tests): Don't depend on $(objpfx)tst-pathopt.out for cross-compiling. ($(objpfx)tst-pathopt.out): Undo the last change.
-rw-r--r--ChangeLog48
-rw-r--r--posix/regex.c118
-rw-r--r--posix/regex.h8
-rw-r--r--sysdeps/ia64/_mcount.S26
-rw-r--r--sysdeps/ia64/elf/start.S22
-rw-r--r--sysdeps/ia64/sysdep.h28
-rw-r--r--sysdeps/unix/sysv/linux/ia64/__longjmp.S16
-rw-r--r--sysdeps/unix/sysv/linux/ia64/brk.S28
-rw-r--r--sysdeps/unix/sysv/linux/ia64/setjmp.S44
-rw-r--r--sysdeps/unix/sysv/linux/ia64/sysdep.S22
-rw-r--r--sysdeps/unix/sysv/linux/ia64/sysdep.h35
11 files changed, 205 insertions, 190 deletions
diff --git a/ChangeLog b/ChangeLog
index 035472f..f0b51d6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,51 @@
+2001-03-23 Jes Sorensen <jes@linuxcare.com>
+
+ * sysdeps/unix/sysv/linux/ia64/sysdep.h (ENTRY): Moved to ...
+ * sysdeps/ia64/sysdep.h: ...here.
+
+ * sysdeps/ia64/sysdep.h (LOCAL_ENTRY): Define.
+ * sysdeps/ia64/sysdep.h (LOCAL_LEAF): Define.
+
+ * sysdeps/ia64/_mcount.S (_mcount_ret_helper): Use LOCAL_LEAF() to
+ declare instead of LEAF(). Suggestion from David Mosberger.
+
+2001-03-21 David Mosberger <davidm@hpl.hp.com>
+
+ * sysdeps/unix/sysv/linux/ia64/sysdep.h (CALL_MCOUNT): Add unwind
+ directives.
+ (PSEUDO): Drop .psr and .lsb directives.
+
+ * sysdeps/unix/sysv/linux/ia64/setjmp.S: Ditto. Add unwind
+ directives.
+ * sysdeps/unix/sysv/linux/ia64/sysdep.S: Ditto.
+
+ * sysdeps/ia64/elf/start.S: Misc cleanup: remove .psr and .lsb
+ directives etc.
+ * sysdeps/unix/sysv/linux/ia64/brk.S: Ditto.
+ * sysdeps/unix/sysv/linux/ia64/__longjmp.S: Ditto.
+ * sysdeps/ia64/_mcount.S: Remove .psr and .lsb directives (no
+ longer needed). Add unwind directives.
+
+ * sysdeps/ia64/sysdep.h: Define ASM_UNW_PRLG_RP, ASM_UNW_PRLG_PFS,
+ ASM_UNW_PRLG_PSP, ASM_UNW_PRLG_PR, and ASM_UNW_PRLG_GRSAVE.
+
+2001-03-21 Paul Eggert <eggert@twinsun.com>
+
+ * posix/regex.h (RE_INVALID_INTERVAL_ORD): New macro.
+ (RE_SYNTAX_POSIX_EGREP): Use it.
+ * posix/regex.c (regex_compile): Implement it.
+
+2001-03-21 Paul Eggert <eggert@twinsun.com>
+
+ * posix/regex.c (GET_UNSIGNED_NUMBER): Check for overflow.
+ Rewrite to avoid duplicate code.
+
+2001-03-21 H.J. Lu <hjl@gnu.org>
+
+ * elf/Makefile (tests): Don't depend on $(objpfx)tst-pathopt.out
+ for cross-compiling.
+ ($(objpfx)tst-pathopt.out): Undo the last change.
+
2001-03-24 Mark Kettenis <kettenis@gnu.org>
* sysdeps/mach/hurd/i386/bits/sigcontext.h (sc_sp, sc_fp, sc_pc,
diff --git a/posix/regex.c b/posix/regex.c
index fc25bb0..4c90a4f 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -2138,21 +2138,21 @@ typedef struct
/* Get the next unsigned number in the uncompiled pattern. */
-#define GET_UNSIGNED_NUMBER(num) \
- { if (p != pend) \
- { \
- PATFETCH (c); \
- while ('0' <= c && c <= '9') \
- { \
- if (num < 0) \
- num = 0; \
- num = num * 10 + c - '0'; \
- if (p == pend) \
- break; \
- PATFETCH (c); \
- } \
- } \
- }
+#define GET_UNSIGNED_NUMBER(num) \
+ { \
+ while (p != pend) \
+ { \
+ PATFETCH (c); \
+ if (c < '0' || c > '9') \
+ break; \
+ if (num <= RE_DUP_MAX) \
+ { \
+ if (num < 0) \
+ num = 0; \
+ num = num * 10 + c - '0'; \
+ } \
+ } \
+ }
#if defined _LIBC || WIDE_CHAR_SUPPORT
/* The GNU C library provides support for user-defined character classes
@@ -2326,14 +2326,6 @@ regex_compile (pattern, size, syntax, bufp)
/* Address of beginning of regexp, or inside of last group. */
US_CHAR_TYPE *begalt;
- /* Place in the uncompiled pattern (i.e., the {) to
- which to go back if the interval is invalid. */
-#ifdef MBS_SUPPORT
- const US_CHAR_TYPE *beg_interval;
-#else
- const char *beg_interval;
-#endif /* MBS_SUPPORT */
-
/* Address of the place where a forward jump should go to the end of
the containing expression. Each alternative of an `or' -- except the
last -- ends with a forward jump of this sort. */
@@ -3827,25 +3819,19 @@ regex_compile (pattern, size, syntax, bufp)
/* At least (most) this many matches must be made. */
int lower_bound = -1, upper_bound = -1;
- beg_interval = p - 1;
+
+ /* Place in the uncompiled pattern (i.e., just after
+ the '{') to go back to if the interval is invalid. */
+ const CHAR_TYPE *beg_interval = p;
if (p == pend)
- {
- if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
- goto unfetch_interval;
- else
- FREE_STACK_RETURN (REG_EBRACE);
- }
+ goto invalid_interval;
GET_UNSIGNED_NUMBER (lower_bound);
if (c == ',')
{
GET_UNSIGNED_NUMBER (upper_bound);
- if ((!(syntax & RE_NO_BK_BRACES) && c != '\\')
- || ((syntax & RE_NO_BK_BRACES) && c != '}'))
- FREE_STACK_RETURN (REG_BADBR);
-
if (upper_bound < 0)
upper_bound = RE_DUP_MAX;
}
@@ -3853,36 +3839,24 @@ regex_compile (pattern, size, syntax, bufp)
/* Interval such as `{1}' => match exactly once. */
upper_bound = lower_bound;
- if (lower_bound < 0 || upper_bound > RE_DUP_MAX
- || lower_bound > upper_bound)
- {
- if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
- goto unfetch_interval;
- else
- FREE_STACK_RETURN (REG_BADBR);
- }
+ if (! (0 <= lower_bound && lower_bound <= upper_bound))
+ goto invalid_interval;
if (!(syntax & RE_NO_BK_BRACES))
{
- if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
-
+ if (c != '\\' || p == pend)
+ goto invalid_interval;
PATFETCH (c);
}
if (c != '}')
- {
- if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
- goto unfetch_interval;
- else
- FREE_STACK_RETURN (REG_BADBR);
- }
-
- /* We just parsed a valid interval. */
+ goto invalid_interval;
/* If it's invalid to have no preceding re. */
if (!laststart)
{
- if (syntax & RE_CONTEXT_INVALID_OPS)
+ if (syntax & RE_CONTEXT_INVALID_OPS
+ && !(syntax & RE_INVALID_INTERVAL_ORD))
FREE_STACK_RETURN (REG_BADRPT);
else if (syntax & RE_CONTEXT_INDEP_OPS)
laststart = b;
@@ -3890,6 +3864,11 @@ regex_compile (pattern, size, syntax, bufp)
goto unfetch_interval;
}
+ /* We just parsed a valid interval. */
+
+ if (RE_DUP_MAX < upper_bound)
+ FREE_STACK_RETURN (REG_BADBR);
+
/* If the upper bound is zero, don't want to succeed at
all; jump from `laststart' to `b + 3', which will be
the end of the buffer after we insert the jump. */
@@ -3975,25 +3954,20 @@ regex_compile (pattern, size, syntax, bufp)
}
}
pending_exact = 0;
- beg_interval = NULL;
- }
- break;
-
- unfetch_interval:
- /* If an invalid interval, match the characters as literals. */
- assert (beg_interval);
- p = beg_interval;
- beg_interval = NULL;
-
- /* normal_char and normal_backslash need `c'. */
- PATFETCH (c);
-
- if (!(syntax & RE_NO_BK_BRACES))
- {
- if (p > pattern && p[-1] == '\\')
- goto normal_backslash;
- }
- goto normal_char;
+ break;
+
+ invalid_interval:
+ if (!(syntax & RE_INVALID_INTERVAL_ORD))
+ FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR);
+ unfetch_interval:
+ /* Match the characters as literals. */
+ p = beg_interval;
+ c = '{';
+ if (syntax & RE_NO_BK_BRACES)
+ goto normal_char;
+ else
+ goto normal_backslash;
+ }
#ifdef emacs
/* There is no way to specify the before_dot and after_dot
diff --git a/posix/regex.h b/posix/regex.h
index 91a3560..63c2fef 100644
--- a/posix/regex.h
+++ b/posix/regex.h
@@ -160,6 +160,11 @@ typedef unsigned long int reg_syntax_t;
this bit set, and it won't affect anything in the normal case. */
#define RE_DEBUG (RE_NO_GNU_OPS << 1)
+/* If this bit is set, a syntactically invalid interval is treated as
+ a string of ordinary characters. For example, the ERE 'a{1' is
+ treated as 'a\{1'. */
+#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
/* This global variable defines the particular regexp syntax to use (for
some interfaces). When a regexp is compiled, the syntax used is
stored in the pattern buffer, so changing this does not affect
@@ -199,7 +204,8 @@ extern reg_syntax_t re_syntax_options;
| RE_NO_BK_VBAR)
#define RE_SYNTAX_POSIX_EGREP \
- (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \
+ | RE_INVALID_INTERVAL_ORD)
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
diff --git a/sysdeps/ia64/_mcount.S b/sysdeps/ia64/_mcount.S
index 9f27561..e9a627a 100644
--- a/sysdeps/ia64/_mcount.S
+++ b/sysdeps/ia64/_mcount.S
@@ -48,13 +48,11 @@
#undef ret
- .psr abi64
- .psr lsb
- .lsb
-
LEAF(_mcount)
- alloc loc0 = ar.pfs, 4, 4, 3, 0
- mov loc1 = rp
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
+ alloc loc1 = ar.pfs, 4, 4, 3, 0
+ mov loc0 = rp
+ .body
mov loc2 = r8 // gcc uses r8 to pass pointer to return structure
;;
mov loc3 = r15 // gcc uses r15 to pass the static link to nested functions
@@ -67,21 +65,27 @@ LEAF(_mcount)
.mii
mov gp = in1
mov r2 = ip
- mov ar.pfs = loc0
+ mov ar.pfs = loc1
}
;;
- adds r2 = 1f - .here, r2
- mov b7 = loc1
+ adds r2 = _mcount_ret_helper - .here, r2
+ mov b7 = loc0
mov rp = in2
;;
mov r8 = loc2
mov r15 = loc3
mov b6 = r2
br.ret.sptk.few b6
+END(_mcount)
-1: alloc r2 = ar.pfs, 0, 0, 9, 0
+LOCAL_LEAF(_mcount_ret_helper)
+ .prologue
+ .altrp b7
+ .save ar.pfs, r40
+ .body
+ alloc r2 = ar.pfs, 0, 0, 9, 0
mov ar.pfs = r40
br b7
-END(_mcount)
+END(_mcount_ret_helper)
weak_alias (_mcount, mcount)
diff --git a/sysdeps/ia64/elf/start.S b/sysdeps/ia64/elf/start.S
index c09d070..5ba6196 100644
--- a/sysdeps/ia64/elf/start.S
+++ b/sysdeps/ia64/elf/start.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
@@ -31,14 +31,8 @@
* out6: stack_end
*/
- .psr abi64
- .psr lsb
- .lsb
-
- .text
-
- .global _start#
- .proc _start#
+ .global _start
+ .proc _start
_start:
{ .mlx
@@ -59,11 +53,11 @@ _start:
}
{ .mfi
mov ar.fpsr = r3
- addl out0 = @ltoff(@fptr(main#)), gp
+ addl out0 = @ltoff(@fptr(main)), gp
}
{ .mfi
- addl out4 = @ltoff(@fptr(_fini#)), gp
- addl out3 = @ltoff(@fptr(_init#)), gp
+ addl out4 = @ltoff(@fptr(_fini)), gp
+ addl out3 = @ltoff(@fptr(_init)), gp
;;
}
{ .mmi
@@ -74,14 +68,14 @@ _start:
{ .mib
ld8 out4 = [out4] /* pointer to `fini' function descriptor */
mov out5 = ret0 /* dynamic linker destructor */
- br.call.sptk.few rp = __libc_start_main#
+ br.call.sptk.few rp = __libc_start_main
}
{ .mib
mov rp = r0
br.ret.sptk.few rp /* break miserably if we ever return */
;;
}
- .endp _start#
+ .endp _start
/* Define a symbol for the first piece of initialized data. */
.data
diff --git a/sysdeps/ia64/sysdep.h b/sysdeps/ia64/sysdep.h
index aab440d..489cd07 100644
--- a/sysdeps/ia64/sysdep.h
+++ b/sysdeps/ia64/sysdep.h
@@ -21,6 +21,28 @@
#ifdef __ASSEMBLER__
+/* Macros to help writing .prologue directives in assembly code. */
+#define ASM_UNW_PRLG_RP 0x8
+#define ASM_UNW_PRLG_PFS 0x4
+#define ASM_UNW_PRLG_PSP 0x2
+#define ASM_UNW_PRLG_PR 0x1
+#define ASM_UNW_PRLG_GRSAVE(ninputs) (32+(ninputs))
+
+#define ENTRY(name) \
+ .text; \
+ .align 32; \
+ .proc C_SYMBOL_NAME(name); \
+ .global C_SYMBOL_NAME(name); \
+ C_LABEL(name) \
+ CALL_MCOUNT
+
+#define LOCAL_ENTRY(name) \
+ .text; \
+ .align 32; \
+ .proc C_SYMBOL_NAME(name); \
+ C_LABEL(name) \
+ CALL_MCOUNT
+
#define LEAF(name) \
.text; \
.align 32; \
@@ -28,6 +50,12 @@
.global name; \
C_LABEL(name)
+#define LOCAL_LEAF(name) \
+ .text; \
+ .align 32; \
+ .proc C_SYMBOL_NAME(name); \
+ C_LABEL(name)
+
/* Mark the end of function SYM. */
#undef END
#define END(sym) .endp C_SYMBOL_NAME(sym)
diff --git a/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
index 967cab5..956d3c7 100644
--- a/sysdeps/unix/sysv/linux/ia64/__longjmp.S
+++ b/sysdeps/unix/sysv/linux/ia64/__longjmp.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
The GNU C Library is free software; you can redistribute it and/or
@@ -39,16 +39,9 @@
# define pNeg p7 /* is rotate count negative? */
- .psr abi64
- .psr lsb
- .lsb
-
/* __longjmp(__jmp_buf buf, int val) */
- .text
- .align 32
- .global __longjmp
- .proc __longjmp
-__longjmp:
+
+LEAF(__longjmp)
alloc r8=ar.pfs,2,1,0,0
mov r27=ar.rsc
add r2=0x98,in0 // r2 <- &jmpbuf.orig_jmp_buf_addr
@@ -164,5 +157,4 @@ __longjmp:
invala // virt. -> phys. regnum mapping may change
mov pr=r24,-1
ret
- .endp __longjmp
-
+END(__longjmp)
diff --git a/sysdeps/unix/sysv/linux/ia64/brk.S b/sysdeps/unix/sysv/linux/ia64/brk.S
index c483aa6..e54f799 100644
--- a/sysdeps/unix/sysv/linux/ia64/brk.S
+++ b/sysdeps/unix/sysv/linux/ia64/brk.S
@@ -1,5 +1,5 @@
/* brk system call for Linux/ia64
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Stephane Eranian <eranian@hpl.hp.com> and
Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
@@ -19,31 +19,26 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <sysdep.h>
+
#include <asm/unistd.h>
#include <asm/errno.h>
- .text
- .psr abi64
- .psr lsb
- .lsb
.global __curbrk
.data
.align 8
__curbrk:
data8 0
- .weak ___brk_addr
-___brk_addr = __curbrk
- .text
- .align 16
- .global __brk
- .proc __brk
-__brk:
+
+weak_alias (__curbrk, ___brk_addr)
+
+LEAF(__brk)
mov r15=__NR_brk
break.i __BREAK_SYSCALL
;;
cmp.ltu p6,p0=ret0,r32 /* r32 is the input register, even though we
haven't allocated a frame */
- addl r9=@ltoff(__curbrk#),gp
+ addl r9=@ltoff(__curbrk),gp
;;
ld8 r9=[r9]
(p6) mov ret0=ENOMEM
@@ -51,8 +46,7 @@ __brk:
;;
st8 [r9]=ret0
mov ret0=0
- br.ret.sptk.few rp
- .endp __brk
+ ret
+END(__brk)
- .weak brk
-brk = __brk
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/ia64/setjmp.S b/sysdeps/unix/sysv/linux/ia64/setjmp.S
index 63abe0d..1d03cc5 100644
--- a/sysdeps/unix/sysv/linux/ia64/setjmp.S
+++ b/sysdeps/unix/sysv/linux/ia64/setjmp.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,7 +19,7 @@
The layout of the jmp_buf is as follows. This is subject to change
and user-code should never depend on the particular layout of
jmp_buf!
-
+
offset: description:
------- ------------
@@ -67,34 +67,25 @@
#include <sysdep.h>
#include <features.h>
- .text
- .psr abi64
- .psr lsb
- .lsb
-
/* The following two entry points are the traditional entry points: */
- .global setjmp
- .proc setjmp
-setjmp: alloc r8=ar.pfs,2,0,0,0
+LEAF(setjmp)
+ alloc r8=ar.pfs,2,0,0,0
mov in1=1
br.cond.sptk.many __sigsetjmp
- .endp setjmp
+END(setjmp)
- .global _setjmp
- .proc _setjmp
-_setjmp:
+LEAF(_setjmp)
alloc r8=ar.pfs,2,0,0,0
mov in1=0
br.cond.sptk.many __sigsetjmp
- .endp _setjmp
+END(_setjmp)
/* __sigsetjmp(__jmp_buf buf, int savemask) */
- .align 32
- .global __sigsetjmp
- .proc __sigsetjmp
-__sigsetjmp:
- alloc loc0=ar.pfs,2,2,2,0
+
+ENTRY(__sigsetjmp)
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
+ alloc loc1=ar.pfs,2,2,2,0
mov r16=ar.unat
;;
mov r17=ar.fpsr
@@ -114,7 +105,8 @@ __sigsetjmp:
;;
stf.spill.nta [r8]=f2,32
stf.spill.nta [r9]=f3,32
- mov loc1=rp
+ mov loc0=rp
+ .body
;;
stf.spill.nta [r8]=f4,32
stf.spill.nta [r9]=f5,32
@@ -157,7 +149,7 @@ __sigsetjmp:
mov r25=ar.unat
mov out0=in0
- st8.nta [r2]=loc1,16 // b0
+ st8.nta [r2]=loc0,16 // b0
st8.nta [r3]=r17,16 // b1
mov out1=in1
;;
@@ -167,7 +159,7 @@ __sigsetjmp:
st8.nta [r2]=r20,16 // b4
st8.nta [r3]=r21,16 // b5
;;
- st8.nta [r2]=loc0,16 // ar.pfs
+ st8.nta [r2]=loc1,16 // ar.pfs
st8.nta [r3]=r22,16 // ar.lc
;;
st8.nta [r2]=r24,16 // pr
@@ -178,10 +170,10 @@ __sigsetjmp:
br.call.dpnt.few rp=__sigjmp_save
.ret0: // force a new bundle ::q
mov r8=0
- mov rp=loc1
- mov ar.pfs=loc0
+ mov rp=loc0
+ mov ar.pfs=loc1
ret
- .endp __sigsetjmp
+END(__sigsetjmp)
weak_extern(_setjmp)
weak_extern(setjmp)
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.S b/sysdeps/unix/sysv/linux/ia64/sysdep.S
index e327e1f..20122fa 100644
--- a/sysdeps/unix/sysv/linux/ia64/sysdep.S
+++ b/sysdeps/unix/sysv/linux/ia64/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,10 +19,6 @@
#include <sysdep.h>
#include <features.h>
- .psr abi64
- .psr lsb
- .lsb
-
.global errno
.common errno,4,4
.type errno, @object
@@ -34,16 +30,11 @@ __errno = errno
.global _errno
_errno = errno
- .text
-
- .align 8
-
- .global __syscall_error
- .proc __syscall_error
-__syscall_error:
+ENTRY(__syscall_error)
#ifdef _LIBC_REENTRANT
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)
alloc r35=ar.pfs, 0, 4, 0, 0
- mov r32=b0
+ mov r32=rp
mov r33=r8
mov r34=r1
;;
@@ -51,7 +42,7 @@ __syscall_error:
.Lret0: /* force new bundle */
st4 [r8]=r33
mov r1=r34
- mov b0=r32
+ mov rp=r32
mov r8=-1
mov ar.pfs=r35
#else /* _LIBC_REENTRANT */
@@ -71,8 +62,7 @@ __syscall_error:
st4 [r2]=r3
#endif /* _LIBC_REENTRANT */
ret // ret is #define'd in syscall.h!
- .endp __syscall_error
-
+END(__syscall_error)
ENTRY(__ia64_syscall)
mov r15=r37 /* syscall number */
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h
index 5f7f3fe..8e7f74d 100644
--- a/sysdeps/unix/sysv/linux/ia64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h
@@ -36,16 +36,20 @@
#undef CALL_MCOUNT
#ifdef PROF
-# define CALL_MCOUNT \
- .data; \
-1: data8 0; \
- .previous; \
- alloc out0 = ar.pfs, 8, 0, 4, 0; \
- mov out1 = gp; \
- mov out2 = rp; \
- ;; \
- addl out3 = @ltoff(1b), gp; \
- br.call.sptk.many rp = _mcount \
+# define CALL_MCOUNT \
+ .data; \
+1: data8 0; /* XXX fixme: use .xdata8 once labels work */ \
+ .previous; \
+ .prologue; \
+ .save ar.pfs, r40; \
+ alloc out0 = ar.pfs, 8, 0, 4, 0; \
+ mov out1 = gp; \
+ .save rp, out2; \
+ mov out2 = rp; \
+ .body; \
+ ;; \
+ addl out3 = @ltoff(1b), gp; \
+ br.call.sptk.many rp = _mcount \
;;
#else
# define CALL_MCOUNT /* Do nothing. */
@@ -72,17 +76,6 @@
cmp.eq p6,p0=-1,r10;; \
(p6) br.cond.spnt.few __syscall_error;
-#define ENTRY(name) \
- .psr abi64; \
- .psr lsb; \
- .lsb; \
- .text; \
- .align 32; \
- .proc C_SYMBOL_NAME(name); \
- .global C_SYMBOL_NAME(name); \
- C_LABEL(name) \
- CALL_MCOUNT
-
#define DO_CALL(num) \
mov r15=num; \
break __BREAK_SYSCALL;