xref: /trunk/main/bridges/source/cpp_uno/s5abi_macosx_x86-64/share.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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