mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 00:36:34 +00:00
[libc] Allow each function can have extra attributes by defining LLVM_LIBC_FUNCTION_ATTR_func macro. (#116160)
This commit is contained in:
parent
07137ce3e1
commit
14667119bc
@ -21,9 +21,25 @@
|
||||
#define LLVM_LIBC_FUNCTION_ATTR
|
||||
#endif
|
||||
|
||||
// Allow each function `func` to have extra attributes specified by defining:
|
||||
// `LLVM_LIBC_FUNCTION_ATTR_func` macro, which should always start with
|
||||
// "LLVM_LIBC_EMPTY, "
|
||||
//
|
||||
// For examples:
|
||||
// #define LLVM_LIBC_FUNCTION_ATTR_memcpy LLVM_LIBC_EMPTY, [[gnu::weak]]
|
||||
// #define LLVM_LIBC_FUNCTION_ATTR_memchr LLVM_LIBC_EMPTY, [[gnu::weak]] \
|
||||
// [[gnu::visibility("default")]]
|
||||
#define LLVM_LIBC_EMPTY
|
||||
|
||||
#define GET_SECOND(first, second, ...) second
|
||||
#define EXPAND_THEN_SECOND(name) GET_SECOND(name, LLVM_LIBC_EMPTY)
|
||||
|
||||
#define LLVM_LIBC_ATTR(name) EXPAND_THEN_SECOND(LLVM_LIBC_FUNCTION_ATTR_##name)
|
||||
|
||||
// MacOS needs to be excluded because it does not support aliasing.
|
||||
#if defined(LIBC_COPT_PUBLIC_PACKAGING) && (!defined(__APPLE__))
|
||||
#define LLVM_LIBC_FUNCTION_IMPL(type, name, arglist) \
|
||||
LLVM_LIBC_ATTR(name) \
|
||||
LLVM_LIBC_FUNCTION_ATTR decltype(LIBC_NAMESPACE::name) \
|
||||
__##name##_impl__ __asm__(#name); \
|
||||
decltype(LIBC_NAMESPACE::name) name [[gnu::alias(#name)]]; \
|
||||
|
@ -59,7 +59,7 @@ def libc_function(
|
||||
srcs,
|
||||
weak = False,
|
||||
copts = None,
|
||||
local_defines = None,
|
||||
local_defines = [],
|
||||
**kwargs):
|
||||
"""Add target for a libc function.
|
||||
|
||||
@ -108,16 +108,20 @@ def libc_function(
|
||||
name = libc_internal_target(name),
|
||||
srcs = srcs,
|
||||
copts = copts,
|
||||
local_defines = local_defines,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
# This second target is the llvm libc C function with either a default or hidden visibility.
|
||||
# All other functions are hidden.
|
||||
func_attrs = ["__attribute__((visibility(\"default\")))"]
|
||||
if weak:
|
||||
func_attrs = func_attrs + ["__attribute__((weak))"]
|
||||
local_defines = local_defines or ["LIBC_COPT_PUBLIC_PACKAGING"]
|
||||
local_defines = local_defines + ["LLVM_LIBC_FUNCTION_ATTR='%s'" % " ".join(func_attrs)]
|
||||
func_attrs = [
|
||||
"LLVM_LIBC_FUNCTION_ATTR_" + name + "='LLVM_LIBC_EMPTY, [[gnu::weak]]'",
|
||||
] if weak else []
|
||||
|
||||
local_defines = (local_defines
|
||||
+ ["LIBC_COPT_PUBLIC_PACKAGING"]
|
||||
+ ["LLVM_LIBC_FUNCTION_ATTR='[[gnu::visibility(\"default\")]]'"]
|
||||
+ func_attrs)
|
||||
_libc_library(
|
||||
name = name,
|
||||
hidden = True,
|
||||
|
Loading…
x
Reference in New Issue
Block a user