Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 25 Mar 2001 05:15:51 +0000 (05:15 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 25 Mar 2001 05:15:51 +0000 (05:15 +0000)
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.

ChangeLog
posix/regex.c
posix/regex.h
sysdeps/ia64/_mcount.S
sysdeps/ia64/elf/start.S
sysdeps/ia64/sysdep.h
sysdeps/unix/sysv/linux/ia64/__longjmp.S
sysdeps/unix/sysv/linux/ia64/brk.S
sysdeps/unix/sysv/linux/ia64/setjmp.S
sysdeps/unix/sysv/linux/ia64/sysdep.S
sysdeps/unix/sysv/linux/ia64/sysdep.h

index 035472f..f0b51d6 100644 (file)
--- 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,
index fc25bb0..4c90a4f 100644 (file)
@@ -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
index 91a3560..63c2fef 100644 (file)
@@ -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
index 9f27561..e9a627a 100644 (file)
 
 #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)
index c09d070..5ba6196 100644 (file)
@@ -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.
 
  *     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
index aab440d..489cd07 100644 (file)
 
 #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;                                   \
   .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)
index 967cab5..956d3c7 100644 (file)
@@ -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
 #      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)
index c483aa6..e54f799 100644 (file)
@@ -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.
    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)
index 63abe0d..1d03cc5 100644 (file)
@@ -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:
        ------- ------------
 #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)
index e327e1f..20122fa 100644 (file)
@@ -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
 #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 */
index 5f7f3fe..8e7f74d 100644 (file)
 
 #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. */
        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;