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