1 /* Copyright
(C
) 2000, 2001, 2003 Free Software Foundation
, Inc.
2 Contributed by Jes Sorensen
, <Jes.Sorensen
@cern.
ch>
4 The GNU C Library is free software
; you can redistribute it and/or
5 modify it under the terms of the GNU Library General
Public License as
6 published by the Free Software Foundation
; either version 2 of the
7 License
, or (at your option
) any later version.
9 The GNU C Library is distributed
in the hope that it will be useful
,
10 but WITHOUT ANY WARRANTY
; without even the implied warranty of
11 MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General
Public License for more details.
14 You should have received a copy of the GNU Library General
Public
15 License along with the GNU C Library
; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation
, Inc.
, 59 Temple Place
- Suite
330,
17 Boston
, MA
02111-1307, USA.
*/
19 #
include "auto-host.h"
21 .
section .ctors
,"aw","progbits"
26 .
section .dtors
,"aw","progbits"
31 .
section .jcr
,"aw","progbits"
36 .
type dtor_ptr#
,@object
39 data8
@gprel(__DTOR_LIST__#
+ 8)
41 /* A handle for __cxa_finalize to manage c
++ local destructors.
*/
43 .
type __dso_handle#
,@object
57 #ifdef HAVE_INITFINI_ARRAY
59 .
section .fini_array
,"a","progbits"
60 data8
@fptr(__do_global_dtors_aux
)
62 .
section .init_array
,"a","progbits"
63 data8
@fptr(__do_jv_register_classes
)
64 data8
@fptr(__do_global_ctors_aux
)
66 #else
/* !HAVE_INITFINI_ARRAY
*/
68 * Fragment of the ELF _fini routine that invokes our dtor cleanup.
70 * We make the
call by indirection
, because
in large programs the
71 * .fini
and .init sections are
not in range of the destination
, and
72 * we cannot allow the linker to insert a stub at the
end of
this
73 * fragment of the _fini function. Further
, Itanium does
not implement
74 * the long branch instructions
, and we do
not wish every program to
75 * trap to the kernel for emulation.
77 * Note that we require __do_global_dtors_aux to preserve the GP
,
78 * so that the next fragment
in .fini gets the right value.
80 .
section .fini
,"ax","progbits"
82 movl r2 = @pcrel(__do_global_dtors_aux# - 16)
92 br.call.sptk.many b0 = b6
96 /* Likewise for _init.
*/
98 .
section .init
,"ax","progbits"
100 movl r2 = @pcrel(__do_jv_register_classes# - 16)
110 br.call.sptk.many b0 = b6
113 #endif
/* !HAVE_INITFINI_ARRAY
*/
117 .
proc __do_global_dtors_aux#
118 __do_global_dtors_aux:
121 alloc loc3 = ar.pfs, 0, 4, 1, 0
122 addl loc0 = @gprel(dtor_ptr#), gp
133 __cxa_finalize
(__dso_handle
)
136 alloc loc3 = ar.pfs, 0, 4, 1, 0
137 addl loc0 = @gprel(dtor_ptr#), gp
138 addl r16 = @ltoff(@fptr(__cxa_finalize#)), gp
144 addl out0 = @ltoff(__dso_handle#), gp
145 cmp.ne p7, p0 = r0, r16
150 (p7) ld8 r18 = [r16], 8
161 (p7) br.call.sptk.many b0 = b6
182 br.call.sptk.many b0 = b6
199 cmp.ne p6, p0 = r0, r16
201 (p6) br.cond.sptk.few 0b
207 .
endp __do_global_dtors_aux#
210 .
proc __do_jv_register_classes#
211 __do_jv_register_classes:
213 alloc loc2 = ar.pfs, 0, 3, 1, 0
214 movl out0 = @gprel(__JCR_LIST__)
218 addl r14 = @ltoff(@fptr(_Jv_RegisterClasses)), gp
225 cmp.ne p6, p0 = r0, r0
229 cmp.eq.or p6, p0 = r0, r14
230 cmp.eq.or p6, p0 = r0, r15
231 (p6) br.ret.sptk.many b0
242 br.call.sptk.many b0 = b6
254 .
endp __do_jv_register_classes#
257 .weak __cxa_finalize#
259 .weak _Jv_RegisterClasses