* [Linux-ia64] IP-relative calls in start.S and initfini.c
@ 2000-05-02 21:36 Omar Stradella
2000-05-02 22:00 ` Jim Wilson
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Omar Stradella @ 2000-05-02 21:36 UTC (permalink / raw)
To: linux-ia64
I'm trying to build a large program but the executable coredumps in
_start. The reason is that _start (start.S) calls __libc_start_main using
a IP-relative call instruction. libc is inserted after all the object
files at an address that is more than 16MB away from the call instruction.
Same happens in _init (initfini.c). Could be possible to load the address
in a register and do an indirect call instead ?
Thanks,
Omar.
+---------------------------------------------------------------------+
Omar G. Stradella, Ph.D.
SGI / Chemistry and Biology Applications Group
1 Cabot Rd, Suite 250, Hudson, MA 01749, USA N 42 22'40" W 71 33'44"
E-mail: omar@sgi.com Phone: +1-781-839-2258 FAX: +1-978-562-7450
http://www.sgi.com/chembio http://reality.sgi.com/omar
+-------- Ph-nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn -------+
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella @ 2000-05-02 22:00 ` Jim Wilson 2000-05-02 22:20 ` Omar Stradella ` (7 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Jim Wilson @ 2000-05-02 22:00 UTC (permalink / raw) To: linux-ia64 There is an optional patch in the list archives that adds support to the linker for handling out of range calls. At the moment, it requires that the user manually specify -Wl,-relax. You might try using that option to see if your toolchain already has the patch applied. If not, then you can patch your toolchain, rebuild it, and this problem should go away. Eventually we will have better support for large programs. That may include changing some of the start up code to avoid some of the problems that you are seeing. Jim ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella 2000-05-02 22:00 ` Jim Wilson @ 2000-05-02 22:20 ` Omar Stradella 2000-05-02 22:25 ` Jim Wilson ` (6 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Omar Stradella @ 2000-05-02 22:20 UTC (permalink / raw) To: linux-ia64 On Tue, 2 May 2000, Jim Wilson wrote: > There is an optional patch in the list archives that adds support to the > linker for handling out of range calls. At the moment, it requires that the > user manually specify -Wl,-relax. You might try using that option to see if > your toolchain already has the patch applied. If not, then you can patch > your toolchain, rebuild it, and this problem should go away. > > Eventually we will have better support for large programs. That may include > changing some of the start up code to avoid some of the problems that you are > seeing. Jim, Thanks, that seems to work. Except that the kernel that I'm running (2.3.99-pre5-000424-17) doesn't seem to support the brl instruction yet. Omar. +---------------------------------------------------------------------+ Omar G. Stradella, Ph.D. SGI / Chemistry and Biology Applications Group 1 Cabot Rd, Suite 250, Hudson, MA 01749, USA N 42 22'40" W 71 33'44" E-mail: omar@sgi.com Phone: +1-781-839-2258 FAX: +1-978-562-7450 http://www.sgi.com/chembio http://reality.sgi.com/omar +-------- Ph-nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn -------+ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella 2000-05-02 22:00 ` Jim Wilson 2000-05-02 22:20 ` Omar Stradella @ 2000-05-02 22:25 ` Jim Wilson 2000-05-11 18:24 ` Omar Stradella ` (5 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Jim Wilson @ 2000-05-02 22:25 UTC (permalink / raw) To: linux-ia64 Thanks, that seems to work. Except that the kernel that I'm running (2.3.99-pre5-000424-17) doesn't seem to support the brl instruction yet. Sorry, I forgot to mention that part. The architecture manual requires that the kernel emulate the brl instruction on Itaniums, which do not implement brl in hardware. I believe that this kernel support is still being worked on. So the current state is that you can link your application, but you can't run it. Hopefully within a few weeks you should be able to run it also. Jim ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (2 preceding siblings ...) 2000-05-02 22:25 ` Jim Wilson @ 2000-05-11 18:24 ` Omar Stradella 2000-05-12 2:50 ` Jim Wilson ` (4 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Omar Stradella @ 2000-05-11 18:24 UTC (permalink / raw) To: linux-ia64 OK. So, I linked my application with -Wl,-relax (using gnupro-2.9-000501p2) and run it on the new kernel (2.3.99-pre6-000501-19smp). Now it goes past the _libc_main call but it gets a SEGV in __do_global_ctors_aux (same a reported in message with subject "ld failure"): Program received signal SIGSEGV, Segmentation fault. 0x400000000158eb50 in __do_global_ctors_aux () (gdb) bt #0 0x400000000158eb50 in __do_global_ctors_aux () #1 0x4000000000001c20 in _init () (gdb) x/4i 0x400000000158eb40 0x400000000158eb40 <__do_global_ctors_aux>: [MII] alloc r34=ar.pfs,4,4,0 0x400000000158eb41 <__do_global_ctors_aux+1>: addl r32B40,r1 0x400000000158eb42 <__do_global_ctors_aux+2>: cmp.eq p0,p6=r0,r0;; 0x400000000158eb50 <__do_global_ctors_aux+16>: [MFI] ld8 r32=[r32] (gdb) p/x $r1 $2 = 0x0 it looks like the gp got corrupted. Omar. +---------------------------------------------------------------------+ Omar G. Stradella, Ph.D. SGI / Chemistry and Biology Applications Group 1 Cabot Rd, Suite 250, Hudson, MA 01749, USA N 42 22'40" W 71 33'37" E-mail: omar@sgi.com Phone: +1-781-839-2258 FAX: +1-978-562-7450 http://www.sgi.com/chembio http://reality.sgi.com/omar +-------- Ph-nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn -------+ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (3 preceding siblings ...) 2000-05-11 18:24 ` Omar Stradella @ 2000-05-12 2:50 ` Jim Wilson 2000-05-15 17:57 ` Omar Stradella ` (3 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Jim Wilson @ 2000-05-12 2:50 UTC (permalink / raw) To: linux-ia64 I wrote a simple program that generates a very large program with out of range calls, compiled it with -Wl,-relax, and looked at the code. It looks fine. The out-of-range call gets redirected to a stub at the end of the function that does a brl with absolute address to the target function. I don't see how this can corrupt the gp. Maybe it is a kernel problem with the emulation? Have you tried debugging the code to see where the gp gets corrupted? Try stepping over the brl instruction to see if the kernel is clobbering gp. I don't have a kernel with brl emulation support yet, so I can not try this myself. Alternatively, there could be something different about your testcase that causes the linker relaxation to fail. I might be obvious if you look at the code you are getting. Jim ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (4 preceding siblings ...) 2000-05-12 2:50 ` Jim Wilson @ 2000-05-15 17:57 ` Omar Stradella 2000-05-17 20:17 ` Jim Wilson ` (2 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: Omar Stradella @ 2000-05-15 17:57 UTC (permalink / raw) To: linux-ia64 On Thu, 11 May 2000, Jim Wilson wrote: > I wrote a simple program that generates a very large program with out of range > calls, compiled it with -Wl,-relax, and looked at the code. It looks fine. > The out-of-range call gets redirected to a stub at the end of the function > that does a brl with absolute address to the target function. I don't see > how this can corrupt the gp. > > Maybe it is a kernel problem with the emulation? Have you tried debugging the > code to see where the gp gets corrupted? Try stepping over the brl instruction > to see if the kernel is clobbering gp. I don't have a kernel with brl > emulation support yet, so I can not try this myself. > > Alternatively, there could be something different about your testcase that > causes the linker relaxation to fail. I might be obvious if you look at the > code you are getting. OK. This is a disassembly of the part of _init where __do_global_ctors_aux is called in my program (created with -relax): 4000000000001c00: 0b 60 40 18 00 21 [MMI] adds r12\x16,r12;; 4000000000001c06: 10 00 30 30 20 00 ld8 r1=[r12] 4000000000001c0c: 00 00 04 00 nop.i 0x0;; 4000000000001c10: 1d 80 07 18 99 17 [MFB] st8 [r12]=r1,-16 4000000000001c16: 00 00 00 02 00 00 nop.f 0x0 4000000000001c1c: 28 00 00 50 br.call.sptk.many b0@00000000001c30 <_init+0xa0>;; 4000000000001c20: 0b 60 40 18 00 21 [MMI] adds r12\x16,r12;; 4000000000001c26: 10 00 30 30 20 00 ld8 r1=[r12] 4000000000001c2c: 00 00 04 00 nop.i 0x0;; 4000000000001c30: 05 00 00 00 01 00 [MLX] nop.m 0x0 4000000000001c36: 01 00 00 00 00 00 brl 400000000158eb40 <__do_global_ctors_aux>;; 4000000000001c3c: 10 cf 58 c0 4000000000001c40: 00 60 00 40 00 21 [MII] mov r12=r32 4000000000001c46: 00 10 01 55 00 00 mov.i ar.pfs=r34 4000000000001c4c: 10 0a 00 07 mov b0=r33 4000000000001c50: 11 00 00 00 01 00 [MIB] nop.m 0x0 4000000000001c56: 00 00 00 02 00 80 nop.i 0x0 4000000000001c5c: 08 00 84 00 br.ret.sptk.many b0;; Notice at 1c1c the branch to the brl instruction at 1c30. In contrast this is the disassembly of the same part for a small program: 40000000000019f0: 0b 60 40 18 00 21 [MMI] adds r12\x16,r12;; 40000000000019f6: 10 00 30 30 20 00 ld8 r1=[r12] 40000000000019fc: 00 00 04 00 nop.i 0x0;; 4000000000001a00: 1d 80 07 18 99 17 [MFB] st8 [r12]=r1,-16 4000000000001a06: 00 00 00 02 00 00 nop.f 0x0 4000000000001a0c: e8 05 13 50 br.call.sptk.many b0@00000000131fe0 <__do_global_ctors_aux>;; 4000000000001a10: 0b 60 40 18 00 21 [MMI] adds r12\x16,r12;; 4000000000001a16: 10 00 30 30 20 00 ld8 r1=[r12] 4000000000001a1c: 00 00 04 00 nop.i 0x0;; 4000000000001a20: 00 60 00 40 00 21 [MII] mov r12=r32 4000000000001a26: 00 10 01 55 00 00 mov.i ar.pfs=r34 4000000000001a2c: 10 0a 00 07 mov b0=r33 4000000000001a30: 11 00 00 00 01 00 [MIB] nop.m 0x0 4000000000001a36: 00 00 00 02 00 80 nop.i 0x0 4000000000001a3c: 08 00 84 00 br.ret.sptk.many b0;; Following the execution of my program under gbd one can see: 1) the branch to 1c30 in _init 2) the brl branch to __do_global_ctors_aux 3) entering __do_global_ctors_aux at 158eb40 4) exiting __do_global_ctors_aux 5) next instruction is at 1c20 6) it keeps going, reaching the brl instruction at 1c30 again !! 7) it gets a SEGV in __do_global_ctors_aux after a few instructions The second time that enters __do_global_ctors_aux, r1 is zero. Shouldn't the brl be out of the way so it doesn't get executed two times ? The program was linked using gcc from gnupro-2.9-000501p2 and run under the 2.3.99-pre6-000501-20smp kernel. Omar +---------------------------------------------------------------------+ Omar G. Stradella, Ph.D. SGI / Chemistry and Biology Applications Group 1 Cabot Rd, Suite 250, Hudson, MA 01749, USA N 42 22'40" W 71 33'37" E-mail: omar@sgi.com Phone: +1-781-839-2258 FAX: +1-978-562-7450 http://www.sgi.com/chembio http://reality.sgi.com/omar +-------- Ph-nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn -------+ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (5 preceding siblings ...) 2000-05-15 17:57 ` Omar Stradella @ 2000-05-17 20:17 ` Jim Wilson 2000-05-17 22:28 ` Omar Stradella 2000-05-20 3:15 ` Uros Prestor 8 siblings, 0 replies; 10+ messages in thread From: Jim Wilson @ 2000-05-17 20:17 UTC (permalink / raw) To: linux-ia64 Richard Henderson has written a gcc patch that I think will fix this problem. The problem here is that we build the init/fini sections by concatening code fragments together, and this does not work if the linker inserts a brl thunk between two code fragments. So Richard rewrote the init/fini code so that we shouldn't get any out-of-range calls in these sections. This is a patch for the current FSF gcc sources. I don't know if this will work with the older February branch (ia64-000216) that you have. Also, this probably hasn't been well tested yet. Return-Path: rth@cygnus.com Received: from castro.cygnus.com (castro.cygnus.com [205.180.230.121]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id SAA17162; Tue, 16 May 2000 18:52:03 -0700 (PDT) Received: (rth@localhost) by castro.cygnus.com (8.9.3/8.6.4) id SAA14025; Tue, 16 May 2000 18:52:03 -0700 Date: Tue, 16 May 2000 18:52:03 -0700 From: Richard Henderson <rth@cygnus.com> To: gcc-patches@gcc.gnu.org Cc: Jim Wilson <wilson@cygnus.com> Subject: ia64 crtbegin/end changes Message-ID: <20000516185203.A14018@cygnus.com> Mime-Version: 1.0 X-Mailer: Mutt 1.0pre3us Content-Type: text/plain; charset=us-ascii Content-Length: 11447 The primary purpose of the patch is to make sure that we never have an out of range branch in the .init/.fini fragements, since the thunks that the linker would inject would break the flow of the composite function. r~ * config/ia64/crtbegin.asm (__dso_handle): Mark hidden if the assembler supports it. (.fini, .init): Use a gp-relative indirect call. (__do_global_dtors_aux): Preserve the gp; rebundle. (__do_frame_setup): Likewise. * config/ia64/crtend.asm (.IA_64.unwind): Don't terminate with -1. (.init): Use a gp-relative indirect call. (__do_global_ctors_aux): Preserve the gp. Index: config/ia64/crtbegin.asm =================================RCS file: /cvs/gcc/egcs/gcc/config/ia64/crtbegin.asm,v retrieving revision 1.2 diff -c -p -d -r1.2 crtbegin.asm *** crtbegin.asm 2000/04/25 23:16:20 1.2 --- crtbegin.asm 2000/05/17 01:45:28 *************** __DTOR_LIST__: *** 30,58 **** __EH_FRAME_BEGIN__: .section .sdata - 5: data8 @segrel(6f) .type dtor_ptr#,@object .size dtor_ptr#,8 dtor_ptr: data8 __DTOR_LIST__# + 8 ! /* A handle for __cxa_finalize to manage c++ local destructors. */ .global __dso_handle# .type __dso_handle#,@object .size __dso_handle#,8 #ifdef SHARED ! .section .data __dso_handle: data8 __dso_handle# #else ! .section .bss __dso_handle: data8 0 #endif ! ! /* The frame object. */ ! /* ??? How can we rationally keep this size correct? */ .section .bss .type frame_object#,@object .size frame_object#,56 --- 30,64 ---- __EH_FRAME_BEGIN__: .section .sdata .type dtor_ptr#,@object .size dtor_ptr#,8 dtor_ptr: data8 __DTOR_LIST__# + 8 ! .type segrel_ofs#,@object ! .size segrel_ofs#,8 ! segrel_ofs: ! data8 @segrel(.Lsegrel_ref#) ! ! /* A handle for __cxa_finalize to manage c++ local destructors. */ .global __dso_handle# .type __dso_handle#,@object .size __dso_handle#,8 #ifdef SHARED ! .section .data __dso_handle: data8 __dso_handle# #else ! .section .bss __dso_handle: data8 0 #endif ! #ifdef HAVE_GAS_HIDDEN ! .hidden __dso_handle# ! #endif + /* The frame object. */ + /* ??? How can we rationally keep this size correct? */ .section .bss .type frame_object#,@object .size frame_object#,56 *************** frame_object: *** 63,82 **** /* * Fragment of the ELF _fini routine that invokes our dtor cleanup. * ! * The code going into .fini is spread all over the place, thus we need ! * to save gp in order to make sure that other bits don't get into any ! * nasty surprises by expecting a gp that has suddenly changed. */ .section .fini,"ax","progbits" ! { .mfb ! st8 [r12] = gp, -16 ! br.call.sptk.many b0 = __do_global_dtors_aux# ;; } ! { .mmi ! adds r12 = 16, r12 ;; ! ld8 gp = [r12] ;; } --- 69,97 ---- /* * Fragment of the ELF _fini routine that invokes our dtor cleanup. * ! * We make the call by indirection, because in large programs the ! * .fini and .init sections are not in range of the destination, and ! * we cannot allow the linker to insert a stub at the end of this ! * fragment of the _fini function. Further, Itanium does not implement ! * the long branch instructions, and we do not wish every program to ! * trap to the kernel for emulation. ! * ! * Note that we require __do_global_dtors_aux to preserve the GP, ! * so that the next fragment in .fini gets the right value. */ .section .fini,"ax","progbits" ! { .mlx ! movl r2 = @gprel(__do_global_dtors_aux#) ;; } ! { .mii ! nop.m 0 ! add r2 = r2, gp ;; ! mov b6 = r2 ! } ! { .bbb ! br.call.sptk.many b0 = b6 ;; } *************** frame_object: *** 85,99 **** */ .section .init,"ax","progbits" ! { .mfb ! st8 [r12] = gp, -16 ! br.call.sptk.many b0 = __do_frame_setup# ;; } ! { .mmi ! adds r12 = 16, r12 ;; ! ld8 gp = [r12] ;; } --- 100,117 ---- */ .section .init,"ax","progbits" ! { .mlx ! movl r2 = @gprel(__do_frame_setup#) ;; } ! { .mii ! nop.m 0 ! add r2 = r2, gp ;; ! mov b6 = r2 ! } ! { .bbb ! br.call.sptk.many b0 = b6 ;; } *************** __do_global_dtors_aux: *** 107,113 **** addl loc0 = @gprel(dtor_ptr#), gp mov loc1 = b0 } ! mov loc2 = gp #else /* if (__cxa_finalize) --- 125,135 ---- addl loc0 = @gprel(dtor_ptr#), gp mov loc1 = b0 } ! { .mib ! mov loc2 = gp ! br.sptk.few 1f ! ;; ! } #else /* if (__cxa_finalize) *************** __do_global_dtors_aux: *** 119,125 **** addl r16 = @ltoff(@fptr(__cxa_finalize#)), gp ;; } - mov loc2 = gp { .mmi ld8 r16 = [r16] ;; --- 141,146 ---- *************** __do_global_dtors_aux: *** 133,143 **** mov loc1 = b0 ;; } ! { .mib ! (p7) ld8 gp = [r16] (p7) mov b6 = r18 (p7) br.call.sptk.many b0 = b6 } #endif /* do { --- 154,171 ---- mov loc1 = b0 ;; } ! { .mfi ! mov loc2 = gp (p7) mov b6 = r18 + } + { + .mfb + (p7) ld8 gp = [r16] (p7) br.call.sptk.many b0 = b6 } + { .mfb + br.sptk.few 1f + } #endif /* do { *************** __do_global_dtors_aux: *** 145,154 **** (*(dtor_ptr-1)) (); } while (dtor_ptr); */ - { .bbb - br.sptk.few 1f - ;; - } 0: { .mmi st8 [loc0] = r15 --- 173,178 ---- *************** __do_global_dtors_aux: *** 171,183 **** cmp.ne p6, p0 = r0, r16 (p6) br.cond.sptk.few 0b } - mov gp = loc2 - ;; /* if (__deregister_frame_info) __deregister_frame_info(__EH_FRAME_BEGIN__) */ ! { .mii addl r16 = @ltoff(@fptr(__deregister_frame_info#)), gp addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp ;; --- 195,207 ---- cmp.ne p6, p0 = r0, r16 (p6) br.cond.sptk.few 0b } /* if (__deregister_frame_info) __deregister_frame_info(__EH_FRAME_BEGIN__) */ ! { .mmi ! mov gp = loc2 ! ;; addl r16 = @ltoff(@fptr(__deregister_frame_info#)), gp addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp ;; *************** __do_global_dtors_aux: *** 199,204 **** --- 223,229 ---- (p7) br.call.sptk.many b0 = b6 } { .mii + mov gp = loc2 mov b0 = loc1 mov ar.pfs = loc3 } *************** __do_frame_setup: *** 215,259 **** __register_frame_info(__EH_FRAME_BEGIN__) */ { .mii ! alloc loc3 = ar.pfs, 0, 4, 2, 0 addl r16 = @ltoff(@fptr(__register_frame_info#)), gp addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp - ;; } - addl out1 = @ltoff(frame_object#), gp - ;; /* frame_object.pc_base = segment_base_offset; ! pc_base is at offset 0 within frame_object. */ ! 6: ! mov loc0 = ip ! addl loc1 = @gprel(5b), gp ! ;; ! ld8 loc1 = [loc1] ! ld8 out1 = [out1] ! ;; ! sub loc2 = loc0, loc1 ! ;; ! st8 [out1] = loc2 { .mmi ld8 r16 = [r16] - ld8 out0 = [out0] mov loc0 = b0 ;; } ! { .mmi cmp.ne p7, p0 = r0, r16 ;; (p7) ld8 r18 = [r16], 8 ;; } { .mib (p7) ld8 gp = [r16] (p7) mov b6 = r18 (p7) br.call.sptk.many b0 = b6 } { .mii mov b0 = loc0 ! mov ar.pfs = loc3 } { .bbb br.ret.sptk.many b0 --- 240,289 ---- __register_frame_info(__EH_FRAME_BEGIN__) */ { .mii ! alloc loc2 = ar.pfs, 0, 3, 2, 0 addl r16 = @ltoff(@fptr(__register_frame_info#)), gp addl out0 = @ltoff(__EH_FRAME_BEGIN__#), gp } /* frame_object.pc_base = segment_base_offset; ! pc_base is at offset 0 within frame_object. */ ! .Lsegrel_ref: ! { .mmi ! addl out1 = @ltoff(frame_object#), gp ! ;; ! addl r2 = @gprel(segrel_ofs#), gp ! mov r3 = ip ! ;; ! } { .mmi + ld8 r2 = [r2] ld8 r16 = [r16] mov loc0 = b0 ;; } ! { .mii ! ld8 out1 = [out1] cmp.ne p7, p0 = r0, r16 + sub r3 = r3, r2 ;; + } + { .mmi + st8 [out1] = r3 (p7) ld8 r18 = [r16], 8 + mov loc1 = gp ;; } + { .mfb + ld8 out0 = [out0] + } { .mib (p7) ld8 gp = [r16] (p7) mov b6 = r18 (p7) br.call.sptk.many b0 = b6 } { .mii + mov gp = loc1 mov b0 = loc0 ! mov ar.pfs = loc2 } { .bbb br.ret.sptk.many b0 Index: config/ia64/crtend.asm =================================RCS file: /cvs/gcc/egcs/gcc/config/ia64/crtend.asm,v retrieving revision 1.2 diff -c -p -d -r1.2 crtend.asm *** crtend.asm 2000/04/25 23:16:20 1.2 --- crtend.asm 2000/05/17 01:45:28 *************** __DTOR_END__: *** 28,52 **** .section .IA_64.unwind __EH_FRAME_END__: - data8 -1 /* * Fragment of the ELF _init routine that invokes our dtor cleanup. * ! * The code going into .init is spread all over the place, thus we need ! * to save gp in order to make sure that other bits don't get into any ! * nasty surprises by expecting a gp that has suddenly changed. */ .section .init,"ax","progbits" ! { .mfb ! st8 [r12] = gp, -16 ! br.call.sptk.many b0 = __do_global_ctors_aux ;; } ! { .mmi ! adds r12 = 16, r12 ;; ! ld8 gp = [r12] ;; } --- 28,60 ---- .section .IA_64.unwind __EH_FRAME_END__: /* * Fragment of the ELF _init routine that invokes our dtor cleanup. * ! * We make the call by indirection, because in large programs the ! * .fini and .init sections are not in range of the destination, and ! * we cannot allow the linker to insert a stub at the end of this ! * fragment of the _fini function. Further, Itanium does not implement ! * the long branch instructions, and we do not wish every program to ! * trap to the kernel for emulation. ! * ! * Note that we require __do_global_ctors_aux to preserve the GP, ! * so that the next fragment in .fini gets the right value. */ .section .init,"ax","progbits" ! { .mlx ! movl r2 = @gprel(__do_global_ctors_aux#) ;; } ! { .mii ! nop.m 0 ! add r2 = r2, gp ;; ! mov b6 = r2 ! } ! { .bbb ! br.call.sptk.many b0 = b6 ;; } *************** __do_global_ctors_aux: *** 59,92 **** (*p) (); */ { .mii ! alloc loc2 = ar.pfs, 0, 4, 0, 0 addl loc0 = @ltoff(__CTOR_END__# - 8), gp ! cmp.ne p6, p0 = r0, r0 ;; } ! { .mfi ld8 loc0 = [loc0] ! mov loc1 = b0 } 0: { .mmi ! (p6) ld8 r15 = [loc3], 8 ;; ! (p6) ld8 gp = [loc3] ! (p6) mov b6 = r15 } { .mfb ld8 loc3 = [loc0], -8 ! (p6) br.call.sptk.many b0 = b6 ;; } { .mfb cmp.ne p6, p0 = -1, loc3 (p6) br.cond.sptk.few 0b } { .mii ! mov ar.pfs = loc2 mov b0 = loc1 } { .bbb br.ret.sptk.many b0 --- 67,109 ---- (*p) (); */ { .mii ! alloc loc4 = ar.pfs, 0, 5, 0, 0 addl loc0 = @ltoff(__CTOR_END__# - 8), gp ! mov loc1 = b0 ;; } ! { .mmi ld8 loc0 = [loc0] ! ;; ! ld8 loc3 = [loc0], -8 ! mov loc2 = gp ! ;; } + { .mfb + cmp.eq p6, p0 = -1, loc3 + (p6) br.cond.spnt.few 2f + } 0: { .mmi ! ld8 r15 = [loc3], 8 ;; ! ld8 gp = [loc3] ! mov b6 = r15 } { .mfb ld8 loc3 = [loc0], -8 ! br.call.sptk.many b0 = b6 ;; } { .mfb cmp.ne p6, p0 = -1, loc3 (p6) br.cond.sptk.few 0b } + 2: { .mii ! mov gp = loc2 mov b0 = loc1 + mov ar.pfs = loc4 } { .bbb br.ret.sptk.many b0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (6 preceding siblings ...) 2000-05-17 20:17 ` Jim Wilson @ 2000-05-17 22:28 ` Omar Stradella 2000-05-20 3:15 ` Uros Prestor 8 siblings, 0 replies; 10+ messages in thread From: Omar Stradella @ 2000-05-17 22:28 UTC (permalink / raw) To: linux-ia64 Jim, The patch works very well. Thanks a lot. Hope it will be included in the the next gnupro rpm update. Omar. +---------------------------------------------------------------------+ Omar G. Stradella, Ph.D. SGI / Chemistry and Biology Applications Group 1 Cabot Rd, Suite 250, Hudson, MA 01749, USA N 42 22'40" W 71 33'37" E-mail: omar@sgi.com Phone: +1-781-839-2258 FAX: +1-978-562-7450 http://www.sgi.com/chembio http://reality.sgi.com/omar +-------- Ph-nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn -------+ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Linux-ia64] IP-relative calls in start.S and initfini.c 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella ` (7 preceding siblings ...) 2000-05-17 22:28 ` Omar Stradella @ 2000-05-20 3:15 ` Uros Prestor 8 siblings, 0 replies; 10+ messages in thread From: Uros Prestor @ 2000-05-20 3:15 UTC (permalink / raw) To: linux-ia64 FYI -- The new gnupro RPM with correct handling of brl instructions is available on our FTP site: ftp://ftp.turbolinux.com/pub/ia64/0505/updates/RPMS/ia64/gnupro-2.9-000501p3.ia64.rpm You will need an updated version of the kernel RPMs (you need at least 2.3.99-20); the RPMs are also available on our update site. Uros -- Uros Prestor uros@turbolinux.com ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2000-05-20 3:15 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2000-05-02 21:36 [Linux-ia64] IP-relative calls in start.S and initfini.c Omar Stradella 2000-05-02 22:00 ` Jim Wilson 2000-05-02 22:20 ` Omar Stradella 2000-05-02 22:25 ` Jim Wilson 2000-05-11 18:24 ` Omar Stradella 2000-05-12 2:50 ` Jim Wilson 2000-05-15 17:57 ` Omar Stradella 2000-05-17 20:17 ` Jim Wilson 2000-05-17 22:28 ` Omar Stradella 2000-05-20 3:15 ` Uros Prestor
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox