Skip to content

Commit

Permalink
[libc] Allow each function can have extra attributes by defining LLVM…
Browse files Browse the repository at this point in the history
…_LIBC_FUNCTION_ATTR_func macro. (#116160)
  • Loading branch information
lntue authored Nov 20, 2024
1 parent 07137ce commit 1466711
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
16 changes: 16 additions & 0 deletions libc/src/__support/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)]]; \
Expand Down
16 changes: 10 additions & 6 deletions utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def libc_function(
srcs,
weak = False,
copts = None,
local_defines = None,
local_defines = [],
**kwargs):
"""Add target for a libc function.
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 1466711

Please sign in to comment.