1809f4227SJim Jagielski /************************************************************** 2809f4227SJim Jagielski * 3809f4227SJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4809f4227SJim Jagielski * or more contributor license agreements. See the NOTICE file 5809f4227SJim Jagielski * distributed with this work for additional information 6809f4227SJim Jagielski * regarding copyright ownership. The ASF licenses this file 7809f4227SJim Jagielski * to you under the Apache License, Version 2.0 (the 8809f4227SJim Jagielski * "License"); you may not use this file except in compliance 9809f4227SJim Jagielski * with the License. You may obtain a copy of the License at 10809f4227SJim Jagielski * 11809f4227SJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12809f4227SJim Jagielski * 13809f4227SJim Jagielski * Unless required by applicable law or agreed to in writing, 14809f4227SJim Jagielski * software distributed under the License is distributed on an 15809f4227SJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16809f4227SJim Jagielski * KIND, either express or implied. See the License for the 17809f4227SJim Jagielski * specific language governing permissions and limitations 18809f4227SJim Jagielski * under the License. 19809f4227SJim Jagielski * 20809f4227SJim Jagielski *************************************************************/ 21809f4227SJim Jagielski 22809f4227SJim Jagielski 23809f4227SJim Jagielski 24809f4227SJim Jagielski #include "uno/mapping.h" 25809f4227SJim Jagielski 26809f4227SJim Jagielski #include <typeinfo> 27809f4227SJim Jagielski #include <exception> 28809f4227SJim Jagielski #include <cstddef> 29809f4227SJim Jagielski 30809f4227SJim Jagielski namespace CPPU_CURRENT_NAMESPACE 31809f4227SJim Jagielski { 32809f4227SJim Jagielski 33809f4227SJim Jagielski void dummy_can_throw_anything( char const * ); 34809f4227SJim Jagielski 35809f4227SJim Jagielski typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__))); 36809f4227SJim Jagielski 37809f4227SJim Jagielski // ----- the following structure is compatible with the one declared in libunwind's unwind.h 38809f4227SJim Jagielski // (use forced types) 39809f4227SJim Jagielski 40809f4227SJim Jagielski struct _Unwind_Exception 41809f4227SJim Jagielski { 42809f4227SJim Jagielski uint64_t exception_class; 43809f4227SJim Jagielski void * exception_cleanup; 44809f4227SJim Jagielski uintptr_t private_1; 45809f4227SJim Jagielski uintptr_t private_2; 46809f4227SJim Jagielski }; 47809f4227SJim Jagielski 48809f4227SJim Jagielski struct __cxa_exception 49809f4227SJim Jagielski { 50*a3aaa315SJim Jagielski /* From LLVM 10 - Added reserved member at top of struct. Who the hell does that? 51*a3aaa315SJim Jagielski https://reviews.llvm.org/rG674ec1eb16678b8addc02a4b0534ab383d22fa77 52*a3aaa315SJim Jagielski NOTE: Apple clang version != real LLVM version. Don't be fooled! 53*a3aaa315SJim Jagielski */ 54*a3aaa315SJim Jagielski #if 0 55*a3aaa315SJim Jagielski void *reserved; 56809f4227SJim Jagielski #endif 57*a3aaa315SJim Jagielski size_t referenceCount; 58809f4227SJim Jagielski ::std::type_info *exceptionType; 59809f4227SJim Jagielski void (*exceptionDestructor)(void *); 60809f4227SJim Jagielski ::std::unexpected_handler unexpectedHandler; 61809f4227SJim Jagielski ::std::terminate_handler terminateHandler; 62809f4227SJim Jagielski __cxa_exception *nextException; 63809f4227SJim Jagielski int handlerCount; 64809f4227SJim Jagielski int handlerSwitchValue; 65809f4227SJim Jagielski const unsigned char *actionRecord; 66809f4227SJim Jagielski const unsigned char *languageSpecificData; 67809f4227SJim Jagielski void *catchTemp; 68809f4227SJim Jagielski void *adjustedPtr; 69809f4227SJim Jagielski _Unwind_Exception unwindHeader; 70809f4227SJim Jagielski }; 71809f4227SJim Jagielski 72809f4227SJim Jagielski extern "C" void *__cxa_allocate_exception( 73809f4227SJim Jagielski std::size_t thrown_size ) throw(); 74809f4227SJim Jagielski extern "C" void __cxa_throw ( 75809f4227SJim Jagielski void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn)); 76809f4227SJim Jagielski 77809f4227SJim Jagielski struct __cxa_eh_globals 78809f4227SJim Jagielski { 79809f4227SJim Jagielski __cxa_exception *caughtExceptions; 80809f4227SJim Jagielski unsigned int uncaughtExceptions; 81809f4227SJim Jagielski }; 82809f4227SJim Jagielski extern "C" __cxa_eh_globals *__cxa_get_globals () throw(); 83809f4227SJim Jagielski 84809f4227SJim Jagielski // ----- 85809f4227SJim Jagielski 86809f4227SJim Jagielski // on OSX 64bit the class_type_info classes are specified 87809f4227SJim Jagielski // in http://refspecs.linuxbase.org/cxxabi-1.86.html#rtti but 88809f4227SJim Jagielski // these details are not generally available in a public header 89809f4227SJim Jagielski // of most development environments. So we define them here. 90809f4227SJim Jagielski // NOTE: https://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf 91809f4227SJim Jagielski class __class_type_info : public std::type_info 92809f4227SJim Jagielski { 93809f4227SJim Jagielski public: __class_type_info(const char * pRttiName)94809f4227SJim Jagielski explicit __class_type_info( const char* pRttiName) 95809f4227SJim Jagielski : std::type_info( pRttiName) 96809f4227SJim Jagielski {} 97809f4227SJim Jagielski }; 98809f4227SJim Jagielski 99809f4227SJim Jagielski class __si_class_type_info : public __class_type_info 100809f4227SJim Jagielski { 101809f4227SJim Jagielski const __class_type_info* mpBaseType; 102ecf1c5e9SJim Jagielski public: __si_class_type_info(const char * pRttiName,__class_type_info * pBaseType)103809f4227SJim Jagielski explicit __si_class_type_info( const char* pRttiName, __class_type_info* pBaseType) 104809f4227SJim Jagielski : __class_type_info( pRttiName), mpBaseType( pBaseType) 105809f4227SJim Jagielski {} 106809f4227SJim Jagielski }; 107809f4227SJim Jagielski 108809f4227SJim Jagielski //================================================================================================== 109809f4227SJim Jagielski void raiseException( 110809f4227SJim Jagielski uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ); 111809f4227SJim Jagielski //================================================================================================== 112809f4227SJim Jagielski void fillUnoException( 113809f4227SJim Jagielski __cxa_exception * header, uno_Any *, uno_Mapping * pCpp2Uno ); 114809f4227SJim Jagielski } 115