|
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