summaryrefslogtreecommitdiffstats
path: root/bridges/source/cpp_uno/gcc3_ios/helper.s
diff options
context:
space:
mode:
authorjan Iversen <jani@libreoffice.org>2017-09-19 09:44:38 +0200
committerjan Iversen <jani@libreoffice.org>2017-09-19 14:02:51 +0200
commit7e1489bb4c2d11380d28cea2c3cf5d76303eecae (patch)
treee708e5d6f6a8cf6e9d2de88fcc0ea8a58f0d4d36 /bridges/source/cpp_uno/gcc3_ios/helper.s
parentofz: survive missing config (diff)
downloadcore-7e1489bb4c2d11380d28cea2c3cf5d76303eecae.tar.gz
core-7e1489bb4c2d11380d28cea2c3cf5d76303eecae.zip
iOS, remove support for 32bit (arm).
Supporting 32bit iOS, means a.o. adding several libraries to the dependency list because macOSX does not install them by default (e.g. zlib). 32bit is only used in old iPhones. updated configure.ac removed from solenv/gbuild/platform bridges corrected Change-Id: I415e744a9cb4acb3b5fbfca33c22940a1d56e390
Diffstat (limited to 'bridges/source/cpp_uno/gcc3_ios/helper.s')
-rw-r--r--bridges/source/cpp_uno/gcc3_ios/helper.s471
1 files changed, 471 insertions, 0 deletions
diff --git a/bridges/source/cpp_uno/gcc3_ios/helper.s b/bridges/source/cpp_uno/gcc3_ios/helper.s
new file mode 100644
index 000000000000..7461cbccc4e7
--- /dev/null
+++ b/bridges/source/cpp_uno/gcc3_ios/helper.s
@@ -0,0 +1,471 @@
+// -*- Mode: Asm; tab-width: 4; tab-stop-list: (4 12 32); comment-column: 30; comment-start: "// "; indent-tabs-mode: nil -*-
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// This file incorporates work covered by the following license notice:
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed
+// with this work for additional information regarding copyright
+// ownership. The ASF licenses this file to you under the Apache
+// License, Version 2.0 (the "License"); you may not use this file
+// except in compliance with the License. You may obtain a copy of
+// the License at http://www.apache.org/licenses/LICENSE-2.0 .
+//
+
+#include "codesnippets.S"
+
+#if defined(__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>
+
+ .text
+ .align 4
+
+_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
+
+#elif defined(__arm64)
+
+ .text
+ .align 4
+
+_privateSnippetExecutor:
+
+ .cfi_startproc
+ // _privateSnippetExecutor is jumped to from each of the
+ // codeSnippet_* generated by generate-snippets.pl
+
+ // Store potential args in general purpose registers
+ stp x6, x7, [sp, #-16]!
+ stp x4, x5, [sp, #-16]!
+ stp x2, x3, [sp, #-16]!
+ stp x0, x1, [sp, #-16]!
+
+ // Store potential args in floating point/SIMD registers
+ stp d6, d7, [sp, #-16]!
+ stp d4, d5, [sp, #-16]!
+ stp d2, d3, [sp, #-16]!
+ stp d0, d1, [sp, #-16]!
+
+ // First argument to cpp_vtable_call: The x15 set up in the codeSnippet instance
+ mov x0, x15
+ // Store x8 (potential pointer to return value storage) and lr
+ stp x8, lr, [sp, #-16]!
+ // Second argument: The pointer to all the above
+ mov x1, sp
+
+ bl _cpp_vtable_call
+
+ ldp x8, lr, [sp, #0]
+ add sp, sp, #144
+ ret lr
+ .cfi_endproc
+
+#elif defined(__i386)
+ // i386 code, for the simulator
+ .text
+
+.align 1, 0x90
+_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
+_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
+_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
+_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
+_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
+_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:
+_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:
+_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:
+_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:
+_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:
+_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:
+_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
+#else
+
+ .text
+ .align 2
+.globl privateSnippetExecutor
+_privateSnippetExecutor:
+.LFB3:
+ pushq %rbp
+.LCFI0:
+ movq %rsp, %rbp
+.LCFI1:
+ subq $160, %rsp
+.LCFI2:
+ movq %r10, -152(%rbp) # Save (nVtableOffset << 32) + nFunctionIndex
+
+ movq %rdi, -112(%rbp) # Save GP registers
+ movq %rsi, -104(%rbp)
+ movq %rdx, -96(%rbp)
+ movq %rcx, -88(%rbp)
+ movq %r8 , -80(%rbp)
+ movq %r9 , -72(%rbp)
+
+ movsd %xmm0, -64(%rbp) # Save FP registers
+ movsd %xmm1, -56(%rbp)
+ movsd %xmm2, -48(%rbp)
+ movsd %xmm3, -40(%rbp)
+ movsd %xmm4, -32(%rbp)
+ movsd %xmm5, -24(%rbp)
+ movsd %xmm6, -16(%rbp)
+ movsd %xmm7, -8(%rbp)
+
+ leaq -144(%rbp), %r9 # 6th param: sal_uInt64 * pRegisterReturn
+ leaq 16(%rbp), %r8 # 5rd param: void ** ovrflw
+ leaq -64(%rbp), %rcx # 4th param: void ** fpreg
+ leaq -112(%rbp), %rdx # 3rd param: void ** gpreg
+ movl -148(%rbp), %esi # 2nd param: sal_int32 nVtableOffset
+ movl -152(%rbp), %edi # 1st param: sal_int32 nFunctionIndex
+
+ call cpp_vtable_call
+
+ cmp $10, %rax # typelib_TypeClass_FLOAT
+ je .Lfloat
+ cmp $11, %rax # typelib_TypeClass_DOUBLE
+ je .Lfloat
+
+ movq -144(%rbp), %rax # Return value (int case)
+ movq -136(%rbp), %rdx # Return value (int case)
+ movq -144(%rbp), %xmm0 # Return value (int case)
+ movq -136(%rbp), %xmm1 # Return value (int case)
+ jmp .Lfinish
+.Lfloat:
+ movlpd -144(%rbp), %xmm0 # Return value (float/double case)
+
+.Lfinish:
+ leave
+ ret
+.LFE3:
+ # see http://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html
+ # for details of the .eh_frame, the "Common Information Entry" and "Frame Description Entry" formats
+ # and http://mentorembedded.github.io/cxx-abi/exceptions.pdf for more info
+.Lframe1:
+ .long .LECIE1-.LSCIE1
+.LSCIE1:
+ .long 0x0
+ .byte 0x1
+ .string "zR"
+ .uleb128 0x1
+ .sleb128 -8
+ .byte 0x10
+ .uleb128 0x1
+ .byte 0x1b
+ .byte 0xc
+ .uleb128 0x7
+ .uleb128 0x8
+ .byte 0x90
+ .uleb128 0x1
+ .align 8
+.LECIE1:
+.LSFDE1:
+ .long .LEFDE1-.LASFDE1
+.LASFDE1:
+ .long .LASFDE1-.Lframe1
+ .long .LFB3-.
+ .long .LFE3-.LFB3
+ .uleb128 0x0
+ .byte 0x4
+ .long .LCFI0-.LFB3
+ .byte 0xe
+ .uleb128 0x10
+ .byte 0x86
+ .uleb128 0x2
+ .byte 0x4
+ .long .LCFI1-.LCFI0
+ .byte 0xd
+ .uleb128 0x6
+ .align 8
+.LEFDE1:
+#endif
+
+// vim:set shiftwidth=4 softtabstop=4 expandtab: