|
| 1 | +#include <stdint.h> |
1 | 2 | #include "abort_message.h" |
2 | 3 |
|
3 | 4 | // https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor-runtime-api |
4 | 5 |
|
| 6 | +// __int64_t |
| 7 | +typedef int64_t __guard; |
| 8 | + |
5 | 9 | extern "C" { |
6 | | -void __cxa_pure_virtual(); |
7 | | -void __cxa_deleted_virtual(); |
8 | | -int __cxa_guard_acquire(long long *); |
9 | | -int __cxa_guard_release(long long *); |
10 | | -int __cxa_guard_abort(long long *); |
| 10 | +[[noreturn, gnu::cold]] void __cxa_pure_virtual(void); |
| 11 | +[[noreturn, gnu::cold]] void __cxa_deleted_virtual(void); |
| 12 | +[[gnu::cold]] int __cxa_guard_acquire(__guard *); |
| 13 | +[[gnu::cold]] void __cxa_guard_release(__guard *); |
| 14 | +[[noreturn, gnu::cold]] void __cxa_guard_abort(__guard *); |
11 | 15 | } |
12 | 16 |
|
13 | | -__attribute__((__cold__)) |
14 | | -void __cxa_pure_virtual() { |
| 17 | +void __cxa_pure_virtual(void) { |
15 | 18 | __abort_message("__cxa_pure_virtual"); |
16 | 19 | } |
17 | 20 |
|
18 | | -__attribute__((__cold__)) |
19 | | -void __cxa_deleted_virtual() { |
| 21 | +void __cxa_deleted_virtual(void) { |
20 | 22 | __abort_message("__cxa_deleted_virtual"); |
21 | 23 | } |
22 | 24 |
|
23 | | -__attribute__((__cold__)) |
24 | | -int __cxa_guard_acquire(long long *guard_object) { |
25 | | - unsigned char const *ptr = (unsigned char const *)guard_object; |
26 | | - if (*ptr == 0) { |
| 25 | +int __cxa_guard_acquire(__guard *guard_object) { |
| 26 | + unsigned char const *flag = (unsigned char const *)guard_object; |
| 27 | + if (*flag == 0) { |
27 | 28 | // initialization not yet complete |
28 | 29 | return 1; |
29 | 30 | } |
30 | 31 | // otherwise |
31 | 32 | return 0; |
32 | 33 | } |
33 | 34 |
|
34 | | -__attribute__((__cold__)) |
35 | | -int __cxa_guard_release(long long *guard_object) { |
36 | | - unsigned char *ptr = (unsigned char *)guard_object; |
| 35 | +void __cxa_guard_release(__guard *guard_object) { |
| 36 | + unsigned char *flag = (unsigned char *)guard_object; |
37 | 37 | // set to a non-zero value |
38 | | - *ptr = 1; |
39 | | - return 0; |
| 38 | + *flag = 1; |
40 | 39 | } |
41 | 40 |
|
42 | | -__attribute__((__cold__)) |
43 | | -int __cxa_guard_abort(__attribute__((__unused__)) long long *guard_object) { |
| 41 | +void __cxa_guard_abort([[maybe_unused]] __guard *guard_object) { |
44 | 42 | __abort_message("__cxa_guard_abort"); |
45 | 43 | } |
0 commit comments