diff options
Diffstat (limited to 'bridges/source/cpp_uno/msvc_win32_x86-64/call.asm')
-rw-r--r-- | bridges/source/cpp_uno/msvc_win32_x86-64/call.asm | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/bridges/source/cpp_uno/msvc_win32_x86-64/call.asm b/bridges/source/cpp_uno/msvc_win32_x86-64/call.asm deleted file mode 100644 index 406e78d39..000000000 --- a/bridges/source/cpp_uno/msvc_win32_x86-64/call.asm +++ /dev/null @@ -1,133 +0,0 @@ -; -*- Mode: text; tab-width: 8; indent-tabs-mode: nil comment-column: 44; comment-start: ";; " comment-start-skip: ";; *" -*- - -;; Version: MPL 1.1 / GPLv3+ / LGPLv3+ -;; -;; The contents of this file are subject to the Mozilla Public License Version -;; 1.1 (the "License"); you may not use this file except in compliance with -;; the License or as specified alternatively below. You may obtain a copy of -;; the License at http://www.mozilla.org/MPL/ -;; -;; Software distributed under the License is distributed on an "AS IS" basis, -;; WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -;; for the specific language governing rights and limitations under the -;; License. -;; -;; The Initial Developer of the Original Code is -;; Novell, Inc. -;; Portions created by the Initial Developer are Copyright (C) 2011 -;; Novell, Inc. All Rights Reserved. -;; -;; Major Contributor(s): -;; Tor Lillqvist <tml@iki.fi> -;; Portions created by Tor Lillqvist are Copyright (C) 2011 Tor Lillqvist. All Rights Reserved. -;; -;; For minor contributions see the git repository. -;; -;; Alternatively, the contents of this file may be used under the terms of -;; either the GNU General Public License Version 3 or later (the "GPLv3+"), or -;; the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), -;; in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable -;; instead of those above. - -;; This is the function jumped to from the trampoline generated by -;; codeSnippet() in cpp2uno.cxx. Here we call cpp_vtable_call() which -;; then calls the actual UNO function. - -;; The code snippet generated is called from "normal" C++ code which -;; has no idea that it is calling dynamically generated code. - -;; The generated short code snippet is not covered by any function -;; table and unwind info, but that doesn't matter, as the instructions -;; in it are not really going to cause any exception. Once it jumps -;; here it is covered by a function table, and the calls further down -;; through cpp_vtable_call() can be unwound cleanly. - -;; This is in a separate file for x86-64 as MSVC doesn't have in-line -;; assembly for x64. - -;; Random web links and other documentation about low-level -;; implementation details for the C++/UNO bridge on x64 Windows kept -;; here: - -;; Caolan's "Lazy Hackers Guide To Porting" is useful: -;; http://wiki.services.openoffice.org/wiki/Lazy_Hackers_Guide_To_Porting - -;; As for details about the x64 Windows calling convention, register -;; usage, stack usage, exception handling etc, the official -;; documentation (?) on MSDN is a bit fragmented and split up into a -;; needlessly large number of short pages. But still: -;; http://msdn.microsoft.com/en-us/library/7kcdt6fy%28v=VS.90%29.aspx - -;; Also see Raymond Chen's blog post: -;; http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx - -;; This one is actually more readable: "Improving Automated Analysis -;; of Windows x64 Binaries": http://www.uninformed.org/?v=4&a=1 - -;; This one has a mass of information about different architectures -;; and compilers, and contains some details about the x64 Windows -;; calling convention in particular that Microsoft doesn't mention -;; above: -;; http://www.agner.org/optimize/calling_conventions.pdf - -;; Random interesting discussion threads: -;; http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/300bd6d3-9381-4d2d-8129-e48b392c05d8 - -;; Ken Johnson's blog http://www.nynaeve.net/ has much interesting -;; information, for instance: -;; http://www.nynaeve.net/?p=11 - -typelib_TypeClass_FLOAT equ 10 -typelib_TypeClass_DOUBLE equ 11 - -extern cpp_vtable_call: proc - -.code - -privateSnippetExecutor proc frame - - ;; Make stack frame. Re-align RSP at 16 bytes. We need just one - ;; qword of stack for our own purposes: Where cpp_vtable_call() - ;; will store the return value of the UNO callee. But we of course - ;; must also allocate space for the functions we call (i.e., just - ;; cpp_vtable_call()) to spill their register parameters. - - sub rsp, 40 - .allocstack (40) - .endprolog - - ;; Call cpp_vtable_call() with 2 parameters: - - ;; 1 (rcx): nOffsetAndIndex (already put there in code generated by codeSnippet) - ;; 2 (rdx): pointer to where to store return value, followed by our - ;; return address (uninteresting to cpp_vtable_call()), followed - ;; by our spilled register parameters, as stored above, followed - ;; by the rest of our parameters, if any. - - lea rdx, 32[rsp] - - call cpp_vtable_call - - ;; cpp_vtable_call() returns the typelib_TypeClass type of the - ;; return value of the called UNO function - - cmp rax, typelib_TypeClass_FLOAT - je Lfloat - - cmp rax, typelib_TypeClass_DOUBLE - je Lfloat - - mov rax, qword ptr 32[rsp] - jmp Lepilogue - -Lfloat: - movsd xmm0, qword ptr 32[rsp] - -Lepilogue: - add rsp, 40 - ret -privateSnippetExecutor endp - -end - -; vim:set shiftwidth=4 softtabstop=4 expandtab: |