Unlikely to work yet, but at least builds for the simulator. We can not use dynamic code generation on iOS, so we use a fixed set of code snippets, genertated by a Perl script. Experimentation seems to indicate that a relatively small set of static code snippets should be enough in simple use cases with no extensions (that we can't really support on iOS anyway) and stuff. Except for the static set of snippets the code mostly is, or will be, an ifdefified combination of the gcc3_linux_arm and gcc3_macosx_intel code. The ABI on iOS ARM devices should be quite close to that on Linux ARM, knock on wood.
354 lines
12 KiB
ArmAsm
354 lines
12 KiB
ArmAsm
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org 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 Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
#ifdef __arm
|
|
@ ARM support code for LibreOffice C++/UNO bridging
|
|
@
|
|
@ Written by Peter Naulls <peter@chocky.org>
|
|
@ Modified by Caolan McNamara <caolanm@redhat.com>
|
|
@ Fixed by Michael Casadevall <mcasadevall@kubuntu.org>
|
|
@ Modified for iOS by Tor Lillqvist <tml@iki.fi>
|
|
|
|
.file "helper.S"
|
|
.text
|
|
.align 4
|
|
.globl privateSnippetExecutor
|
|
|
|
privateSnippetExecutor:
|
|
stmfd sp!, {r0-r3} @ follow other parameters on stack
|
|
mov r0, ip @ r0 points to functionoffset/vtable
|
|
mov r1, sp @ r1 points to this and params
|
|
@ (see cpp2uno.cxx:codeSnippet())
|
|
stmfd sp!, {r4,lr} @ save return address
|
|
@ (r4 pushed to preserve stack alignment)
|
|
bl cpp_vtable_call
|
|
|
|
add sp, sp, #4 @ no need to restore r4 (we didn't touch it)
|
|
ldr pc, [sp], #20 @ return, discarding function arguments
|
|
|
|
#else
|
|
.text
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorGeneral
|
|
_privateSnippetExecutorGeneral:
|
|
LFBg:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFIg0:
|
|
movl %esp,%ebp
|
|
LCFIg1:
|
|
subl $0x8,%esp # padding + 32bit returnValue
|
|
pushl %esp # 32bit &returnValue
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
movl 16(%esp),%eax # 32bit returnValue
|
|
leave
|
|
ret
|
|
LFEg:
|
|
.long .-_privateSnippetExecutorGeneral
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorVoid
|
|
_privateSnippetExecutorVoid:
|
|
LFBv:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFIv0:
|
|
movl %esp,%ebp
|
|
LCFIv1:
|
|
sub $8,%esp # padding
|
|
pushl $0 # 32bit null pointer (returnValue not used)
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
leave
|
|
ret
|
|
LFEv:
|
|
.long .-_privateSnippetExecutorVoid
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorHyper
|
|
_privateSnippetExecutorHyper:
|
|
LFBh:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFIh0:
|
|
movl %esp,%ebp
|
|
LCFIh1:
|
|
subl $0x8,%esp # 64bit returnValue
|
|
pushl %esp # 32bit &returnValue
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
movl 16(%esp),%eax # 64bit returnValue, lower half
|
|
movl 20(%esp),%edx # 64bit returnValue, upper half
|
|
leave
|
|
ret
|
|
LFEh:
|
|
.long .-_privateSnippetExecutorHyper
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorFloat
|
|
_privateSnippetExecutorFloat:
|
|
LFBf:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFIf0:
|
|
movl %esp,%ebp
|
|
LCFIf1:
|
|
subl $0x8,%esp # padding + 32bit returnValue
|
|
pushl %esp # 32bit &returnValue
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
flds 16(%esp) # 32bit returnValue
|
|
leave
|
|
ret
|
|
LFEf:
|
|
.long .-_privateSnippetExecutorFloat
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorDouble
|
|
_privateSnippetExecutorDouble:
|
|
LFBd:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFId0:
|
|
movl %esp,%ebp
|
|
LCFId1:
|
|
subl $0x8,%esp # 64bit returnValue
|
|
pushl %esp # 32bit &returnValue
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
fldl 16(%esp) # 64bit returnValue
|
|
leave
|
|
ret
|
|
LFEd:
|
|
.long .-_privateSnippetExecutorDouble
|
|
|
|
.align 1, 0x90
|
|
.globl _privateSnippetExecutorClass
|
|
_privateSnippetExecutorClass:
|
|
LFBc:
|
|
movl %esp,%ecx
|
|
pushl %ebp # proper stack frame needed for exception handling
|
|
LCFIc0:
|
|
movl %esp,%ebp
|
|
LCFIc1:
|
|
subl $0x8,%esp # padding + 32bit returnValue
|
|
pushl %esp # 32bit &returnValue
|
|
pushl %ecx # 32bit pCallStack
|
|
pushl %edx # 32bit nVtableOffset
|
|
pushl %eax # 32bit nFunctionIndex
|
|
call L_cpp_vtable_call$stub
|
|
movl 16(%esp),%eax # 32bit returnValue
|
|
leave
|
|
ret $4
|
|
LFEc:
|
|
.long .-_privateSnippetExecutorClass
|
|
|
|
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
|
|
EH_frame1:
|
|
.set L$set$frame1,LECIE1-LSCIE1
|
|
.long L$set$frame1 # length
|
|
LSCIE1:
|
|
.long 0 # CIE_ID
|
|
.byte 1 # version
|
|
.ascii "zPR\0" # augmentation
|
|
.byte 1 # code_alignment_factor (.uleb128 1)
|
|
.byte 0x7c # data_alignment_factor (.sleb128 -4)
|
|
.byte 8 # return_address_register
|
|
.byte 0x6 # augmentation size 7:
|
|
.byte 0x9b # ???
|
|
.long L___gxx_personality_v0$non_lazy_ptr-.
|
|
.byte 0x10
|
|
# initial_instructions:
|
|
.byte 0x0C # DW_CFA_def_cfa %esp, 4
|
|
.byte 5
|
|
.byte 4
|
|
.byte 0x88 # DW_CFA_offset ret, 1
|
|
.byte 1
|
|
.align 2
|
|
LECIE1:
|
|
.globl _privateSnippetExecutorGeneral.eh
|
|
_privateSnippetExecutorGeneral.eh:
|
|
LSFDEg:
|
|
.set L$set$g1,LEFDEg-LASFDEg
|
|
.long L$set$g1 # length
|
|
LASFDEg:
|
|
.long LASFDEg-EH_frame1 # CIE_pointer
|
|
.long LFBg-. # initial_location
|
|
.long LFEg-LFBg # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIg0-LFBg
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIg1-LCFIg0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEg:
|
|
.globl _privateSnippetExecutorVoid.eh
|
|
_privateSnippetExecutorVoid.eh:
|
|
LSFDEv:
|
|
.set L$set$v1,LEFDEv-LASFDEv
|
|
.long L$set$v1 # length
|
|
LASFDEv:
|
|
.long LASFDEv-EH_frame1 # CIE_pointer
|
|
.long LFBv-. # initial_location
|
|
.long LFEv-LFBv # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIv0-LFBv
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIv1-LCFIv0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEv:
|
|
.globl _privateSnippetExecutorHyper.eh
|
|
_privateSnippetExecutorHyper.eh:
|
|
LSFDEh:
|
|
.set L$set$h1,LEFDEh-LASFDEh
|
|
.long L$set$h1 # length
|
|
LASFDEh:
|
|
.long LASFDEh-EH_frame1 # CIE_pointer
|
|
.long LFBh-. # initial_location
|
|
.long LFEh-LFBh # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIh0-LFBh
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIh1-LCFIh0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEh:
|
|
.globl _privateSnippetExecutorFloat.eh
|
|
_privateSnippetExecutorFloat.eh:
|
|
LSFDEf:
|
|
.set L$set$f1,LEFDEf-LASFDEf
|
|
.long L$set$f1 # length
|
|
LASFDEf:
|
|
.long LASFDEf-EH_frame1 # CIE_pointer
|
|
.long LFBf-. # initial_location
|
|
.long LFEf-LFBf # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIf0-LFBf
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIf1-LCFIf0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEf:
|
|
.globl _privateSnippetExecutorDouble.eh
|
|
_privateSnippetExecutorDouble.eh:
|
|
LSFDEd:
|
|
.set L$set$d1,LEFDEd-LASFDEd
|
|
.long L$set$d1 # length
|
|
LASFDEd:
|
|
.long LASFDEd-EH_frame1 # CIE_pointer
|
|
.long LFBd-. # initial_location
|
|
.long LFEd-LFBd # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFId0-LFBd
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFId1-LCFId0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEd:
|
|
.globl _privateSnippetExecutorClass.eh
|
|
_privateSnippetExecutorClass.eh:
|
|
LSFDEc:
|
|
.set L$set$c1,LEFDEc-LASFDEc
|
|
.long L$set$c1 # length
|
|
LASFDEc:
|
|
.long LASFDEc-EH_frame1 # CIE_pointer
|
|
.long LFBc-. # initial_location
|
|
.long LFEc-LFBc # address_range
|
|
.byte 0 # augmentation size 0
|
|
# instructions:
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIc0-LFBc
|
|
.byte 0x0E # DW_CFA_def_cfa_offset 8
|
|
.byte 8
|
|
.byte 0x84 # DW_CFA_offset %ebp, 2
|
|
.byte 2
|
|
.byte 0x04 # DW_CFA_advance_loc4
|
|
.long LCFIc1-LCFIc0
|
|
.byte 0x0D # DW_CFA_def_cfa_register %ebp
|
|
.byte 4
|
|
.align 2
|
|
LEFDEc:
|
|
.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
|
|
L_cpp_vtable_call$stub:
|
|
.indirect_symbol _cpp_vtable_call
|
|
hlt ; hlt ; hlt ; hlt ; hlt
|
|
.section __IMPORT,__pointers,non_lazy_symbol_pointers
|
|
L___gxx_personality_v0$non_lazy_ptr:
|
|
.indirect_symbol ___gxx_personality_v0
|
|
.long 0
|
|
.constructor
|
|
.destructor
|
|
.align 1
|
|
#endif
|