| /* This is meant to override Musl's src/include/features.h |
| * |
| * We use a separate file here to redefine some attributes that don't work on |
| * all platforms that we would like to build on. |
| */ |
| |
| #ifndef FEATURES_H |
| #define FEATURES_H |
| |
| /* Get the required `#include "../../include/features.h"` since we can't use |
| * the relative path. The C macros need double indirection to get a usable |
| * string. */ |
| #define _stringify_inner(s) #s |
| #define _stringify(s) _stringify_inner(s) |
| #include _stringify(ROOT_INCLUDE_FEATURES) |
| |
| #if defined(__APPLE__) |
| #define weak __attribute__((__weak__)) |
| #define hidden __attribute__((__visibility__("hidden"))) |
| |
| /* We _should_ be able to define this as: |
| * _Pragma(_stringify(weak musl_ ## new = musl_ ## old)) |
| * However, weak symbols aren't handled correctly [1]. So we manually write |
| * wrappers, which are in `alias.c`. |
| * |
| * [1]: https://github.com/llvm/llvm-project/issues/111321 |
| */ |
| #define weak_alias(old, new) /* nothing */ |
| |
| #else |
| #define weak __attribute__((__weak__)) |
| #define hidden __attribute__((__visibility__("hidden"))) |
| #define weak_alias(old, new) \ |
| extern __typeof(old) musl_ ## new \ |
| __attribute__((__weak__, __alias__(_stringify(musl_ ## old)))) |
| |
| #endif /* defined(__APPLE__) */ |
| |
| #endif |