https://github.com/philnik777 created
https://github.com/llvm/llvm-project/pull/78071
None
>From f073a827ddbe728ced53a82431f517da58753776 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser
Date: Mon, 11 Dec 2023 12:51:07 +0100
Subject: [PATCH] [clang] Add add attribute [[clang::builtin]]
---
clang/include/clang/Basic/Attr.td | 5 +-
clang/include/clang/Basic/DiagnosticGroups.td | 3 +
.../clang/Basic/DiagnosticSemaKinds.td| 11 +++
clang/lib/AST/Decl.cpp| 6 ++
clang/lib/AST/ExprConstant.cpp| 15 ++-
clang/lib/CodeGen/CGExpr.cpp | 6 +-
clang/lib/Headers/mmintrin.h | 9 +-
clang/lib/Sema/SemaDecl.cpp | 4 +-
clang/lib/Sema/SemaDeclAttr.cpp | 96 +++
clang/lib/Sema/SemaExpr.cpp | 3 +
clang/test/CodeGenCXX/attr-builtin.cpp| 71 ++
...a-attribute-supported-attributes-list.test | 1 +
clang/test/SemaCXX/attr-builtin-debug.cpp | 4 +
clang/test/SemaCXX/attr-builtin.cpp | 65 +
14 files changed, 285 insertions(+), 14 deletions(-)
create mode 100644 clang/test/CodeGenCXX/attr-builtin.cpp
create mode 100644 clang/test/SemaCXX/attr-builtin-debug.cpp
create mode 100644 clang/test/SemaCXX/attr-builtin.cpp
diff --git a/clang/include/clang/Basic/Attr.td
b/clang/include/clang/Basic/Attr.td
index b0a8ef10c500a7..fb435eac80bdd8 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -4157,11 +4157,10 @@ def DiagnoseAsBuiltin : InheritableAttr {
}
def Builtin : InheritableAttr {
- let Spellings = [];
+ let Spellings = [Clang<"builtin">];
let Args = [UnsignedArgument<"ID">];
let Subjects = SubjectList<[Function]>;
- let SemaHandler = 0;
- let Documentation = [InternalOnly];
+ let Documentation = [Undocumented];
}
def EnforceTCB : InheritableAttr {
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td
b/clang/include/clang/Basic/DiagnosticGroups.td
index caee2dc6daadb6..2390a487b0bcb8 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -771,6 +771,8 @@ def NSobjectAttribute : DiagGroup<"NSObject-attribute">;
def NSConsumedMismatch : DiagGroup<"nsconsumed-mismatch">;
def NSReturnsMismatch : DiagGroup<"nsreturns-mismatch">;
+def UnsupportedBuiltin : DiagGroup<"unsupported-builtin">;
+
def IndependentClassAttribute : DiagGroup<"IndependentClass-attribute">;
def UnknownAttributes : DiagGroup<"unknown-attributes">;
def IgnoredAttributes : DiagGroup<"ignored-attributes">;
@@ -1063,6 +1065,7 @@ def Most : DiagGroup<"most", [
PrivateExtern,
SelTypeCast,
ExternCCompat,
+UnsupportedBuiltin,
UserDefinedWarnings
]>;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 28d95ca9b13893..3c096c07bd4708 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5759,6 +5759,17 @@ def warn_unavailable_def : Warning<
def warn_deprecated_builtin : Warning<
"builtin %0 is deprecated; use %1 instead">,
InGroup;
+def err_unknown_builtin : Error<"unknown builtin">;
+def warn_unsupported_builtin : Warning<"builtin is not supported">,
+ InGroup;
+def warn_unsupported_on_member_function : Warning<
+ "attribute 'builtin' is not supported on member functions">,
+ InGroup;
+def err_unexpected_param_count : Error<
+ "expected %0 argument%select{s|}1 but got %2">;
+def err_signature_mismatch : Error<
+ "function signature does not match the signature of the builtin">;
+def note_expected_signature : Note<"expected signature is %0">;
def err_unavailable : Error<"%0 is unavailable">;
def err_property_method_unavailable :
Error<"property access is using %0 method which is unavailable">;
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index c5c2edf1bfe3ab..63be2447cca308 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -3575,6 +3575,12 @@ unsigned FunctionDecl::getBuiltinID(bool
ConsiderWrapperFunctions) const {
BuiltinID = BAA->getBuiltinName()->getBuiltinID();
} else if (const auto *A = getAttr()) {
BuiltinID = A->getID();
+
+// This is an explicit attribute, which means that this has been declared
as
+// a builtin by the user. In this case we can assume that the function is
+// equivalent to the specified builtin.
+if (!A->isImplicit())
+ return BuiltinID;
}
if (!BuiltinID)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index f035c1419f4c98..52b45ba0385b88 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -7661,8 +7661,19 @@ class ExprEvaluatorBase
bool IsConstantEvaluatedBuiltinCall(const CallExpr *E) {
unsigned BuiltinOp = E->getBuiltinCallee();
-return BuiltinOp != 0 &&
- Info