1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
|
/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
Contributed by Jes Sorensen, <Jes.Sorensen@cern.ch>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "auto-host.h"
.section .ctors,"aw","progbits"
.align 8
__CTOR_LIST__:
data8 -1
.section .dtors,"aw","progbits"
.align 8
__DTOR_LIST__:
data8 -1
.section .jcr,"aw","progbits"
.align 8
__JCR_LIST__:
.section .sdata
.type dtor_ptr#,@object
.size dtor_ptr#,8
dtor_ptr:
data8 @gprel(__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
.hidden __dso_handle#
#ifdef HAVE_INITFINI_ARRAY
.section .fini_array,"a","progbits"
data8 @fptr(__do_global_dtors_aux)
.section .init_array,"a","progbits"
data8 @fptr(__do_jv_register_classes)
data8 @fptr(__do_global_ctors_aux)
#else /* !HAVE_INITFINI_ARRAY */
/*
* 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 = @pcrel(__do_global_dtors_aux# - 16)
}
{ .mii
mov r3 = ip
;;
add r2 = r2, r3
;;
}
{ .mib
mov b6 = r2
br.call.sptk.many b0 = b6
;;
}
/* Likewise for _init. */
.section .init,"ax","progbits"
{ .mlx
movl r2 = @pcrel(__do_jv_register_classes# - 16)
}
{ .mii
mov r3 = ip
;;
add r2 = r2, r3
;;
}
{ .mib
mov b6 = r2
br.call.sptk.many b0 = b6
;;
}
#endif /* !HAVE_INITFINI_ARRAY */
.section .text
.align 16
.proc __do_global_dtors_aux#
__do_global_dtors_aux:
#ifndef SHARED
{ .mii
alloc loc3 = ar.pfs, 0, 4, 1, 0
addl loc0 = @gprel(dtor_ptr#), gp
mov loc1 = b0
}
{ .mib
mov loc2 = gp
br.sptk.few 1f
;;
}
#else
/*
if (__cxa_finalize)
__cxa_finalize(__dso_handle)
*/
{ .mii
alloc loc3 = ar.pfs, 0, 4, 1, 0
addl loc0 = @gprel(dtor_ptr#), gp
addl r16 = @ltoff(@fptr(__cxa_finalize#)), gp
;;
}
{ .mmi
ld8 r16 = [r16]
;;
addl out0 = @ltoff(__dso_handle#), gp
cmp.ne p7, p0 = r0, r16
;;
}
{ .mmi
ld8 out0 = [out0]
(p7) ld8 r18 = [r16], 8
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 {
dtor_ptr++;
(*(dtor_ptr-1)) ();
} while (dtor_ptr);
*/
0:
{ .mmi
st8 [loc0] = r15
ld8 r17 = [r16], 8
;;
}
{ .mib
ld8 gp = [r16]
mov b6 = r17
br.call.sptk.many b0 = b6
}
1:
{ .mmi
ld8 r15 = [loc0]
;;
add r16 = r15, loc2
adds r15 = 8, r15
;;
}
{ .mmi
ld8 r16 = [r16]
mov gp = loc2
mov b0 = loc1
;;
}
{ .mib
cmp.ne p6, p0 = r0, r16
mov ar.pfs = loc3
(p6) br.cond.sptk.few 0b
}
{ .bbb
br.ret.sptk.many b0
;;
}
.endp __do_global_dtors_aux#
.align 16
.proc __do_jv_register_classes#
__do_jv_register_classes:
{ .mlx
alloc loc2 = ar.pfs, 0, 3, 1, 0
movl out0 = @gprel(__JCR_LIST__)
;;
}
{ .mmi
addl r14 = @ltoff(@fptr(_Jv_RegisterClasses)), gp
add out0 = out0, gp
;;
}
{ .mmi
ld8 r14 = [r14]
ld8 r15 = [out0]
cmp.ne p6, p0 = r0, r0
;;
}
{ .mib
cmp.eq.or p6, p0 = r0, r14
cmp.eq.or p6, p0 = r0, r15
(p6) br.ret.sptk.many b0
}
{ .mii
ld8 r15 = [r14], 8
mov loc0 = b0
mov loc1 = gp
;;
}
{ .mib
ld8 gp = [r14]
mov b6 = r15
br.call.sptk.many b0 = b6
;;
}
{ .mii
mov gp = loc1
mov b0 = loc0
mov ar.pfs = loc2
}
{ .bbb
br.ret.sptk.many b0
;;
}
.endp __do_jv_register_classes#
#ifdef SHARED
.weak __cxa_finalize#
#endif
.weak _Jv_RegisterClasses
|