1*b1cdbd2cSJim Jagielski @ 2*b1cdbd2cSJim Jagielski @ Licensed to the Apache Software Foundation (ASF) under one 3*b1cdbd2cSJim Jagielski @ or more contributor license agreements. See the NOTICE file 4*b1cdbd2cSJim Jagielski @ distributed with this work for additional information 5*b1cdbd2cSJim Jagielski @ regarding copyright ownership. The ASF licenses this file 6*b1cdbd2cSJim Jagielski @ to you under the Apache License, Version 2.0 (the 7*b1cdbd2cSJim Jagielski @ "License"); you may not use this file except in compliance 8*b1cdbd2cSJim Jagielski @ with the License. You may obtain a copy of the License at 9*b1cdbd2cSJim Jagielski @ 10*b1cdbd2cSJim Jagielski @ http://www.apache.org/licenses/LICENSE-2.0 11*b1cdbd2cSJim Jagielski @ 12*b1cdbd2cSJim Jagielski @ Unless required by applicable law or agreed to in writing, 13*b1cdbd2cSJim Jagielski @ software distributed under the License is distributed on an 14*b1cdbd2cSJim Jagielski @ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15*b1cdbd2cSJim Jagielski @ KIND, either express or implied. See the License for the 16*b1cdbd2cSJim Jagielski @ specific language governing permissions and limitations 17*b1cdbd2cSJim Jagielski @ under the License. 18*b1cdbd2cSJim Jagielski @ 19*b1cdbd2cSJim Jagielski 20*b1cdbd2cSJim Jagielski @ ARM support code for OpenOffice C++/UNO bridging 21*b1cdbd2cSJim Jagielski @ 22*b1cdbd2cSJim Jagielski @ Written by Peter Naulls <peter@chocky.org> 23*b1cdbd2cSJim Jagielski @ Modified by Caolan McNamara <caolanm@redhat.com> 24*b1cdbd2cSJim Jagielski @ Fixed by Michael Casadevall <mcasadevall@kubuntu.org> 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #ifdef __ARM_EABI__ 27*b1cdbd2cSJim Jagielski # define UNWIND 28*b1cdbd2cSJim Jagielski #else 29*b1cdbd2cSJim Jagielski # define UNWIND @ 30*b1cdbd2cSJim Jagielski #endif 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski .file "armhelper.s" 33*b1cdbd2cSJim Jagielski .text 34*b1cdbd2cSJim Jagielski .align 4 35*b1cdbd2cSJim Jagielski .global privateSnippetExecutor 36*b1cdbd2cSJim Jagielski .type privateSnippetExecutor, %function 37*b1cdbd2cSJim Jagielski privateSnippetExecutor: 38*b1cdbd2cSJim Jagielski UNWIND .fnstart @ start of unwinder entry 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski stmfd sp!, {r0-r3} @ follow other parameters on stack 41*b1cdbd2cSJim Jagielski UNWIND .pad #16 @ throw this data away on exception 42*b1cdbd2cSJim Jagielski mov r0, ip @ r0 points to functionoffset/vtable 43*b1cdbd2cSJim Jagielski mov r1, sp @ r1 points to this and params 44*b1cdbd2cSJim Jagielski @ (see cppuno.cxx:codeSnippet()) 45*b1cdbd2cSJim Jagielski stmfd sp!, {r4,lr} @ save return address 46*b1cdbd2cSJim Jagielski @ (r4 pushed to preserve stack alignment) 47*b1cdbd2cSJim Jagielski UNWIND .save {r4,lr} @ restore these regs on exception 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski bl cpp_vtable_call(PLT) 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski add sp, sp, #4 @ no need to restore r4 (we didn't touch it) 52*b1cdbd2cSJim Jagielski ldr pc, [sp], #20 @ return, discarding function arguments 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski UNWIND .fnend @ end of unwinder entry 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski .size privateSnippetExecutor, . - privateSnippetExecutor 57*b1cdbd2cSJim Jagielski .section .note.GNU-stack,"",%progbits 58