1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22     .align 4
23     .globl privateSnippetExecutorGeneral
24 privateSnippetExecutorGeneral:
25     movl    %esp,%ecx
26     pushl   %ebp              / proper stack frame needed for exception handling
27     movl    %esp,%ebp
28     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
29     subl    $0x8,%esp         / 64bit nRegReturn
30     pushl   %ecx              / 32bit pCallStack
31     pushl   %edx              / 32bit nVtableOffset
32     pushl   %eax              / 32bit nFunctionIndex
33     call    cpp_vtable_call
34     movl    12(%esp),%eax     / 64 bit nRegReturn, lower half
35     leave
36     ret
37     .type privateSnippetExecutorGeneral, @function
38     .size privateSnippetExecutorGeneral, .-privateSnippetExecutorGeneral
39 
40     .align 4
41     .globl privateSnippetExecutorVoid
42 privateSnippetExecutorVoid:
43     movl    %esp,%ecx
44     pushl   %ebp              / proper stack frame needed for exception handling
45     movl    %esp,%ebp
46     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
47     subl    $0x8,%esp         / 64bit nRegReturn
48     pushl   %ecx              / 32bit pCallStack
49     pushl   %edx              / 32bit nVtableOffset
50     pushl   %eax              / 32bit nFunctionIndex
51     call    cpp_vtable_call
52     leave
53     ret
54     .type privateSnippetExecutorVoid, @function
55     .size privateSnippetExecutorVoid, .-privateSnippetExecutorVoid
56 
57     .align 4
58     .globl privateSnippetExecutorHyper
59 privateSnippetExecutorHyper:
60     movl    %esp,%ecx
61     pushl   %ebp              / proper stack frame needed for exception handling
62     movl    %esp,%ebp
63     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
64     subl    $0x8,%esp         / 64bit nRegReturn
65     pushl   %ecx              / 32bit pCallStack
66     pushl   %edx              / 32bit nVtableOffset
67     pushl   %eax              / 32bit nFunctionIndex
68     call    cpp_vtable_call
69     movl    12(%esp),%eax     / 64 bit nRegReturn, lower half
70     movl    16(%esp),%edx     / 64 bit nRegReturn, upper half
71     leave
72     ret
73     .type privateSnippetExecutorHyper, @function
74     .size privateSnippetExecutorHyper, .-privateSnippetExecutorHyper
75 
76     .align 4
77     .globl privateSnippetExecutorFloat
78 privateSnippetExecutorFloat:
79     movl    %esp,%ecx
80     pushl   %ebp              / proper stack frame needed for exception handling
81     movl    %esp,%ebp
82     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
83     subl    $0x8,%esp         / 64bit nRegReturn
84     pushl   %ecx              / 32bit pCallStack
85     pushl   %edx              / 32bit nVtableOffset
86     pushl   %eax              / 32bit nFunctionIndex
87     call    cpp_vtable_call
88     flds    12(%esp)          / 64 bit nRegReturn, lower half
89     leave
90     ret
91     .type privateSnippetExecutorFloat, @function
92     .size privateSnippetExecutorFloat, .-privateSnippetExecutorFloat
93 
94     .align 4
95     .globl privateSnippetExecutorDouble
96 privateSnippetExecutorDouble:
97     movl    %esp,%ecx
98     pushl   %ebp              / proper stack frame needed for exception handling
99     movl    %esp,%ebp
100     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
101     subl    $0x8,%esp         / 64bit nRegReturn
102     pushl   %ecx              / 32bit pCallStack
103     pushl   %edx              / 32bit nVtableOffset
104     pushl   %eax              / 32bit nFunctionIndex
105     call    cpp_vtable_call
106     fldl    12(%esp)          / 64 bit nRegReturn
107     leave
108     ret
109     .type privateSnippetExecutorDouble, @function
110     .size privateSnippetExecutorDouble, .-privateSnippetExecutorDouble
111 
112     .align 4
113     .globl privateSnippetExecutorStruct
114 privateSnippetExecutorStruct:
115     movl    %esp,%ecx
116     pushl   %ebp              / proper stack frame needed for exception handling
117     movl    %esp,%ebp
118     andl    $0xFFFFFFF8,%esp  / align following 64bit arg
119     subl    $0x8,%esp         / 64bit nRegReturn
120     pushl   %ecx              / 32bit pCallStack
121     pushl   %edx              / 32bit nVtableOffset
122     pushl   %eax              / 32bit nFunctionIndex
123     call    cpp_vtable_call
124     movl    12(%esp),%eax     / 64 bit nRegReturn, lower half
125     leave
126     ret     $4
127     .type privateSnippetExecutorStruct, @function
128     .size privateSnippetExecutorStruct, .-privateSnippetExecutorStruct
129 
130 	.align 4
131 	.globl callVirtualMethod
132 callVirtualMethod:
133 	pushl	%ebp
134 	movl	%esp, %ebp
135 	subl	$24, %esp
136 	movl	%edx, -4(%ebp)
137 	movl	%ecx, -8(%ebp)
138 	movl	%eax, -12(%ebp)
139 	movl	%esp, -16(%ebp)
140 	movl	%ebx, -20(%ebp)
141 
142 	/ set ebx to GOT
143 .L_GOT_BEGIN_2:
144 	call	.L_GOT_END_2
145 .L_GOT_END_2:
146 	popl	%ebx
147 	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L_GOT_END_2],%ebx
148 .callBeginPosition:
149 	movl	28(%ebp), %eax
150 	movl	%eax, %edx
151 	dec		%edx
152 	shl		$2, %edx
153 	add		24(%ebp), %edx
154 .copyLong:
155 	movl	0(%edx), %ecx
156 	sub		$4, %edx
157 	push	%ecx
158 	dec		%eax
159 	jne		.copyLong
160 .doCall:
161 	movl	8(%ebp), %edx
162 	movl	0(%edx), %edx
163 	movl	12(%ebp), %eax
164 	add		$2, %eax
165 	shl		$2, %eax
166 	add		%eax, %edx
167 	movl	0(%edx), %edx
168 
169 	call	*%edx
170 
171 .callVirtualMethodExceptionPosition:
172 	/ handle returns
173 	movl	20(%ebp), %ecx
174 
175 	/ byte types
176 	cmp     $2, %ecx	/ typelib_TypeClass_BOOLEAN
177 	je		.handleByte
178 	cmp		$3, %ecx
179 	je		.handleByte	/ typelib_TypeClass_BYTE
180 
181 	/ half word types
182 	cmp    $4, %ecx		/ typelib_TypeClass_SHORT
183 	je     .handleShort
184 	cmp    $5, %ecx		/ typelib_TypeClass_UNSIGNED_SHORT
185 	je     .handleShort
186 
187 	/ word types
188 	cmp    $6, %ecx		/ typelib_TypeClass_LONG
189 	je     .handleWord
190 	cmp    $7, %ecx		/ typelib_TypeClass_UNSIGNED_LONG
191 	je     .handleWord
192 	cmp    $1, %ecx		/ typelib_TypeClass_CHAR (wchar_t)
193 	je     .handleWord
194 	cmp    $15, %ecx	/ typelib_TypeClass_ENUM
195 	je     .handleWord
196 
197 	/ double word types
198 	cmp    $8, %ecx		/ typelib_TypeClass_HYPER
199 	je     .handleDoubleWord
200 	cmp    $9, %ecx		/ typelib_TypeClass_UNSIGNED_HYPER
201 	je     .handleDoubleWord
202 
203 	/ float
204 	cmp    $10, %ecx	/ typelib_TypeClass_FLOAT
205 	je     .handleFloat
206 
207 	/ double
208 	cmp    $11, %ecx	/ typelib_TypeClass_DOUBLE
209 	je     .handleDouble
210 
211 	/ default: return void
212 	jmp    .doRestore
213 .handleByte:
214 	movl	16(%ebp), %ecx
215 	movb	%al, 0(%ecx)
216 	jmp		.doRestore
217 .handleShort:
218 	movl	16(%ebp), %ecx
219 	movw	%ax, 0(%ecx)
220 	jmp		.doRestore
221 .handleWord:
222 	movl	16(%ebp), %ecx
223 	movl	%eax, 0(%ecx)
224 	jmp		.doRestore
225 .handleDoubleWord:
226 	movl	16(%ebp), %ecx
227 	movl	%eax, 0(%ecx)
228 	movl	%edx, 4(%ecx)
229 	jmp		.doRestore
230 .handleFloat:
231 	movl	16(%ebp), %ecx
232 	fstps	0(%ecx)
233 	jmp		.doRestore
234 .handleDouble:
235 	movl	16(%ebp), %ecx
236 	fstpl	0(%ecx)
237 	jmp		.doRestore
238 .doRestore:
239 	movl	-4(%ebp), %edx
240 	movl	-8(%ebp), %ecx
241 	movl	-12(%ebp), %eax
242 	movl	-20(%ebp), %ebx
243 	movl	%ebp, %esp
244 	popl	%ebp
245 	ret
246 	.type callVirtualMethod, @function
247 	.size callVirtualMethod, .-callVirtualMethod
248 
249 	.globl callVirtualMethodExceptionHandler
250 callVirtualMethodExceptionHandler:
251 	movl	-4(%ebp), %edx
252 	movl	-8(%ebp), %ecx
253 	movl	-12(%ebp), %eax
254 	movl	-16(%ebp), %esp
255 	movl	-20(%ebp), %ebx
256 	call	__1cG__CrunMex_rethrow_q6F_v_@PLT
257 	ret
258 
259 	.type callVirtualMethodExceptionHandler, @function
260 	.size callVirtualMethodExceptionHandler, .-callVirtualMethodExceptionHandler
261 
262 
263 	.section	.exception_ranges,"aw"
264 	.align		4
265 
266 	.4byte		.callBeginPosition@rel
267 	.4byte		.callVirtualMethodExceptionPosition-.callBeginPosition
268 	.4byte		callVirtualMethodExceptionHandler-.callBeginPosition
269 	.zero		8
270