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.
, 51 Franklin Street
, Fifth Floor
,
17 Boston
, MA
02110-1301, 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
58 #ifdef HAVE_INITFINI_ARRAY
60 .
section .fini_array
, "a"
61 data8
@fptr(__do_global_dtors_aux
)
63 .
section .init_array
, "a"
64 data8
@fptr(__do_jv_register_classes
)
65 data8
@fptr(__do_global_ctors_aux
)
67 #else
/* !HAVE_INITFINI_ARRAY
*/
69 * Fragment of the ELF _fini routine that invokes our dtor cleanup.
71 * We make the
call by indirection
, because
in large programs the
72 * .fini
and .init sections are
not in range of the destination
, and
73 * we cannot allow the linker to insert a stub at the
end of
this
74 * fragment of the _fini function. Further
, Itanium does
not implement
75 * the long branch instructions
, and we do
not wish every program to
76 * trap to the kernel for emulation.
78 * Note that we require __do_global_dtors_aux to preserve the GP
,
79 * so that the next fragment
in .fini gets the right value.
81 .
section .fini
,"ax","progbits"
83 movl r2 = @pcrel(__do_global_dtors_aux - 16)
94 br.call.sptk.many b0 = b6
97 /* Likewise for _init.
*/
99 .
section .init
,"ax","progbits"
101 movl r2 = @pcrel(__do_jv_register_classes - 16)
112 br.call.sptk.many b0 = b6
114 #endif
/* !HAVE_INITFINI_ARRAY
*/
118 .
proc __do_global_dtors_aux
119 __do_global_dtors_aux:
123 alloc loc3
= ar.pfs
, 0, 4, 1, 0
124 addl loc0
= @gprel(dtor_ptr
), gp
135 __cxa_finalize
(__dso_handle
)
138 alloc loc3
= ar.pfs
, 0, 4, 1, 0
139 addl loc0
= @gprel(dtor_ptr
), gp
140 addl r16
= @ltoff(@fptr(__cxa_finalize
)), gp
145 addl out0
= @ltoff(__dso_handle
), gp
146 cmp.ne p7
, p0
= r0
, r16
150 (p7
) ld8 r18
= [r16
], 8
162 (p7
) br.
call.sptk.many rp
= b6
176 st8
[loc0
] = r15
// update dtor_ptr
(in memory
)
177 ld8 r17
= [r16
], 8 // r17
<- dtor
's entry-point
181 ld8 gp = [r16] // gp <- dtor's gp
183 br.
call.sptk.many rp
= b6
185 .
entry: ld8 r15
= [loc0
] // r15
<- dtor_ptr
(gp
-relative
)
187 add r16
= r15
, loc2
// r16
<- dtor_ptr
(absolute
)
191 ld8 r16
= [r16
] // r16
<- pointer to dtor
's fdesc
196 cmp.ne p6, p0 = r0, r16
197 (p6) br.cond.sptk.few .loop
199 .endp __do_global_dtors_aux
202 .proc __do_jv_register_classes
203 __do_jv_register_classes:
206 alloc loc1 = ar.pfs, 0, 3, 1, 0
207 movl out0 = @gprel(__JCR_LIST__)
210 addl r14 = @ltoff(@fptr(_Jv_RegisterClasses)), gp
219 cmp.ne p6, p0 = r0, r0
222 cmp.eq.or p6, p0 = r0, r14
223 cmp.eq.or p6, p0 = r0, r15
224 (p6) br.ret.sptk.many rp
233 br.call.sptk.many rp = b6
243 .endp __do_jv_register_classes
248 .weak _Jv_RegisterClasses