[libc-commits] [libc] 1466711 - [libc] Allow each function can have extra attributes by defining LLVM_LIBC_FUNCTION_ATTR_func macro. (#116160)
via libc-commits
libc-commits at lists.llvm.org
Wed Nov 20 14:50:04 PST 2024
Author: lntue
Date: 2024-11-20T17:50:00-05:00
New Revision: 14667119bcc78fe7d8a2d8f6c31407f2b6a6f8a5
URL: https://github.com/llvm/llvm-project/commit/14667119bcc78fe7d8a2d8f6c31407f2b6a6f8a5
DIFF: https://github.com/llvm/llvm-project/commit/14667119bcc78fe7d8a2d8f6c31407f2b6a6f8a5.diff
LOG: [libc] Allow each function can have extra attributes by defining LLVM_LIBC_FUNCTION_ATTR_func macro. (#116160)
Added:
Modified:
libc/src/__support/common.h
utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
Removed:
################################################################################
diff --git a/libc/src/__support/common.h b/libc/src/__support/common.h
index 48c773fa02c176..79803a346f692e 100644
--- a/libc/src/__support/common.h
+++ b/libc/src/__support/common.h
@@ -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)]]; \
diff --git a/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl b/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
index 9dc25f95b8e3f1..ddc97119d30165 100644
--- a/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
+++ b/utils/bazel/llvm-project-overlay/libc/libc_build_rules.bzl
@@ -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,
More information about the libc-commits
mailing list