xref: /AOO42X/main/bridges/source/cpp_uno/s5abi_macosx_x86-64/share.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
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