|
20 | 20 |
|
21 | 21 | #include "libc/mem/mem.h"
|
22 | 22 |
|
23 |
| -using ctl::align_val_t; |
| 23 | +COSMOPOLITAN_C_START_ |
24 | 24 |
|
25 |
| -namespace { |
26 |
| - |
27 |
| -constexpr auto a1 = align_val_t(1); |
28 |
| - |
29 |
| -} // namespace |
30 |
| - |
31 |
| -void* |
32 |
| -operator new(size_t n, align_val_t a) |
| 25 | +static void* |
| 26 | +_ctl_alloc(size_t n, size_t a) |
33 | 27 | {
|
34 | 28 | void* p;
|
35 |
| - if (!(p = memalign(static_cast<size_t>(a), n))) { |
| 29 | + if (!(p = memalign(a, n))) |
36 | 30 | __builtin_trap();
|
37 |
| - } |
38 | 31 | return p;
|
39 | 32 | }
|
40 | 33 |
|
41 |
| -void* |
42 |
| -operator new[](size_t n, align_val_t a) |
| 34 | +static void* |
| 35 | +_ctl_alloc1(size_t n) |
43 | 36 | {
|
44 |
| - return operator new(n, a); |
45 |
| -} |
46 |
| -void* |
47 |
| -operator new(size_t n) |
48 |
| -{ |
49 |
| - return operator new(n, a1); |
50 |
| -} |
51 |
| -void* |
52 |
| -operator new[](size_t n) |
53 |
| -{ |
54 |
| - return operator new(n, a1); |
| 37 | + return _ctl_alloc(n, 1); |
55 | 38 | }
|
56 | 39 |
|
57 |
| -void* |
58 |
| -operator new(size_t, void* p) |
59 |
| -{ |
60 |
| - return p; |
61 |
| -} |
62 |
| -void* |
63 |
| -operator new[](size_t, void* p) |
| 40 | +static void* |
| 41 | +_ctl_ret(size_t, void* p) |
64 | 42 | {
|
65 | 43 | return p;
|
66 | 44 | }
|
67 | 45 |
|
68 |
| -void |
69 |
| -operator delete(void* p) noexcept |
70 |
| -{ |
71 |
| - free(p); |
72 |
| -} |
73 |
| -void |
74 |
| -operator delete[](void* p) noexcept |
75 |
| -{ |
76 |
| - free(p); |
77 |
| -} |
78 |
| -void |
79 |
| -operator delete(void* p, align_val_t) noexcept |
80 |
| -{ |
81 |
| - free(p); |
82 |
| -} |
83 |
| -void |
84 |
| -operator delete[](void* p, align_val_t) noexcept |
85 |
| -{ |
86 |
| - free(p); |
87 |
| -} |
88 |
| -void |
89 |
| -operator delete(void* p, size_t) noexcept |
90 |
| -{ |
91 |
| - free(p); |
92 |
| -} |
93 |
| -void |
94 |
| -operator delete[](void* p, size_t) noexcept |
95 |
| -{ |
96 |
| - free(p); |
97 |
| -} |
98 |
| -void |
99 |
| -operator delete(void* p, size_t, align_val_t) noexcept |
100 |
| -{ |
101 |
| - free(p); |
102 |
| -} |
103 |
| -void |
104 |
| -operator delete[](void* p, size_t, align_val_t) noexcept |
| 46 | +static void |
| 47 | +_ctl_free(void* p) |
105 | 48 | {
|
106 | 49 | free(p);
|
107 | 50 | }
|
108 | 51 |
|
109 |
| -void |
110 |
| -operator delete(void*, void*) noexcept |
111 |
| -{ |
112 |
| -} |
113 |
| -void |
114 |
| -operator delete[](void*, void*) noexcept |
| 52 | +static void |
| 53 | +_ctl_nop(void*, void*) |
115 | 54 | {
|
116 | 55 | }
|
| 56 | + |
| 57 | +COSMOPOLITAN_C_END_ |
| 58 | + |
| 59 | +#undef __weak_reference |
| 60 | +#define __weak_reference(P, A) P __attribute__((weak, alias(#A))) |
| 61 | + |
| 62 | +/* The ISO says that these should be replaceable by user code. It also says |
| 63 | + that the declarations for the first four (i.e. non placement-) operators |
| 64 | + new are implicitly available in each translation unit, including the std |
| 65 | + align_val_t parameter. (?) However, <new> also _defines_ the align_val_t |
| 66 | + type so you can’t just write your own. Our way through this morass is to |
| 67 | + supply ours as ctl::align_val_t and not implicitly declare anything, for |
| 68 | + now. If you have any brain cells left after reading this comment then go |
| 69 | + look at the eight operator delete weak references to free in the below. */ |
| 70 | + |
| 71 | +__weak_reference(void* operator new(size_t, ctl::align_val_t), _ctl_alloc); |
| 72 | +__weak_reference(void* operator new[](size_t, ctl::align_val_t), _ctl_alloc); |
| 73 | +__weak_reference(void* operator new(size_t), _ctl_alloc1); |
| 74 | +__weak_reference(void* operator new[](size_t), _ctl_alloc1); |
| 75 | + |
| 76 | +// XXX clang-format currently mutilates these for some reason. |
| 77 | +// clang-format off |
| 78 | + |
| 79 | +__weak_reference(void* operator new(size_t, void*), _ctl_ret); |
| 80 | +__weak_reference(void* operator new[](size_t, void*), _ctl_ret); |
| 81 | + |
| 82 | +__weak_reference(void operator delete(void*) noexcept, _ctl_free); |
| 83 | +__weak_reference(void operator delete[](void*) noexcept, _ctl_free); |
| 84 | +#pragma GCC diagnostic push |
| 85 | +#pragma GCC diagnostic ignored "-Wattribute-alias=" |
| 86 | +__weak_reference(void operator delete(void*, ctl::align_val_t) noexcept, |
| 87 | + _ctl_free); |
| 88 | +__weak_reference(void operator delete[](void*, ctl::align_val_t) noexcept, |
| 89 | + _ctl_free); |
| 90 | +__weak_reference(void operator delete(void*, size_t) noexcept, _ctl_free); |
| 91 | +__weak_reference(void operator delete[](void*, size_t) noexcept, _ctl_free); |
| 92 | +__weak_reference(void operator delete(void*, size_t, ctl::align_val_t) noexcept, |
| 93 | + _ctl_free); |
| 94 | +__weak_reference(void operator delete[](void*, size_t, ctl::align_val_t) |
| 95 | + noexcept, _ctl_free); |
| 96 | +#pragma GCC diagnostic pop |
| 97 | + |
| 98 | +__weak_reference(void operator delete(void*, void*) noexcept, _ctl_nop); |
| 99 | +__weak_reference(void operator delete[](void*, void*) noexcept, _ctl_nop); |
0 commit comments