[libc] Allow LLVM_LIBC_FUNCTION macro to take another parameter for function alias. (#187154)

This commit is contained in:
lntue 2026-03-25 18:25:54 -04:00 committed by GitHub
parent 6b90f70a8c
commit 67113d9d2f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 10 deletions

View File

@ -37,7 +37,9 @@
// clang-format on
#define LLVM_LIBC_EMPTY
#define GET_NOTHING(...) 0
#define GET_SECOND(first, second, ...) second
#define GET_FIFTH(first, second, third, fourth, fifth, ...) fifth
#define EXPAND_THEN_SECOND(name) GET_SECOND(name, LLVM_LIBC_EMPTY)
#define LLVM_LIBC_ATTR(name) EXPAND_THEN_SECOND(LLVM_LIBC_FUNCTION_ATTR_##name)
@ -48,25 +50,33 @@
// symbol. Moreover, a C symbol `func` in macOS is mangled as `_func`.
#if defined(LIBC_COPT_PUBLIC_PACKAGING) && !defined(LIBC_COMPILER_IS_MSVC)
#ifndef __APPLE__
#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \
#define LLVM_LIBC_FUNCTION_IMPL_4(type, name, arglist, c_alias) \
LLVM_LIBC_ATTR(name) \
LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) \
__##name##_impl__ asm(#name); \
decltype(LIBC_NAMESPACE::name) name [[gnu::alias(#name)]]; \
__##name##_impl__ asm(c_alias); \
decltype(LIBC_NAMESPACE::name) name [[gnu::alias(c_alias)]]; \
type __##name##_impl__ arglist
#else // __APPLE__
#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \
#define LLVM_LIBC_FUNCTION_IMPL_4(type, name, arglist, c_alias) \
LLVM_LIBC_ATTR(name) \
LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) name asm("_" #name); \
LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) name asm( \
"_" c_alias); \
type name arglist
#endif // __APPLE__
#else // LIBC_COPT_PUBLIC_PACKAGING
#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) type name arglist
#define LLVM_LIBC_FUNCTION_IMPL_4(type, name, arglist, c_alias) \
type name arglist
#endif // LIBC_COPT_PUBLIC_PACKAGING
// This extra layer of macro allows `name` to be a macro to rename a function.
#define LLVM_LIBC_FUNCTION(type, name, arglist) \
LLVM_LIBC_FUNCTION_IMPL(type, name, arglist)
#define LLVM_LIBC_FUNCTION_IMPL_3(type, name, arglist) \
LLVM_LIBC_FUNCTION_IMPL_4(type, name, arglist, #name)
// LLVM_LIBC_FUNCTION(type, name, arglist) is equivalent to
// LLVM_LIBC_FUNCTION(type, name, arglist, #name)
#define LLVM_LIBC_FUNCTION(...) \
GET_FIFTH(__VA_ARGS__, LLVM_LIBC_FUNCTION_IMPL_4, LLVM_LIBC_FUNCTION_IMPL_3, \
GET_NOTHING)(__VA_ARGS__)
// At the moment, [[gnu::alias()]] is not supported on MacOS, and it is needed
// to cleanly export and alias the C++ symbol `LIBC_NAMESPACE::func` with the C

View File

@ -5,6 +5,7 @@ add_entrypoint_object(
HDRS
../expf.h
DEPENDS
libc.src.__support.macros.properties.cpu_features
libc.src.__support.mathvec.expf
FLAGS
ROUND_OPT

View File

@ -7,10 +7,33 @@
//===----------------------------------------------------------------------===//
#include "src/mathvec/expf.h"
#include "src/__support/common.h"
#include "src/__support/macros/properties/cpu_features.h"
#include "src/__support/mathvec/expf.h"
#ifndef LIBC_MATHVEC_EXPF_SYM
#if defined(LIBC_TARGET_CPU_HAS_AVX512F)
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "_ZGVeN16v_"
#elif defined(LIBC_TARGET_CPU_HAS_AVX2)
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "_ZGVdN8v_"
#elif defined(LIBC_TARGET_CPU_HAS_AVX)
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "_ZGVcN8v_"
#elif defined(LIBC_TARGET_CPU_HAS_SSE2)
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "_ZGVbN4v_"
#elif defined(LIBC_TARGET_CPU_HAS_ARM_NEON)
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "_ZGVnN4v_"
#else
#define LIBC_MATHVEC_EXPF_SYM_PREFIX "__"
#endif // LIBC_TARGET_CPU_HAS_*
#define LIBC_MATHVEC_EXPF_SYM LIBC_MATHVEC_EXPF_SYM_PREFIX "expf"
#endif // LIBC_MATHVEC_EXPF_SYM
namespace LIBC_NAMESPACE_DECL {
cpp::simd<float> expf(cpp::simd<float> x) { return mathvec::expf(x); }
LLVM_LIBC_FUNCTION(cpp::simd<float>, expf, (cpp::simd<float> x),
LIBC_MATHVEC_EXPF_SYM) {
return mathvec::expf(x);
}
} // namespace LIBC_NAMESPACE_DECL