1*5e139d9fSJim Jagielski /************************************************************** 2*5e139d9fSJim Jagielski * 3*5e139d9fSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*5e139d9fSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*5e139d9fSJim Jagielski * distributed with this work for additional information 6*5e139d9fSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*5e139d9fSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*5e139d9fSJim Jagielski * "License"); you may not use this file except in compliance 9*5e139d9fSJim Jagielski * with the License. You may obtain a copy of the License at 10*5e139d9fSJim Jagielski * 11*5e139d9fSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*5e139d9fSJim Jagielski * 13*5e139d9fSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*5e139d9fSJim Jagielski * software distributed under the License is distributed on an 15*5e139d9fSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5e139d9fSJim Jagielski * KIND, either express or implied. See the License for the 17*5e139d9fSJim Jagielski * specific language governing permissions and limitations 18*5e139d9fSJim Jagielski * under the License. 19*5e139d9fSJim Jagielski * 20*5e139d9fSJim Jagielski *************************************************************/ 21*5e139d9fSJim Jagielski 22*5e139d9fSJim Jagielski 23*5e139d9fSJim Jagielski 24*5e139d9fSJim Jagielski #include "uno/mapping.h" 25*5e139d9fSJim Jagielski 26*5e139d9fSJim Jagielski #include <typeinfo> 27*5e139d9fSJim Jagielski #include <exception> 28*5e139d9fSJim Jagielski #include <cstddef> 29*5e139d9fSJim Jagielski 30*5e139d9fSJim Jagielski namespace CPPU_CURRENT_NAMESPACE 31*5e139d9fSJim Jagielski { 32*5e139d9fSJim Jagielski 33*5e139d9fSJim Jagielski void dummy_can_throw_anything( char const * ); 34*5e139d9fSJim Jagielski 35*5e139d9fSJim Jagielski typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__))); 36*5e139d9fSJim Jagielski 37*5e139d9fSJim Jagielski // ----- the following structure is compatible with the one declared in libunwind's unwind.h 38*5e139d9fSJim Jagielski // (use forced types) 39*5e139d9fSJim Jagielski 40*5e139d9fSJim Jagielski struct _Unwind_Exception 41*5e139d9fSJim Jagielski { 42*5e139d9fSJim Jagielski uint64_t exception_class; 43*5e139d9fSJim Jagielski void * exception_cleanup; 44*5e139d9fSJim Jagielski uintptr_t private_1; 45*5e139d9fSJim Jagielski uintptr_t private_2; 46*5e139d9fSJim Jagielski }; 47*5e139d9fSJim Jagielski 48*5e139d9fSJim Jagielski struct __cxa_exception 49*5e139d9fSJim Jagielski { 50*5e139d9fSJim Jagielski /* From LLVM 10 a reserved member was added at the top of the struct on 51*5e139d9fSJim Jagielski 64-bit targets. Who the hell does that? 52*5e139d9fSJim Jagielski https://reviews.llvm.org/rG674ec1eb16678b8addc02a4b0534ab383d22fa77 53*5e139d9fSJim Jagielski It is required on arm64 (Apple Silicon): the trailing _Unwind_Exception 54*5e139d9fSJim Jagielski must be 16-byte aligned within the allocation, and only WITH this member 55*5e139d9fSJim Jagielski does unwindHeader land at a 16-byte boundary (offset 96, vs a misaligned 56*5e139d9fSJim Jagielski 88 without it). Verified empirically against this host's libc++abi. 57*5e139d9fSJim Jagielski NOTE: Apple clang version != upstream LLVM version. */ 58*5e139d9fSJim Jagielski void *reserved; 59*5e139d9fSJim Jagielski size_t referenceCount; 60*5e139d9fSJim Jagielski ::std::type_info *exceptionType; 61*5e139d9fSJim Jagielski void (*exceptionDestructor)(void *); 62*5e139d9fSJim Jagielski ::std::unexpected_handler unexpectedHandler; 63*5e139d9fSJim Jagielski ::std::terminate_handler terminateHandler; 64*5e139d9fSJim Jagielski __cxa_exception *nextException; 65*5e139d9fSJim Jagielski int handlerCount; 66*5e139d9fSJim Jagielski int handlerSwitchValue; 67*5e139d9fSJim Jagielski const unsigned char *actionRecord; 68*5e139d9fSJim Jagielski const unsigned char *languageSpecificData; 69*5e139d9fSJim Jagielski void *catchTemp; 70*5e139d9fSJim Jagielski void *adjustedPtr; 71*5e139d9fSJim Jagielski _Unwind_Exception unwindHeader; 72*5e139d9fSJim Jagielski }; 73*5e139d9fSJim Jagielski 74*5e139d9fSJim Jagielski extern "C" void *__cxa_allocate_exception( 75*5e139d9fSJim Jagielski std::size_t thrown_size ) throw(); 76*5e139d9fSJim Jagielski extern "C" void __cxa_throw ( 77*5e139d9fSJim Jagielski void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn)); 78*5e139d9fSJim Jagielski 79*5e139d9fSJim Jagielski struct __cxa_eh_globals 80*5e139d9fSJim Jagielski { 81*5e139d9fSJim Jagielski __cxa_exception *caughtExceptions; 82*5e139d9fSJim Jagielski unsigned int uncaughtExceptions; 83*5e139d9fSJim Jagielski }; 84*5e139d9fSJim Jagielski extern "C" __cxa_eh_globals *__cxa_get_globals () throw(); 85*5e139d9fSJim Jagielski 86*5e139d9fSJim Jagielski // ----- 87*5e139d9fSJim Jagielski 88*5e139d9fSJim Jagielski // on OSX 64bit the class_type_info classes are specified 89*5e139d9fSJim Jagielski // in http://refspecs.linuxbase.org/cxxabi-1.86.html#rtti but 90*5e139d9fSJim Jagielski // these details are not generally available in a public header 91*5e139d9fSJim Jagielski // of most development environments. So we define them here. 92*5e139d9fSJim Jagielski // NOTE: https://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf 93*5e139d9fSJim Jagielski class __class_type_info : public std::type_info 94*5e139d9fSJim Jagielski { 95*5e139d9fSJim Jagielski public: __class_type_info(const char * pRttiName)96*5e139d9fSJim Jagielski explicit __class_type_info( const char* pRttiName) 97*5e139d9fSJim Jagielski : std::type_info( pRttiName) 98*5e139d9fSJim Jagielski {} 99*5e139d9fSJim Jagielski }; 100*5e139d9fSJim Jagielski 101*5e139d9fSJim Jagielski class __si_class_type_info : public __class_type_info 102*5e139d9fSJim Jagielski { 103*5e139d9fSJim Jagielski const __class_type_info* mpBaseType; 104*5e139d9fSJim Jagielski public: __si_class_type_info(const char * pRttiName,__class_type_info * pBaseType)105*5e139d9fSJim Jagielski explicit __si_class_type_info( const char* pRttiName, __class_type_info* pBaseType) 106*5e139d9fSJim Jagielski : __class_type_info( pRttiName), mpBaseType( pBaseType) 107*5e139d9fSJim Jagielski {} 108*5e139d9fSJim Jagielski }; 109*5e139d9fSJim Jagielski 110*5e139d9fSJim Jagielski //================================================================================================== 111*5e139d9fSJim Jagielski void raiseException( 112*5e139d9fSJim Jagielski uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ); 113*5e139d9fSJim Jagielski //================================================================================================== 114*5e139d9fSJim Jagielski void fillUnoException( 115*5e139d9fSJim Jagielski __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno ); 116*5e139d9fSJim Jagielski } 117