Skip to content

Commit 4998996

Browse files
committed
[libunwind][libcxx][libcxxabi] Fix Exception Handling build for wasm
The wasm unwind build appears to be dysfunctional, likely because the author has only supplied a customized LLVM build on request, rather than a fully functional patch. This patch fixes the build Apply formatting patch proposed by github bot use "" to prevent CMAKE_SYSTEM_PROCESSOR not defined [libunwind] logAPI functions should also be built [libcxxabi] Fix function signatures for wasm wasm does not define the function signatures correctly for cxxabi Fix them Fix formatting issues for libcxxabi's wasm eh change Merge remote-tracking branch 'parent/main' into wasmlibunwindfix remove unwanted changes in unwind-wasm.c Make Unwind-wasm.c compile correctly without workaround in CMakeLists.txt using __wasm__ macro to guard against all wasm eh build fix UnwindLevel.c's formatting issue ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit] compiler-rt does not define CMP_RESULT correct on wasm64 Fixed Merge code
1 parent 676e660 commit 4998996

File tree

14 files changed

+403
-516
lines changed

14 files changed

+403
-516
lines changed

compiler-rt/lib/builtins/fp_compare_impl.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// functions. We need to ensure that the return value is sign-extended in the
1313
// same way as GCC expects (since otherwise GCC-generated __builtin_isinf
1414
// returns true for finite 128-bit floating-point numbers).
15-
#if defined(__aarch64__) || defined(__arm64ec__)
15+
#if defined(__aarch64__) || defined(__arm64ec__) || defined(__wasm__)
1616
// AArch64 GCC overrides libgcc_cmp_return to use int instead of long.
1717
typedef int CMP_RESULT;
1818
#elif __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 4

libcxx/include/__exception/exception_ptr.h

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,21 @@
2828

2929
namespace __cxxabiv1 {
3030

31+
# if defined(__wasm__)
32+
typedef void* (*__libcpp_exception_destructor_func)(void*);
33+
# elif defined(_WIN32)
34+
typedef void(__thiscall* __libcpp_exception_destructor_func)(void*);
35+
# else
36+
typedef void (*__libcpp_exception_destructor_func)(void*);
37+
# endif
38+
3139
extern "C" {
3240
_LIBCPP_OVERRIDABLE_FUNC_VIS void* __cxa_allocate_exception(size_t) throw();
3341
_LIBCPP_OVERRIDABLE_FUNC_VIS void __cxa_free_exception(void*) throw();
3442

3543
struct __cxa_exception;
36-
_LIBCPP_OVERRIDABLE_FUNC_VIS __cxa_exception* __cxa_init_primary_exception(
37-
void*,
38-
std::type_info*,
39-
# if defined(_WIN32)
40-
void(__thiscall*)(void*)) throw();
41-
# elif defined(__wasm__)
42-
// In Wasm, a destructor returns its argument
43-
void* (*)(void*)) throw();
44-
# else
45-
void (*)(void*)) throw();
46-
# endif
44+
_LIBCPP_OVERRIDABLE_FUNC_VIS __cxa_exception*
45+
__cxa_init_primary_exception(void*, std::type_info*, __libcpp_exception_destructor_func) throw();
4746
}
4847

4948
} // namespace __cxxabiv1

libcxxabi/include/cxxabi.h

Lines changed: 55 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,41 @@
2020
#include <__cxxabi_config.h>
2121

2222
#define _LIBCPPABI_VERSION 15000
23-
#define _LIBCXXABI_NORETURN __attribute__((noreturn))
23+
#define _LIBCXXABI_NORETURN __attribute__((noreturn))
2424
#define _LIBCXXABI_ALWAYS_COLD __attribute__((cold))
2525

2626
#ifdef __cplusplus
2727

2828
namespace std {
29-
#if defined(_WIN32)
29+
# if defined(_WIN32)
3030
class _LIBCXXABI_TYPE_VIS type_info; // forward declaration
31-
#else
31+
# else
3232
class type_info; // forward declaration
33-
#endif
34-
}
35-
33+
# endif
34+
} // namespace std
3635

3736
// runtime routines use C calling conventions, but are in __cxxabiv1 namespace
3837
namespace __cxxabiv1 {
3938

4039
struct __cxa_exception;
40+
# if defined(__wasm__)
41+
typedef void* (*__libcxxabi_exception_destructor_func)(void*);
42+
# else
43+
typedef void(_LIBCXXABI_DTOR_FUNC* __libcxxabi_exception_destructor_func)(void*);
44+
# endif
4145

42-
extern "C" {
46+
extern "C" {
4347

4448
// 2.4.2 Allocating the Exception Object
45-
extern _LIBCXXABI_FUNC_VIS void *
46-
__cxa_allocate_exception(size_t thrown_size) _LIBCXXABI_NOEXCEPT;
47-
extern _LIBCXXABI_FUNC_VIS void
48-
__cxa_free_exception(void *thrown_exception) _LIBCXXABI_NOEXCEPT;
49+
extern _LIBCXXABI_FUNC_VIS void* __cxa_allocate_exception(size_t thrown_size) _LIBCXXABI_NOEXCEPT;
50+
extern _LIBCXXABI_FUNC_VIS void __cxa_free_exception(void* thrown_exception) _LIBCXXABI_NOEXCEPT;
4951
// This function is an LLVM extension, which mirrors the same extension in libsupc++ and libcxxrt
50-
extern _LIBCXXABI_FUNC_VIS __cxa_exception*
51-
#ifdef __wasm__
52-
// In Wasm, a destructor returns its argument
53-
__cxa_init_primary_exception(void* object, std::type_info* tinfo, void*(_LIBCXXABI_DTOR_FUNC* dest)(void*)) _LIBCXXABI_NOEXCEPT;
54-
#else
55-
__cxa_init_primary_exception(void* object, std::type_info* tinfo, void(_LIBCXXABI_DTOR_FUNC* dest)(void*)) _LIBCXXABI_NOEXCEPT;
56-
#endif
52+
extern _LIBCXXABI_FUNC_VIS __cxa_exception* __cxa_init_primary_exception(void* object, std::type_info* tinfo,
53+
__libcxxabi_exception_destructor_func) _LIBCXXABI_NOEXCEPT;
5754

5855
// 2.4.3 Throwing the Exception Object
59-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
60-
__cxa_throw(void *thrown_exception, std::type_info *tinfo,
61-
#ifdef __wasm__
62-
void *(_LIBCXXABI_DTOR_FUNC *dest)(void *));
63-
#else
64-
void (_LIBCXXABI_DTOR_FUNC *dest)(void *));
65-
#endif
56+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_throw(void* thrown_exception, std::type_info* tinfo,
57+
__libcxxabi_exception_destructor_func);
6658

6759
// 2.5.3 Exception Handlers
6860
extern _LIBCXXABI_FUNC_VIS void *
@@ -74,8 +66,8 @@ extern _LIBCXXABI_FUNC_VIS void __cxa_end_catch();
7466
extern _LIBCXXABI_FUNC_VIS bool
7567
__cxa_begin_cleanup(void *exceptionObject) _LIBCXXABI_NOEXCEPT;
7668
extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup();
77-
#endif
78-
extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type();
69+
# endif
70+
extern _LIBCXXABI_FUNC_VIS std::type_info* __cxa_current_exception_type();
7971

8072
// GNU extension
8173
// Calls `terminate` with the current exception being caught. This function is used by GCC when a `noexcept` function
@@ -88,8 +80,7 @@ extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow();
8880
// 2.6 Auxiliary Runtime APIs
8981
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void);
9082
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
91-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
92-
__cxa_throw_bad_array_new_length(void);
83+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_throw_bad_array_new_length(void);
9384

9485
// 3.2.6 Pure Virtual Function API
9586
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
@@ -98,73 +89,58 @@ extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
9889
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
9990

10091
// 3.3.2 One-time Construction API
101-
#if defined(_LIBCXXABI_GUARD_ABI_ARM)
102-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint32_t *);
103-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint32_t *);
104-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint32_t *);
105-
#else
106-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint64_t *);
107-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint64_t *);
108-
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint64_t *);
109-
#endif
92+
# if defined(_LIBCXXABI_GUARD_ABI_ARM)
93+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint32_t*);
94+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint32_t*);
95+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint32_t*);
96+
# else
97+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD int __cxa_guard_acquire(uint64_t*);
98+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_release(uint64_t*);
99+
extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_ALWAYS_COLD void __cxa_guard_abort(uint64_t*);
100+
# endif
110101

111102
// 3.3.3 Array Construction and Destruction API
112-
extern _LIBCXXABI_FUNC_VIS void *
113-
__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size,
114-
void (*constructor)(void *), void (*destructor)(void *));
103+
extern _LIBCXXABI_FUNC_VIS void* __cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size,
104+
void (*constructor)(void*), void (*destructor)(void*));
115105

116-
extern _LIBCXXABI_FUNC_VIS void *
117-
__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size,
118-
void (*constructor)(void *), void (*destructor)(void *),
119-
void *(*alloc)(size_t), void (*dealloc)(void *));
106+
extern _LIBCXXABI_FUNC_VIS void* __cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size,
107+
void (*constructor)(void*), void (*destructor)(void*),
108+
void* (*alloc)(size_t), void (*dealloc)(void*));
120109

121-
extern _LIBCXXABI_FUNC_VIS void *
122-
__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size,
123-
void (*constructor)(void *), void (*destructor)(void *),
124-
void *(*alloc)(size_t), void (*dealloc)(void *, size_t));
110+
extern _LIBCXXABI_FUNC_VIS void* __cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size,
111+
void (*constructor)(void*), void (*destructor)(void*),
112+
void* (*alloc)(size_t), void (*dealloc)(void*, size_t));
125113

126-
extern _LIBCXXABI_FUNC_VIS void
127-
__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size,
128-
void (*constructor)(void *), void (*destructor)(void *));
114+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_ctor(void* array_address, size_t element_count, size_t element_size,
115+
void (*constructor)(void*), void (*destructor)(void*));
129116

130-
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address,
131-
size_t element_count,
132-
size_t element_size,
133-
void (*destructor)(void *));
117+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void* array_address, size_t element_count, size_t element_size,
118+
void (*destructor)(void*));
134119

135-
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address,
136-
size_t element_count,
137-
size_t element_size,
138-
void (*destructor)(void *));
120+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void* array_address, size_t element_count, size_t element_size,
121+
void (*destructor)(void*));
139122

140-
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address,
141-
size_t element_size,
142-
size_t padding_size,
143-
void (*destructor)(void *));
123+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void* array_address, size_t element_size, size_t padding_size,
124+
void (*destructor)(void*));
144125

145-
extern _LIBCXXABI_FUNC_VIS void
146-
__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size,
147-
void (*destructor)(void *), void (*dealloc)(void *));
126+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete2(void* array_address, size_t element_size, size_t padding_size,
127+
void (*destructor)(void*), void (*dealloc)(void*));
148128

149-
extern _LIBCXXABI_FUNC_VIS void
150-
__cxa_vec_delete3(void *__array_address, size_t element_size,
151-
size_t padding_size, void (*destructor)(void *),
152-
void (*dealloc)(void *, size_t));
129+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete3(void* __array_address, size_t element_size, size_t padding_size,
130+
void (*destructor)(void*), void (*dealloc)(void*, size_t));
153131

154-
extern _LIBCXXABI_FUNC_VIS void
155-
__cxa_vec_cctor(void *dest_array, void *src_array, size_t element_count,
156-
size_t element_size, void (*constructor)(void *, void *),
157-
void (*destructor)(void *));
132+
extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cctor(void* dest_array, void* src_array, size_t element_count,
133+
size_t element_size, void (*constructor)(void*, void*),
134+
void (*destructor)(void*));
158135

159136
// 3.3.5.3 Runtime API
160137
// These functions are part of the C++ ABI, but they are not defined in libc++abi:
161138
// int __cxa_atexit(void (*)(void *), void *, void *);
162139
// void __cxa_finalize(void *);
163140

164141
// 3.4 Demangler API
165-
extern _LIBCXXABI_FUNC_VIS char *__cxa_demangle(const char *mangled_name,
166-
char *output_buffer,
167-
size_t *length, int *status);
142+
extern _LIBCXXABI_FUNC_VIS char* __cxa_demangle(const char* mangled_name, char* output_buffer, size_t* length,
143+
int* status);
168144

169145
// Apple additions to support C++ 0x exception_ptr class
170146
// These are primitives to wrap a smart pointer around an exception object
@@ -180,7 +156,7 @@ __cxa_decrement_exception_refcount(void *primary_exception) _LIBCXXABI_NOEXCEPT;
180156
extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() _LIBCXXABI_NOEXCEPT;
181157
extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() _LIBCXXABI_NOEXCEPT;
182158

183-
#if defined(__linux__) || defined(__Fuchsia__)
159+
# if defined(__linux__) || defined(__Fuchsia__)
184160
// Linux and Fuchsia TLS support. Not yet an official part of the Itanium ABI.
185161
// https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
186162
extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *,

0 commit comments

Comments
 (0)