diff options
Diffstat (limited to '')
-rw-r--r-- | libbb/const_hack.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/libbb/const_hack.c b/libbb/const_hack.c index 75163fede..1d175481b 100644 --- a/libbb/const_hack.c +++ b/libbb/const_hack.c | |||
@@ -9,18 +9,27 @@ | |||
9 | #include "libbb.h" | 9 | #include "libbb.h" |
10 | 10 | ||
11 | #if defined(__clang_major__) && __clang_major__ >= 9 | 11 | #if defined(__clang_major__) && __clang_major__ >= 9 |
12 | void FAST_FUNC XZALLOC_CONST_PTR(const void *pptr, size_t size) | 12 | /* Clang/llvm drops assignment to "constant" storage. Silently. |
13 | * Needs serious convincing to not eliminate the store. | ||
14 | */ | ||
15 | static ALWAYS_INLINE void* not_const_pp(const void *p) | ||
13 | { | 16 | { |
14 | ASSIGN_CONST_PTR(pptr, xzalloc(size)); | 17 | void *pp; |
18 | asm volatile ( | ||
19 | "# forget that p points to const" | ||
20 | : /*outputs*/ "=r" (pp) | ||
21 | : /*inputs*/ "0" (p) | ||
22 | ); | ||
23 | return pp; | ||
15 | } | 24 | } |
16 | 25 | void FAST_FUNC ASSIGN_CONST_PTR(const void *pptr, void *v) | |
17 | # if ENABLE_PLATFORM_MINGW32 | 26 | { |
18 | void FAST_FUNC ASSIGN_CONST_PTR(const void *pptr, const void *v) | 27 | *(void**)not_const_pp(pptr) = v; |
28 | barrier(); | ||
29 | } | ||
30 | void FAST_FUNC XZALLOC_CONST_PTR(const void *pptr, size_t size) | ||
19 | { | 31 | { |
20 | do { | 32 | *(void**)not_const_pp(pptr) = xzalloc(size); |
21 | *(void**)not_const_pp(pptr) = (void*)(v); | 33 | barrier(); |
22 | barrier(); | ||
23 | } while (0); | ||
24 | } | 34 | } |
25 | # endif | ||
26 | #endif | 35 | #endif |