This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
>>>>> On Wed, 19 Nov 2003 15:54:49 -0800, Roland McGrath <roland@redhat.com> said:
>> Just write your own pt-initfini file for ia64. The requirement
>> is that the code up to the __pthread_initialize_minimal functions
>> depends on nothing but basic ld.so functionality.
Roland> Remind me what happens wrong if the normal constructor
Roland> mechanism is used in libpthread.
The problem is that the final function is constructed only at
link-time, so the assembler cannot emit the proper
function-length-information needed for the unwind-info.
>>>>> On Wed, 19 Nov 2003 15:30:44 -0800, Ulrich Drepper <drepper@redhat.com> said:
Uli> Just write your own pt-initfini file for ia64. The requirement
Uli> is that the code up to the __pthread_initialize_minimal
Uli> functions depends on nothing but basic ld.so functionality.
Ah, in fact there is already an ia64-specific version. I missed it at
first. Turns out the problem really was worse: not only was it using
.init, but the unwind directives for both _init and _fini were
missing! With the proper unwind info for _init and _fini, the old
code was lucky enough to work fine, but I still think it's better to
switch to .init_array both for cleanliness and consistency reasons.
LinuxThreads had the same problem. Patch to fix both is attached.
Please apply.
Thanks,
--david
linuxthreads/ChangeLog
2003-11-19 David Mosberger <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/pt-initfini.c (INIT_NEW_WAY): New
macro.
(INIT_OLD_WAY): Likewise. Define these macros depending on
whether or not HAVE_INITFINI_ARRAY is defined. If it is, use
.init_array to invoke __pthread_initialize_minimal_internal.
Also, add proper unwind-directives for _init and _fini.
nptl/ChangeLog
2003-11-19 David Mosberger <davidm@hpl.hp.com>
* sysdeps/unix/sysv/linux/ia64/pt-initfini.c (INIT_NEW_WAY): New
macro.
(INIT_OLD_WAY): Likewise. Define these macros depending on
whether or not HAVE_INITFINI_ARRAY is defined. If it is, use
.init_array to invoke __pthread_initialize_minimal_internal.
Also, add proper unwind-directives for _init and _fini.
Index: linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
===================================================================
RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c,v
retrieving revision 1.5
diff -u -r1.5 pt-initfini.c
--- linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c 14 Nov 2002 10:49:22 -0000 1.5
+++ linuxthreads/sysdeps/unix/sysv/linux/ia64/pt-initfini.c 20 Nov 2003 00:24:14 -0000
@@ -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,34 +36,51 @@
* 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_internal)\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_internal# ;;\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\
@@ -83,12 +100,16 @@
.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\
Index: nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c,v
retrieving revision 1.1
diff -u -r1.1 pt-initfini.c
--- nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c 11 Mar 2003 09:20:41 -0000 1.1
+++ nptl/sysdeps/unix/sysv/linux/ia64/pt-initfini.c 20 Nov 2003 00:24:15 -0000
@@ -36,34 +36,51 @@
* 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_internal)\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_internal# ;;\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_internal# ;;\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\
@@ -83,12 +100,16 @@
.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\
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |