[clang] [clang] Add add attribute [[clang::builtin]] (PR #78071)

2024-01-13 Thread Nikolas Klauser via cfe-commits

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

[clang] [clang] Add add attribute [[clang::builtin]] (PR #78071)

2024-01-13 Thread via cfe-commits

github-actions[bot] wrote:




:warning: C/C++ code formatter, clang-format found issues in your code. 
:warning:



You can test this locally with the following command:


``bash
git-clang-format --diff 54e2749609d7114f4a48f4146cddeecf76d935a4 
f073a827ddbe728ced53a82431f517da58753776 -- 
clang/test/CodeGenCXX/attr-builtin.cpp 
clang/test/SemaCXX/attr-builtin-debug.cpp clang/test/SemaCXX/attr-builtin.cpp 
clang/lib/AST/Decl.cpp clang/lib/AST/ExprConstant.cpp 
clang/lib/CodeGen/CGExpr.cpp clang/lib/Headers/mmintrin.h 
clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclAttr.cpp 
clang/lib/Sema/SemaExpr.cpp
``





View the diff from clang-format here.


``diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 52b45ba038..22201eca47 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -7665,11 +7665,11 @@ protected:
 if (BuiltinOp == 0 || !Info.Ctx.BuiltinInfo.isConstantEvaluated(BuiltinOp))
   return false;
 
-if (const auto* CD = E->getCalleeDecl()) {
-  if (const auto* FD = CD->getAsFunction()) {
+if (const auto *CD = E->getCalleeDecl()) {
+  if (const auto *FD = CD->getAsFunction()) {
 if (FD->isConstexpr())
   return true;
-if (const auto* BA = FD->getAttr())
+if (const auto *BA = FD->getAttr())
   return BA->isImplicit();
   }
 }
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 3df09d8365..67f1c8114e 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -5921,8 +5921,7 @@ static void handleBuiltinAliasAttr(Sema &S, Decl *D,
   D->addAttr(::new (S.Context) BuiltinAliasAttr(S.Context, AL, Ident));
 }
 
-static void handleBuiltinAttr(Sema &S, Decl *D,
-  const ParsedAttr &AL) {
+static void handleBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
   if (!AL.checkExactlyNumArgs(S, 1))
 return;
 
@@ -5935,7 +5934,7 @@ static void handleBuiltinAttr(Sema &S, Decl *D,
   unsigned ID =
   S.getPreprocessor().getIdentifierTable().get(BuiltinName).getBuiltinID();
 
-  auto& BuiltinInfo = S.Context.BuiltinInfo;
+  auto &BuiltinInfo = S.Context.BuiltinInfo;
 
   if (ID == 0 || BuiltinInfo.isInStdNamespace(ID) != IsInStdNamespace) {
 S.Diag(AL.getLoc(), diag::err_unknown_builtin);
@@ -5984,7 +5983,7 @@ static void handleBuiltinAttr(Sema &S, Decl *D,
 });
   };
 
-  if (const auto* MD = dyn_cast(D)) {
+  if (const auto *MD = dyn_cast(D)) {
 if (!MD->isStatic()) {
   S.Diag(AL.getLoc(), diag::warn_unsupported_on_member_function);
   return;

``




https://github.com/llvm/llvm-project/pull/78071
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits