From 03aacdb73d2f797768129d54ac971b48756fa51a Mon Sep 17 00:00:00 2001 From: Jan-Marek Glogowski Date: Fri, 17 Jul 2020 22:59:07 +0200 Subject: bridges: add a Windows Arm64 UNO bridge Since Microsoft follows the general ARM64 ABI calling conventions, and the SEH exception handling is the same, this result is a mixed port of the gcc3_linux_aarch64 bridge and the refactored x86-64 exception handling. I have no idea, if the complicated 32-bit handling in RaiseInfo() is needed, as the ARM64 trampolines definitly use 64-bit code. But since this is the first working version, I currently don't mind much ;-) There is definitly more potential for refactoring in the whole bridges directory... Change-Id: I9782a2e99c0231cdd1286af156ad312229eccf39 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103642 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski --- bridges/inc/msvc/arm64.hxx | 59 +++++++++++++++++++++++++++++++++++++++++++++ bridges/inc/msvc/except.hxx | 6 ++--- 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 bridges/inc/msvc/arm64.hxx (limited to 'bridges/inc') diff --git a/bridges/inc/msvc/arm64.hxx b/bridges/inc/msvc/arm64.hxx new file mode 100644 index 000000000000..fb095446b097 --- /dev/null +++ b/bridges/inc/msvc/arm64.hxx @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * 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 . + */ + +#pragma once + +#include + +#pragma pack(push, 8) + +struct ExceptionType final +{ + sal_Int32 _n0; // flags + sal_uInt32 _pTypeInfo; // typeinfo + sal_Int32 _n1, _n2, _n3; // thiscast + sal_Int32 _n4; // object_size + sal_uInt32 _pCopyCtor; // copyctor + ExceptionTypeInfo exc_type_info; + + explicit ExceptionType(unsigned char* pCode, sal_uInt64 pCodeBase, + typelib_TypeDescription* pTD) throw(); + + ExceptionType(const ExceptionType&) = delete; + ExceptionType& operator=(const ExceptionType&) = delete; +}; + +struct RaiseInfo final +{ + sal_Int32 _n0; + sal_uInt32 _pDtor; + sal_Int32 _n2; + sal_uInt32 _types; + + // Additional fields + typelib_TypeDescription* _pTD; + unsigned char* _code; + sal_uInt64 _codeBase; + + explicit RaiseInfo(typelib_TypeDescription* pTD) throw(); +}; + +#pragma pack(pop) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/bridges/inc/msvc/except.hxx b/bridges/inc/msvc/except.hxx index 8ed49a887a24..91a6441006a3 100644 --- a/bridges/inc/msvc/except.hxx +++ b/bridges/inc/msvc/except.hxx @@ -38,15 +38,13 @@ constexpr DWORD MSVC_EH_MAGIC_PARAM = 0x19930520; // The NT Exception code that msvcrt uses ('msc' | 0xE0000000) constexpr DWORD MSVC_EH_MAGIC_CODE = 0xE06D7363; -#ifdef _M_IX86 +#if defined(_M_IX86) #define MSVC_EH_PARAMETERS 3 // Number of parameters in exception record for x86 -#else -#ifdef _M_AMD64 +#elif defined(_M_AMD64) || defined(_M_ARM64) #define MSVC_EH_PARAMETERS 4 // Number of parameters in exception record for AMD64 #else #error "Unsupported machine type" #endif -#endif class type_info; struct RaiseInfo; -- cgit