aboutsummaryrefslogtreecommitdiff
path: root/linuxthreads
diff options
context:
space:
mode:
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog15
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c66
2 files changed, 64 insertions, 17 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 964256f..296c56f 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,18 @@
+2003-12-10 David Mosberger <davidm@hpl.hp.com>
+
+ * sysdeps/unix/sysv/linux/ia64/pt-initfini.c: Update copyright
+ message. Add include of <stddef.h>.
+ (INIT_NEW_WAY): New macro.
+ (INIT_OLD_WAY): Likewise.
+ (_init): Add unwind directives. Invoke
+ __pthread_initialize_minimal() via INIT_NEW_WAY or INIT_OLD_WAY,
+ respectively.
+ (_init_EPILOG_BEGINS): Add unwind-directives. Drop unused .regstk
+ directive.
+ (_fini): Add unwind directives. Drop unnecessary .align 16
+ directive (bundles are always 16-byte aligned).
+ (_fini_EPILOG_BEGINS): Add unwind-directives.
+
2003-11-19 David Mosberger <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/dl-sysdep.h: New file.
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
index 04d577d..85fd33f 100644
--- a/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
+++ b/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
@@ -1,5 +1,5 @@
/* Special .init and .fini section support for ia64. LinuxThreads version.
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it
@@ -36,40 +36,62 @@
* crtn.s puts the corresponding function epilogues
in the .init and .fini sections. */
+#include <stddef.h>
+
+#ifdef HAVE_INITFINI_ARRAY
+
+# define INIT_NEW_WAY \
+ ".xdata8 \".init_array\", @fptr(__pthread_initialize_minimal)\n"
+# define INIT_OLD_WAY ""
+#else
+# define INIT_NEW_WAY ""
+# define INIT_OLD_WAY \
+ "\n\
+ st8 [r12] = gp, -16\n\
+ br.call.sptk.many b0 = __pthread_initialize_minimal# ;;\n\
+ ;;\n\
+ adds r12 = 16, r12\n\
+ ;;\n\
+ ld8 gp = [r12]\n\
+ ;;\n"
+#endif
+
__asm__ ("\n\
\n\
#include \"defs.h\"\n\
\n\
/*@HEADER_ENDS*/\n\
\n\
-/*@_init_PROLOG_BEGINS*/\n\
- .section .init\n\
+/*@_init_PROLOG_BEGINS*/\n"
+ INIT_NEW_WAY
+ ".section .init\n\
.align 16\n\
.global _init#\n\
.proc _init#\n\
_init:\n\
+ .prologue\n\
+ .save ar.pfs, r34\n\
alloc r34 = ar.pfs, 0, 3, 0, 0\n\
+ .vframe r32\n\
mov r32 = r12\n\
+ .save rp, r33\n\
mov r33 = b0\n\
+ .body\n\
adds r12 = -16, r12\n\
- ;;\n\
-/* we could use r35 to save gp, but we use the stack since that's what\n\
- * all the other init routines will do --davidm 00/04/05 */\n\
- st8 [r12] = gp, -16\n\
- br.call.sptk.many b0 = __pthread_initialize_minimal# ;;\n\
- ;;\n\
- adds r12 = 16, r12\n\
- ;;\n\
- ld8 gp = [r12]\n\
- ;;\n\
- .align 16\n\
- .endp _init#\n\
+ ;;\n"
+ INIT_OLD_WAY
+ ".endp _init#\n\
\n\
/*@_init_PROLOG_ENDS*/\n\
\n\
/*@_init_EPILOG_BEGINS*/\n\
.section .init\n\
- .regstk 0,2,0,0\n\
+ .proc _init#\n\
+ .prologue\n\
+ .save ar.pfs, r34\n\
+ .vframe r32\n\
+ .save rp, r33\n\
+ .body\n\
mov r12 = r32\n\
mov ar.pfs = r34\n\
mov b0 = r33\n\
@@ -83,18 +105,28 @@ _init:\n\
.global _fini#\n\
.proc _fini#\n\
_fini:\n\
+ .prologue\n\
+ .save ar.pfs, r34\n\
alloc r34 = ar.pfs, 0, 3, 0, 0\n\
+ .vframe r32\n\
mov r32 = r12\n\
+ .save rp, r33\n\
mov r33 = b0\n\
+ .body\n\
adds r12 = -16, r12\n\
;;\n\
- .align 16\n\
.endp _fini#\n\
\n\
/*@_fini_PROLOG_ENDS*/\n\
\n\
/*@_fini_EPILOG_BEGINS*/\n\
.section .fini\n\
+ .proc _fini#\n\
+ .prologue\n\
+ .save ar.pfs, r34\n\
+ .vframe r32\n\
+ .save rp, r33\n\
+ .body\n\
mov r12 = r32\n\
mov ar.pfs = r34\n\
mov b0 = r33\n\