|
37 | 37 |
|
38 | 38 | #define LLVM_LIBC_ATTR(name) EXPAND_THEN_SECOND(LLVM_LIBC_FUNCTION_ATTR_##name)
|
39 | 39 |
|
40 |
| -// MacOS needs to be excluded because it does not support aliasing. |
41 |
| -#if defined(LIBC_COPT_PUBLIC_PACKAGING) && (!defined(__APPLE__)) |
| 40 | +// At the moment, [[gnu::alias()]] is not supported on MacOS, and it is needed |
| 41 | +// to cleanly export and alias the C++ symbol `LIBC_NAMESPACE::func` with the C |
| 42 | +// symbol `func`. So for public packaging on MacOS, we will only export the C |
| 43 | +// symbol. Moreover, a C symbol `func` in macOS is mangled as `_func`. |
| 44 | +#if defined(LIBC_COPT_PUBLIC_PACKAGING) |
| 45 | +#ifndef __APPLE__ |
42 | 46 | #define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \
|
43 | 47 | LLVM_LIBC_ATTR(name) \
|
44 | 48 | LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) \
|
45 | 49 | __##name##_impl__ __asm__(#name); \
|
46 | 50 | decltype(LIBC_NAMESPACE::name) name [[gnu::alias(#name)]]; \
|
47 | 51 | type __##name##_impl__ arglist
|
48 |
| -#else |
| 52 | +#else // __APPLE__ |
| 53 | +#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \ |
| 54 | + LLVM_LIBC_ATTR(name) \ |
| 55 | + LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) name asm("_" #name); \ |
| 56 | + type name arglist |
| 57 | +#endif // __APPLE__ |
| 58 | +#else // LIBC_COPT_PUBLIC_PACKAGING |
49 | 59 | #define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) type name arglist
|
50 |
| -#endif |
| 60 | +#endif // LIBC_COPT_PUBLIC_PACKAGING |
51 | 61 |
|
52 | 62 | // This extra layer of macro allows `name` to be a macro to rename a function.
|
53 | 63 | #define LLVM_LIBC_FUNCTION(type, name, arglist) \
|
|
0 commit comments