bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx | 14 ++ bridges/source/cpp_uno/gcc3_ios/except.cxx | 2 bridges/source/cpp_uno/gcc3_ios/generate-snippets.pl | 114 +++++++++++++++++++ bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx | 3 4 files changed, 130 insertions(+), 3 deletions(-)
New commits: commit f563a81000ce43e95e117229b72228386077f94e Author: jan Iversen <j...@libreoffice.org> Date: Thu Feb 15 18:00:33 2018 +0100 iOS, add old snippet script. We need to check if the script generated the same code always. Looks like nFunIndexes is never changed. Change-Id: Ic247cccbf1e4a75e6a0acf5807fdcf84bfcf4cb3 diff --git a/bridges/source/cpp_uno/gcc3_ios/generate-snippets.pl b/bridges/source/cpp_uno/gcc3_ios/generate-snippets.pl new file mode 100755 index 000000000000..a8548836fef3 --- /dev/null +++ b/bridges/source/cpp_uno/gcc3_ios/generate-snippets.pl @@ -0,0 +1,114 @@ +#!/usr/bin/perl -w # -*- tab-width: 4; indent-tabs-mode: nil; cperl-indent-level: 4 -*- +# +# 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/. +# + +my $nFunIndexes = 8; +my $nVtableOffsets = 4; + +sub gen_arm ($$) +{ + my ($funIndex, $vtableOffset) = @_; + if ($funIndex & 0x80000000) { + printf ("#ifndef __arm64\n"); + } + printf ("codeSnippet_%08x_%d:\n", $funIndex, $vtableOffset); + printf ("#ifdef __arm\n"); + # Note: pc is the address of instruction being executed plus 8 + printf (" mov ip, pc\n"); + printf ("#else\n"); + printf (" adr x15, .+8\n"); + printf ("#endif\n"); + printf (" b _privateSnippetExecutor\n"); + printf (" .long %#08x\n", $funIndex); + printf (" .long %d\n", $vtableOffset); + if ($funIndex & 0x80000000) { + printf ("#endif\n"); + } +} + +sub gen_x86 ($$$) +{ + my ($funIndex, $vtableOffset, $executor) = @_; + printf ("codeSnippet_%08x_%d_%s:\n", $funIndex, $vtableOffset, $executor); + printf (" movl \$%#08x, %%eax\n", $funIndex); + printf (" movl \$%d, %%edx\n", $vtableOffset); + printf (" jmp _privateSnippetExecutor%s\n", $executor); +} + +printf (".text\n"); + +printf ("#if defined(__arm) || defined(__arm64)\n"); + +printf ("\n"); +printf ("// Each codeSnippetX function stores into ip (arm64: x15) an address and branches to _privateSnippetExecutor\n"); +printf ("// The address is that following the branch instruction, containing two 32-bit ints:\n"); +printf ("// - the function index, which for 32-bit can have the 0x80000000 bit set\n"); +printf ("// to indicate that a hidden parameter is used for returning large values\n"); +printf ("// - the vtable offset\n"); +printf ("\n"); + +printf (" .align 4\n"); +printf ("\n"); + +foreach my $funIndex (0 .. $nFunIndexes-1) +{ + foreach my $vtableOffset (0 .. $nVtableOffsets-1) + { + gen_arm ($funIndex, $vtableOffset); + gen_arm ($funIndex|0x80000000, $vtableOffset); + } +} + +printf ("#else\n"); +printf (" .align 1, 0x90\n"); + +foreach my $funIndex (0 .. $nFunIndexes-1) +{ + foreach my $vtableOffset (0 .. $nVtableOffsets-1) + { + foreach my $executor ('General', 'Void', 'Hyper', 'Float', 'Double', 'Class') + { + gen_x86 ($funIndex, $vtableOffset, $executor); + gen_x86 ($funIndex|0x80000000, $vtableOffset, $executor); + } + } + } + +printf ("#endif\n"); + +printf (" .globl _nFunIndexes\n"); +printf ("_nFunIndexes:\n"); +printf (" .long %d\n", $nFunIndexes); + +printf (" .globl _nVtableOffsets\n"); +printf ("_nVtableOffsets:\n"); +printf (" .long %d\n", $nVtableOffsets); + +printf (" .globl _codeSnippets\n"); +printf ("_codeSnippets:\n"); + +foreach my $funIndex (0 .. $nFunIndexes-1) +{ + foreach my $vtableOffset (0 .. $nVtableOffsets-1) + { + printf ("#if defined(__arm) || defined(__arm64)\n"); + printf (" .long codeSnippet_%08x_%d - _codeSnippets\n", $funIndex, $vtableOffset); + printf ("#ifndef __arm64\n"); + printf (" .long codeSnippet_%08x_%d - _codeSnippets\n", $funIndex|0x80000000, $vtableOffset); + printf ("#endif\n"); + printf ("#else\n"); + foreach my $executor ('General', 'Void', 'Hyper', 'Float', 'Double', 'Class') + { + printf (" .long codeSnippet_%08x_%d_%s - _codeSnippets\n", $funIndex, $vtableOffset, $executor); + printf (" .long codeSnippet_%08x_%d_%s - _codeSnippets\n", $funIndex|0x80000000, $vtableOffset, $executor); + } + printf ("#endif\n"); + } +} + +# vim:set shiftwidth=4 softtabstop=4 expandtab: commit 4b86076d5efc2e416181cc4c9e56b21870121892 Author: jan Iversen <j...@libreoffice.org> Date: Thu Feb 15 17:57:47 2018 +0100 iOS, update to original files Update to old files (from Tor in 2013) to prepare for generate. Change-Id: I832a242b7b91179e9c269fa9e48a1698aa2f2a66 diff --git a/bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx index 762dbdc8db76..0ca1401ba960 100644 --- a/bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx +++ b/bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx @@ -17,6 +17,16 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#ifdef __arm64 + +// For iOS devices (64-bit ARM). Originally a copy of +// ../gcc3_linux_arm/cpp2uno.cxx. + +// No attempts at factoring out the large amounts of more or less +// common code in this, cpp2uno-arm.cxx and cpp2uno-i386.cxx have been +// done. Which is sad. But then the whole bridges/source/cpp_uno is +// full of copy/paste. So I continue in that tradition... + #include <com/sun/star/uno/RuntimeException.hpp> #include <sal/log.hxx> #include <uno/data.h> @@ -29,7 +39,6 @@ #include "share.hxx" -#ifdef __arm64 extern "C" { extern int nFunIndexes, nVtableOffsets; extern int codeSnippets[]; @@ -290,6 +299,7 @@ namespace } } + static typelib_TypeClass cpp_mediate( sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, void ** pCallStack, @@ -544,6 +554,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( } return code; } + #endif @@ -553,4 +564,5 @@ void bridges::cpp_uno::shared::VtableFactory::flushCode( // No dynamic code generation so nothing to flush } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/bridges/source/cpp_uno/gcc3_ios/except.cxx b/bridges/source/cpp_uno/gcc3_ios/except.cxx index 17b95473f92c..1d1eeccd97ae 100644 --- a/bridges/source/cpp_uno/gcc3_ios/except.cxx +++ b/bridges/source/cpp_uno/gcc3_ios/except.cxx @@ -143,7 +143,7 @@ static OUString toUNOname( char const * p ) class RTTI { - typedef std::unordered_map< OUString, std::type_info * > t_rtti_map; + typedef std::unordered_map< OUString, std::type_info *, OUStringHash > t_rtti_map; Mutex m_mutex; t_rtti_map m_rttis; diff --git a/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx index 6d2c82fbe0d4..7915fa7a9513 100644 --- a/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx +++ b/bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx @@ -17,6 +17,8 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#ifdef __arm64 + #include <com/sun/star/uno/RuntimeException.hpp> #include "bridge.hxx" @@ -28,7 +30,6 @@ using namespace ::com::sun::star::uno; -#ifdef __arm64 namespace arm { bool is_hfa_struct(const typelib_TypeDescription * type) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits