[clang] [libcxx] [Clang] Add __is_invocable_r and __is_nothrow_invocable_r (PR #81213)

2024-02-12 Thread Nikolas Klauser via cfe-commits

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


[clang] f5d71b7 - Reland "[clang-format][NFC] Make LangOpts global in namespace Format (#81390)"

2024-02-12 Thread Owen Pan via cfe-commits

Author: Owen Pan
Date: 2024-02-12T00:04:34-08:00
New Revision: f5d71b79fe978f1e70f4a41adfd15f65dec6e210

URL: 
https://github.com/llvm/llvm-project/commit/f5d71b79fe978f1e70f4a41adfd15f65dec6e210
DIFF: 
https://github.com/llvm/llvm-project/commit/f5d71b79fe978f1e70f4a41adfd15f65dec6e210.diff

LOG: Reland "[clang-format][NFC] Make LangOpts global in namespace Format 
(#81390)"

Added: 


Modified: 
clang/lib/Format/FormatToken.cpp

Removed: 




diff  --git a/clang/lib/Format/FormatToken.cpp 
b/clang/lib/Format/FormatToken.cpp
index b791c5a26bbe3..33bcde3c25ece 100644
--- a/clang/lib/Format/FormatToken.cpp
+++ b/clang/lib/Format/FormatToken.cpp
@@ -14,9 +14,7 @@
 
 #include "FormatToken.h"
 #include "ContinuationIndenter.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/Debug.h"
-#include 
+#include "TokenAnalyzer.h"
 
 namespace clang {
 namespace format {
@@ -34,41 +32,9 @@ const char *getTokenTypeName(TokenType Type) {
   return nullptr;
 }
 
-// FIXME: This is copy&pasted from Sema. Put it in a common place and remove
-// duplication.
 bool FormatToken::isSimpleTypeSpecifier() const {
-  switch (Tok.getKind()) {
-  case tok::kw_short:
-  case tok::kw_long:
-  case tok::kw___int64:
-  case tok::kw___int128:
-  case tok::kw_signed:
-  case tok::kw_unsigned:
-  case tok::kw_void:
-  case tok::kw_char:
-  case tok::kw_int:
-  case tok::kw_half:
-  case tok::kw_float:
-  case tok::kw_double:
-  case tok::kw___bf16:
-  case tok::kw__Float16:
-  case tok::kw___float128:
-  case tok::kw___ibm128:
-  case tok::kw_wchar_t:
-  case tok::kw_bool:
-#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
-#include "clang/Basic/TransformTypeTraits.def"
-  case tok::annot_typename:
-  case tok::kw_char8_t:
-  case tok::kw_char16_t:
-  case tok::kw_char32_t:
-  case tok::kw_typeof:
-  case tok::kw_decltype:
-  case tok::kw__Atomic:
-return true;
-  default:
-return false;
-  }
+  assert(LangOpts.CPlusPlus);
+  return Tok.isSimpleTypeSpecifier(LangOpts);
 }
 
 bool FormatToken::isTypeOrIdentifier() const {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 33108fa - Reverted due to wrong commit message

2024-02-12 Thread Owen Pan via cfe-commits

Author: Owen Pan
Date: 2024-02-12T00:07:47-08:00
New Revision: 33108fae9020cb49577fc3ee0aed219cc581f82a

URL: 
https://github.com/llvm/llvm-project/commit/33108fae9020cb49577fc3ee0aed219cc581f82a
DIFF: 
https://github.com/llvm/llvm-project/commit/33108fae9020cb49577fc3ee0aed219cc581f82a.diff

LOG: Reverted due to wrong commit message

This reverts commit f5d71b79fe978f1e70f4a41adfd15f65dec6e210.

Added: 


Modified: 
clang/lib/Format/FormatToken.cpp

Removed: 




diff  --git a/clang/lib/Format/FormatToken.cpp 
b/clang/lib/Format/FormatToken.cpp
index 33bcde3c25ece..b791c5a26bbe3 100644
--- a/clang/lib/Format/FormatToken.cpp
+++ b/clang/lib/Format/FormatToken.cpp
@@ -14,7 +14,9 @@
 
 #include "FormatToken.h"
 #include "ContinuationIndenter.h"
-#include "TokenAnalyzer.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/Debug.h"
+#include 
 
 namespace clang {
 namespace format {
@@ -32,9 +34,41 @@ const char *getTokenTypeName(TokenType Type) {
   return nullptr;
 }
 
+// FIXME: This is copy&pasted from Sema. Put it in a common place and remove
+// duplication.
 bool FormatToken::isSimpleTypeSpecifier() const {
-  assert(LangOpts.CPlusPlus);
-  return Tok.isSimpleTypeSpecifier(LangOpts);
+  switch (Tok.getKind()) {
+  case tok::kw_short:
+  case tok::kw_long:
+  case tok::kw___int64:
+  case tok::kw___int128:
+  case tok::kw_signed:
+  case tok::kw_unsigned:
+  case tok::kw_void:
+  case tok::kw_char:
+  case tok::kw_int:
+  case tok::kw_half:
+  case tok::kw_float:
+  case tok::kw_double:
+  case tok::kw___bf16:
+  case tok::kw__Float16:
+  case tok::kw___float128:
+  case tok::kw___ibm128:
+  case tok::kw_wchar_t:
+  case tok::kw_bool:
+#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
+#include "clang/Basic/TransformTypeTraits.def"
+  case tok::annot_typename:
+  case tok::kw_char8_t:
+  case tok::kw_char16_t:
+  case tok::kw_char32_t:
+  case tok::kw_typeof:
+  case tok::kw_decltype:
+  case tok::kw__Atomic:
+return true;
+  default:
+return false;
+  }
 }
 
 bool FormatToken::isTypeOrIdentifier() const {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 7f40c5c - Reland "[clang-format] Update FormatToken::isSimpleTypeSpecifier() (#80241)"

2024-02-12 Thread Owen Pan via cfe-commits

Author: Owen Pan
Date: 2024-02-12T00:10:24-08:00
New Revision: 7f40c5cc4e15a0a67b031f13370afc342a5dc14b

URL: 
https://github.com/llvm/llvm-project/commit/7f40c5cc4e15a0a67b031f13370afc342a5dc14b
DIFF: 
https://github.com/llvm/llvm-project/commit/7f40c5cc4e15a0a67b031f13370afc342a5dc14b.diff

LOG: Reland "[clang-format] Update FormatToken::isSimpleTypeSpecifier() 
(#80241)"

Added: 


Modified: 
clang/lib/Format/FormatToken.cpp

Removed: 




diff  --git a/clang/lib/Format/FormatToken.cpp 
b/clang/lib/Format/FormatToken.cpp
index b791c5a26bbe3a..33bcde3c25ece9 100644
--- a/clang/lib/Format/FormatToken.cpp
+++ b/clang/lib/Format/FormatToken.cpp
@@ -14,9 +14,7 @@
 
 #include "FormatToken.h"
 #include "ContinuationIndenter.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/Support/Debug.h"
-#include 
+#include "TokenAnalyzer.h"
 
 namespace clang {
 namespace format {
@@ -34,41 +32,9 @@ const char *getTokenTypeName(TokenType Type) {
   return nullptr;
 }
 
-// FIXME: This is copy&pasted from Sema. Put it in a common place and remove
-// duplication.
 bool FormatToken::isSimpleTypeSpecifier() const {
-  switch (Tok.getKind()) {
-  case tok::kw_short:
-  case tok::kw_long:
-  case tok::kw___int64:
-  case tok::kw___int128:
-  case tok::kw_signed:
-  case tok::kw_unsigned:
-  case tok::kw_void:
-  case tok::kw_char:
-  case tok::kw_int:
-  case tok::kw_half:
-  case tok::kw_float:
-  case tok::kw_double:
-  case tok::kw___bf16:
-  case tok::kw__Float16:
-  case tok::kw___float128:
-  case tok::kw___ibm128:
-  case tok::kw_wchar_t:
-  case tok::kw_bool:
-#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
-#include "clang/Basic/TransformTypeTraits.def"
-  case tok::annot_typename:
-  case tok::kw_char8_t:
-  case tok::kw_char16_t:
-  case tok::kw_char32_t:
-  case tok::kw_typeof:
-  case tok::kw_decltype:
-  case tok::kw__Atomic:
-return true;
-  default:
-return false;
-  }
+  assert(LangOpts.CPlusPlus);
+  return Tok.isSimpleTypeSpecifier(LangOpts);
 }
 
 bool FormatToken::isTypeOrIdentifier() const {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 created 
https://github.com/llvm/llvm-project/pull/81449

This fixes a regression since 
https://github.com/llvm/llvm-project/commit/340eac01f7dad6c24cee35dd35f2484098dd6b1a,
 from which we compared function parameter types with cv-qualifiers taken into 
account. However, as per [dcl.fct]/p5:

> After producing the list of parameter types, any top-level cv-qualifiers 
> modifying
> a parameter type are deleted when forming the function type.

Thus, I think we should use `hasSameUnqualifiedType` for type comparison.

This fixes https://github.com/llvm/llvm-project/issues/75404.

>From f4fb72075b8b3242656c10618eb5baa6a4204907 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Mon, 12 Feb 2024 15:47:59 +0800
Subject: [PATCH] [Clang][Sema] Don't consider top-level cv-qualifiers in
 template partial orderings

This fixes a regression since
https://github.com/llvm/llvm-project/commit/340eac01f7dad6c24cee35dd35f2484098dd6b1a,
from which we compared function parameter types with cv-qualifiers
taken into account. However, as per [dcl.fct]/p5:

> After producing the list of parameter types, any top-level cv-qualifiers 
> modifying
> a parameter type are deleted when forming the function type.

Thus I think we should use hasSameUnqualifiedType for type comparison.

This fixes https://github.com/llvm/llvm-project/issues/75404.
---
 clang/docs/ReleaseNotes.rst  | 2 ++
 clang/lib/Sema/SemaTemplateDeduction.cpp | 7 +--
 clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp | 7 +++
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..88006b4fb782e9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -225,6 +225,8 @@ Bug Fixes to C++ Support
   or non-constant more accurately. Previously, only a subset of the initializer
   elements were considered, misclassifying some initializers as constant. Fixes
   some of (`#80510 `).
+- Clang now ignores top-level cv-qualifiers on function parameters in template 
partial orderings.
+  (`#75404 `_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index a54ad27975890a..69c35db2945eb7 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5599,9 +5599,12 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
   Sema::TPL_TemplateParamsEquivalent))
 return nullptr;
 
+  // [dcl.fct]p5:
+  // Any top-level cv-qualifiers modifying a parameter type are deleted when
+  // forming the function type.
   for (unsigned i = 0; i < NumParams1; ++i)
-if (!Context.hasSameType(FD1->getParamDecl(i)->getType(),
- FD2->getParamDecl(i)->getType()))
+if (!Context.hasSameUnqualifiedType(FD1->getParamDecl(i)->getType(),
+FD2->getParamDecl(i)->getType()))
   return nullptr;
 
   // C++20 [temp.func.order]p6.3:
diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index dae1ba760cc203..cec487575d8093 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -98,12 +98,12 @@ namespace non_template
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
   template
-  constexpr int goo(int a) requires AtLeast2 && true { // expected-note 
{{candidate function}}
+  constexpr int goo(T a) requires AtLeast2 && true {
 return 1;
   }
 
   template
-  constexpr int goo(const int b) requires AtLeast2 { // expected-note 
{{candidate function}}
+  constexpr int goo(const T b) requires AtLeast2 {
 return 2;
   }
 
@@ -122,7 +122,6 @@ namespace non_template
 return 2;
   }
 
-  // By temp.func.order-6.2.2, this is ambiguous because parameter a and b 
have different types.
-  static_assert(goo(1) == 1); // expected-error {{call to 'goo' is 
ambiguous}}
+  static_assert(goo(1) == 1);
   static_assert(doo(2) == 1);
 }

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][sema][FMV] Forbid multi-versioning arm_streaming functions. (PR #81268)

2024-02-12 Thread Sander de Smalen via cfe-commits

https://github.com/sdesmalen-arm approved this pull request.

LGTM with nit addressed

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


[clang] [clang][sema][FMV] Forbid multi-versioning arm_streaming functions. (PR #81268)

2024-02-12 Thread Sander de Smalen via cfe-commits

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


[clang] [clang][sema][FMV] Forbid multi-versioning arm_streaming functions. (PR #81268)

2024-02-12 Thread Sander de Smalen via cfe-commits


@@ -3501,9 +3501,16 @@ bool Sema::checkTargetAttr(SourceLocation LiteralLoc, 
StringRef AttrStr) {
   return false;
 }
 
+static bool hasStreamingModeChangeInABI(const FunctionDecl *FD) {

sdesmalen-arm wrote:

nit:
```suggestion
static bool hasArmStreamingInterface(const FunctionDecl *FD) {
```

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


[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 updated 
https://github.com/llvm/llvm-project/pull/81449

>From f4fb72075b8b3242656c10618eb5baa6a4204907 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Mon, 12 Feb 2024 15:47:59 +0800
Subject: [PATCH 1/2] [Clang][Sema] Don't consider top-level cv-qualifiers in
 template partial orderings

This fixes a regression since
https://github.com/llvm/llvm-project/commit/340eac01f7dad6c24cee35dd35f2484098dd6b1a,
from which we compared function parameter types with cv-qualifiers
taken into account. However, as per [dcl.fct]/p5:

> After producing the list of parameter types, any top-level cv-qualifiers 
> modifying
> a parameter type are deleted when forming the function type.

Thus I think we should use hasSameUnqualifiedType for type comparison.

This fixes https://github.com/llvm/llvm-project/issues/75404.
---
 clang/docs/ReleaseNotes.rst  | 2 ++
 clang/lib/Sema/SemaTemplateDeduction.cpp | 7 +--
 clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp | 7 +++
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..88006b4fb782e9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -225,6 +225,8 @@ Bug Fixes to C++ Support
   or non-constant more accurately. Previously, only a subset of the initializer
   elements were considered, misclassifying some initializers as constant. Fixes
   some of (`#80510 `).
+- Clang now ignores top-level cv-qualifiers on function parameters in template 
partial orderings.
+  (`#75404 `_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index a54ad27975890a..69c35db2945eb7 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5599,9 +5599,12 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
   Sema::TPL_TemplateParamsEquivalent))
 return nullptr;
 
+  // [dcl.fct]p5:
+  // Any top-level cv-qualifiers modifying a parameter type are deleted when
+  // forming the function type.
   for (unsigned i = 0; i < NumParams1; ++i)
-if (!Context.hasSameType(FD1->getParamDecl(i)->getType(),
- FD2->getParamDecl(i)->getType()))
+if (!Context.hasSameUnqualifiedType(FD1->getParamDecl(i)->getType(),
+FD2->getParamDecl(i)->getType()))
   return nullptr;
 
   // C++20 [temp.func.order]p6.3:
diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index dae1ba760cc203..cec487575d8093 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -98,12 +98,12 @@ namespace non_template
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
   template
-  constexpr int goo(int a) requires AtLeast2 && true { // expected-note 
{{candidate function}}
+  constexpr int goo(T a) requires AtLeast2 && true {
 return 1;
   }
 
   template
-  constexpr int goo(const int b) requires AtLeast2 { // expected-note 
{{candidate function}}
+  constexpr int goo(const T b) requires AtLeast2 {
 return 2;
   }
 
@@ -122,7 +122,6 @@ namespace non_template
 return 2;
   }
 
-  // By temp.func.order-6.2.2, this is ambiguous because parameter a and b 
have different types.
-  static_assert(goo(1) == 1); // expected-error {{call to 'goo' is 
ambiguous}}
+  static_assert(goo(1) == 1);
   static_assert(doo(2) == 1);
 }

>From 1f66c477b8236bc798bd9823d8cd5b0f26888a1c Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Mon, 12 Feb 2024 16:18:44 +0800
Subject: [PATCH 2/2] comment

---
 clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index cec487575d8093..db3e3e3bc85966 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -97,6 +97,9 @@ namespace non_template
   static_assert(is_same_v()), int>); // expected-error 
{{call to 'baz' is ambiguous}}
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
+  // Top-level cv-qualifiers are ignored in template partial ordering per 
[dcl.fct]/p5.
+  //   After producing the list of parameter types, any top-level 
cv-qualifiers modifying
+  //   a parameter type are deleted when forming the function type.
   template
   constexpr int goo(T a) requires AtLeast2 && true {
 return 1;

___
cfe-com

[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 updated 
https://github.com/llvm/llvm-project/pull/81449

>From f4fb72075b8b3242656c10618eb5baa6a4204907 Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Mon, 12 Feb 2024 15:47:59 +0800
Subject: [PATCH 1/2] [Clang][Sema] Don't consider top-level cv-qualifiers in
 template partial orderings

This fixes a regression since
https://github.com/llvm/llvm-project/commit/340eac01f7dad6c24cee35dd35f2484098dd6b1a,
from which we compared function parameter types with cv-qualifiers
taken into account. However, as per [dcl.fct]/p5:

> After producing the list of parameter types, any top-level cv-qualifiers 
> modifying
> a parameter type are deleted when forming the function type.

Thus I think we should use hasSameUnqualifiedType for type comparison.

This fixes https://github.com/llvm/llvm-project/issues/75404.
---
 clang/docs/ReleaseNotes.rst  | 2 ++
 clang/lib/Sema/SemaTemplateDeduction.cpp | 7 +--
 clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp | 7 +++
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..88006b4fb782e9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -225,6 +225,8 @@ Bug Fixes to C++ Support
   or non-constant more accurately. Previously, only a subset of the initializer
   elements were considered, misclassifying some initializers as constant. Fixes
   some of (`#80510 `).
+- Clang now ignores top-level cv-qualifiers on function parameters in template 
partial orderings.
+  (`#75404 `_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index a54ad27975890a..69c35db2945eb7 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5599,9 +5599,12 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
   Sema::TPL_TemplateParamsEquivalent))
 return nullptr;
 
+  // [dcl.fct]p5:
+  // Any top-level cv-qualifiers modifying a parameter type are deleted when
+  // forming the function type.
   for (unsigned i = 0; i < NumParams1; ++i)
-if (!Context.hasSameType(FD1->getParamDecl(i)->getType(),
- FD2->getParamDecl(i)->getType()))
+if (!Context.hasSameUnqualifiedType(FD1->getParamDecl(i)->getType(),
+FD2->getParamDecl(i)->getType()))
   return nullptr;
 
   // C++20 [temp.func.order]p6.3:
diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index dae1ba760cc203..cec487575d8093 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -98,12 +98,12 @@ namespace non_template
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
   template
-  constexpr int goo(int a) requires AtLeast2 && true { // expected-note 
{{candidate function}}
+  constexpr int goo(T a) requires AtLeast2 && true {
 return 1;
   }
 
   template
-  constexpr int goo(const int b) requires AtLeast2 { // expected-note 
{{candidate function}}
+  constexpr int goo(const T b) requires AtLeast2 {
 return 2;
   }
 
@@ -122,7 +122,6 @@ namespace non_template
 return 2;
   }
 
-  // By temp.func.order-6.2.2, this is ambiguous because parameter a and b 
have different types.
-  static_assert(goo(1) == 1); // expected-error {{call to 'goo' is 
ambiguous}}
+  static_assert(goo(1) == 1);
   static_assert(doo(2) == 1);
 }

>From 1f66c477b8236bc798bd9823d8cd5b0f26888a1c Mon Sep 17 00:00:00 2001
From: Younan Zhang 
Date: Mon, 12 Feb 2024 16:18:44 +0800
Subject: [PATCH 2/2] comment

---
 clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index cec487575d8093..db3e3e3bc85966 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -97,6 +97,9 @@ namespace non_template
   static_assert(is_same_v()), int>); // expected-error 
{{call to 'baz' is ambiguous}}
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
+  // Top-level cv-qualifiers are ignored in template partial ordering per 
[dcl.fct]/p5.
+  //   After producing the list of parameter types, any top-level 
cv-qualifiers modifying
+  //   a parameter type are deleted when forming the function type.
   template
   constexpr int goo(T a) requires AtLeast2 && true {
 return 1;

___
cfe-com

[clang] [llvm] [MC/DC] Refactor: Make `MCDCParams` as `std::variant` (PR #81227)

2024-02-12 Thread NAKAMURA Takumi via cfe-commits

https://github.com/chapuni updated 
https://github.com/llvm/llvm-project/pull/81227

>From c2b49a5317bf5b8af419cba814f95cc9305bec21 Mon Sep 17 00:00:00 2001
From: NAKAMURA Takumi 
Date: Thu, 8 Feb 2024 23:12:54 +0900
Subject: [PATCH 1/3] [MC/DC] Refactor: Make `MCDCParams` as `std::variant`

Introduce `MCDCDecisionParameters` and `MCDCBranchParameters` and
make sure them not initialized as zero.

FIXME: Could we make `CoverageMappingRegion` as a smart tagged union?
---
 clang/lib/CodeGen/CoverageMappingGen.cpp  | 69 +
 .../ProfileData/Coverage/CoverageMapping.h| 77 ---
 .../ProfileData/Coverage/CoverageMapping.cpp  | 53 +++--
 .../Coverage/CoverageMappingReader.cpp| 17 ++--
 .../Coverage/CoverageMappingWriter.cpp| 23 --
 .../ProfileData/CoverageMappingTest.cpp   |  8 +-
 6 files changed, 149 insertions(+), 98 deletions(-)

diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..da5d43cda91209 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -97,6 +97,8 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 namespace {
 using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
 using MCDCParameters = CounterMappingRegion::MCDCParameters;
+using MCDCBranchParameters = CounterMappingRegion::MCDCBranchParameters;
+using MCDCDecisionParameters = CounterMappingRegion::MCDCDecisionParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -185,7 +187,17 @@ class SourceMappingRegion {
 
   bool isBranch() const { return FalseCount.has_value(); }
 
-  bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
+  bool isMCDCDecision() const {
+const auto *DecisionParams =
+std::get_if(&MCDCParams);
+assert(!DecisionParams || DecisionParams->NumConditions > 0);
+return DecisionParams;
+  }
+
+  const auto &getMCDCDecisionParams() const {
+return CounterMappingRegion::getParams(
+MCDCParams);
+  }
 
   const MCDCParameters &getMCDCParams() const { return MCDCParams; }
 };
@@ -483,13 +495,13 @@ class CoverageMappingBuilder {
 SR.ColumnEnd));
   } else if (Region.isBranch()) {
 MappingRegions.push_back(CounterMappingRegion::makeBranchRegion(
-Region.getCounter(), Region.getFalseCounter(),
-Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart,
-SR.LineEnd, SR.ColumnEnd));
+Region.getCounter(), Region.getFalseCounter(), *CovFileID,
+SR.LineStart, SR.ColumnStart, SR.LineEnd, SR.ColumnEnd,
+Region.getMCDCParams()));
   } else if (Region.isMCDCDecision()) {
 MappingRegions.push_back(CounterMappingRegion::makeDecisionRegion(
-Region.getMCDCParams(), *CovFileID, SR.LineStart, SR.ColumnStart,
-SR.LineEnd, SR.ColumnEnd));
+Region.getMCDCDecisionParams(), *CovFileID, SR.LineStart,
+SR.ColumnStart, SR.LineEnd, SR.ColumnEnd));
   } else {
 MappingRegions.push_back(CounterMappingRegion::makeRegion(
 Region.getCounter(), *CovFileID, SR.LineStart, SR.ColumnStart,
@@ -865,8 +877,7 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,
 std::optional EndLoc = std::nullopt,
 std::optional FalseCount = std::nullopt,
-MCDCConditionID ID = 0, MCDCConditionID TrueID = 0,
-MCDCConditionID FalseID = 0) {
+const MCDCParameters &BranchParams = std::monostate()) {
 
 if (StartLoc && !FalseCount) {
   MostRecentLocation = *StartLoc;
@@ -885,9 +896,7 @@ struct CounterCoverageMappingBuilder
   StartLoc = std::nullopt;
 if (EndLoc && EndLoc->isInvalid())
   EndLoc = std::nullopt;
-RegionStack.emplace_back(Count, FalseCount,
- MCDCParameters{0, 0, ID, TrueID, FalseID},
- StartLoc, EndLoc);
+RegionStack.emplace_back(Count, FalseCount, BranchParams, StartLoc, 
EndLoc);
 
 return RegionStack.size() - 1;
   }
@@ -896,8 +905,8 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,
 std::optional EndLoc = std::nullopt) {
 
-RegionStack.emplace_back(MCDCParameters{BitmapIdx, Conditions}, StartLoc,
- EndLoc);
+RegionStack.emplace_back(MCDCDecisionParameters{BitmapIdx, Conditions},
+ StartLoc, EndLoc);
 
 return RegionStack.size() - 1;
   }
@@ -1042,9 +1051,10 @@ struct CounterCoverageMappingBuilder
 // function's SourceRegions) because it doesn't apply to any other source
 // code other than the Condition.
 if (CodeGenFunction::isInstrumentedCondition(C)) {
+  MCDCParameters BranchParams;
   MCD

[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread Younan Zhang via cfe-commits

zyn0217 wrote:

The Windows CI is still not working; I ran the libc++ tests locally and they 
are green.

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


[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread Younan Zhang via cfe-commits

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


[clang] [Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings (PR #81449)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Younan Zhang (zyn0217)


Changes

This fixes a regression since 
https://github.com/llvm/llvm-project/commit/340eac01f7dad6c24cee35dd35f2484098dd6b1a,
 from which we compared function parameter types with cv-qualifiers taken into 
account. However, as per [dcl.fct]/p5:

> After producing the list of parameter types, any top-level cv-qualifiers 
modifying
> a parameter type are deleted when forming the function type.

Thus, I think we should use `hasSameUnqualifiedType` for type comparison.

This fixes https://github.com/llvm/llvm-project/issues/75404.

---
Full diff: https://github.com/llvm/llvm-project/pull/81449.diff


3 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+2) 
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+5-2) 
- (modified) clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp (+6-4) 


``diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..88006b4fb782e9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -225,6 +225,8 @@ Bug Fixes to C++ Support
   or non-constant more accurately. Previously, only a subset of the initializer
   elements were considered, misclassifying some initializers as constant. Fixes
   some of (`#80510 `).
+- Clang now ignores top-level cv-qualifiers on function parameters in template 
partial orderings.
+  (`#75404 `_)
 
 Bug Fixes to AST Handling
 ^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index a54ad27975890a..69c35db2945eb7 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5599,9 +5599,12 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
   Sema::TPL_TemplateParamsEquivalent))
 return nullptr;
 
+  // [dcl.fct]p5:
+  // Any top-level cv-qualifiers modifying a parameter type are deleted when
+  // forming the function type.
   for (unsigned i = 0; i < NumParams1; ++i)
-if (!Context.hasSameType(FD1->getParamDecl(i)->getType(),
- FD2->getParamDecl(i)->getType()))
+if (!Context.hasSameUnqualifiedType(FD1->getParamDecl(i)->getType(),
+FD2->getParamDecl(i)->getType()))
   return nullptr;
 
   // C++20 [temp.func.order]p6.3:
diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp 
b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index dae1ba760cc203..db3e3e3bc85966 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -97,13 +97,16 @@ namespace non_template
   static_assert(is_same_v()), int>); // expected-error 
{{call to 'baz' is ambiguous}}
   static_assert(is_same_v()), void>); // expected-error 
{{call to 'bar' is ambiguous}}
 
+  // Top-level cv-qualifiers are ignored in template partial ordering per 
[dcl.fct]/p5.
+  //   After producing the list of parameter types, any top-level 
cv-qualifiers modifying
+  //   a parameter type are deleted when forming the function type.
   template
-  constexpr int goo(int a) requires AtLeast2 && true { // expected-note 
{{candidate function}}
+  constexpr int goo(T a) requires AtLeast2 && true {
 return 1;
   }
 
   template
-  constexpr int goo(const int b) requires AtLeast2 { // expected-note 
{{candidate function}}
+  constexpr int goo(const T b) requires AtLeast2 {
 return 2;
   }
 
@@ -122,7 +125,6 @@ namespace non_template
 return 2;
   }
 
-  // By temp.func.order-6.2.2, this is ambiguous because parameter a and b 
have different types.
-  static_assert(goo(1) == 1); // expected-error {{call to 'goo' is 
ambiguous}}
+  static_assert(goo(1) == 1);
   static_assert(doo(2) == 1);
 }

``




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


[clang] [llvm] [AMDGPU] Introduce GFX9/10.1/10.3/11 Generic Targets (PR #76955)

2024-02-12 Thread Pierre van Houtryve via cfe-commits

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


[clang] c90114c - [clang] Avoid -Wshadow warning when init-capture named same as class field (#74512)

2024-02-12 Thread via cfe-commits

Author: Mariya Podchishchaeva
Date: 2024-02-12T10:44:20+01:00
New Revision: c90114c993ec1443360769a4d51963e3536de0ef

URL: 
https://github.com/llvm/llvm-project/commit/c90114c993ec1443360769a4d51963e3536de0ef
DIFF: 
https://github.com/llvm/llvm-project/commit/c90114c993ec1443360769a4d51963e3536de0ef.diff

LOG: [clang] Avoid -Wshadow warning when init-capture named same as class field 
(#74512)

Shadowing warning doesn't make much sense since field is not available
in lambda's body without capturing this.

Fixes https://github.com/llvm/llvm-project/issues/71976

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/include/clang/Sema/ScopeInfo.h
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/warn-shadow-in-lambdas.cpp

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..402a2f8687386c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -165,6 +165,9 @@ Bug Fixes in This Version
   a member class template for an implicit instantiation of a class template.
 
 - Fixed missing warnings when doing bool-like conversions in C23 (`#79435 
`_).
+- Clang's ``-Wshadow`` no longer warns when an init-capture is named the same 
as
+  a class field unless the lambda can capture this.
+  Fixes (`#71976 `_)
 
 - Clang now accepts qualified partial/explicit specializations of variable 
templates that
   are not nominable in the lookup context of the specialization.

diff  --git a/clang/include/clang/Sema/ScopeInfo.h 
b/clang/include/clang/Sema/ScopeInfo.h
index ca3d0a02ddb579..700e361ef83f13 100644
--- a/clang/include/clang/Sema/ScopeInfo.h
+++ b/clang/include/clang/Sema/ScopeInfo.h
@@ -942,8 +942,8 @@ class LambdaScopeInfo final :
   /// that were defined in parent contexts. Used to avoid warnings when the
   /// shadowed variables are uncaptured by this lambda.
   struct ShadowedOuterDecl {
-const VarDecl *VD;
-const VarDecl *ShadowedDecl;
+const NamedDecl *VD;
+const NamedDecl *ShadowedDecl;
   };
   llvm::SmallVector ShadowingDecls;
 

diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2c526cd0d0e675..529fbcbfeff8e2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8357,28 +8357,40 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl 
*ShadowedDecl,
 
   unsigned WarningDiag = diag::warn_decl_shadow;
   SourceLocation CaptureLoc;
-  if (isa(D) && isa(ShadowedDecl) && NewDC &&
-  isa(NewDC)) {
+  if (isa(D) && NewDC && isa(NewDC)) {
 if (const auto *RD = dyn_cast(NewDC->getParent())) {
   if (RD->isLambda() && OldDC->Encloses(NewDC->getLexicalParent())) {
-if (RD->getLambdaCaptureDefault() == LCD_None) {
-  // Try to avoid warnings for lambdas with an explicit capture list.
+if (const auto *VD = dyn_cast(ShadowedDecl)) {
   const auto *LSI = cast(getCurFunction());
-  // Warn only when the lambda captures the shadowed decl explicitly.
-  CaptureLoc = getCaptureLocation(LSI, cast(ShadowedDecl));
-  if (CaptureLoc.isInvalid())
-WarningDiag = diag::warn_decl_shadow_uncaptured_local;
-} else {
-  // Remember that this was shadowed so we can avoid the warning if the
-  // shadowed decl isn't captured and the warning settings allow it.
+  if (RD->getLambdaCaptureDefault() == LCD_None) {
+// Try to avoid warnings for lambdas with an explicit capture
+// list. Warn only when the lambda captures the shadowed decl
+// explicitly.
+CaptureLoc = getCaptureLocation(LSI, VD);
+if (CaptureLoc.isInvalid())
+  WarningDiag = diag::warn_decl_shadow_uncaptured_local;
+  } else {
+// Remember that this was shadowed so we can avoid the warning if
+// the shadowed decl isn't captured and the warning settings allow
+// it.
+cast(getCurFunction())
+->ShadowingDecls.push_back({D, VD});
+return;
+  }
+}
+if (isa(ShadowedDecl)) {
+  // If lambda can capture this, then emit default shadowing warning,
+  // Otherwise it is not really a shadowing case since field is not
+  // available in lambda's body.
+  // At this point we don't know that lambda can capture this, so
+  // remember that this was shadowed and delay until we know.
   cast(getCurFunction())
-  ->ShadowingDecls.push_back(
-  {cast(D), cast(ShadowedDecl)});
+  ->ShadowingDecls.push_back({D, ShadowedDecl});
   return;
 }
   }
-
-  if (cast(ShadowedDecl)->hasLocalStorage()) {
+  if (const auto *VD = dyn_cast(ShadowedDecl);
+  VD &

[clang] [clang] Avoid -Wshadow warning when init-capture named same as class field (PR #74512)

2024-02-12 Thread Mariya Podchishchaeva via cfe-commits

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


[clang] [llvm] [MC/DC] Refactor: Introduce `MCDCTypes.h` for `coverage::mcdc` (PR #81459)

2024-02-12 Thread NAKAMURA Takumi via cfe-commits

https://github.com/chapuni created 
https://github.com/llvm/llvm-project/pull/81459

They can be also used in `clang`.
Introduce the lightweight header instead of `CoverageMapping.h`.

>From 03bab9acf5aa3bf13c2223e92dbad040202d34bd Mon Sep 17 00:00:00 2001
From: NAKAMURA Takumi 
Date: Mon, 12 Feb 2024 18:43:56 +0900
Subject: [PATCH] [MC/DC] Refactor: Introduce `MCDCTypes.h` for the namespace
 `coverage::mcdc`

---
 clang/lib/CodeGen/CoverageMappingGen.cpp  | 53 +--
 .../ProfileData/Coverage/CoverageMapping.h| 33 
 .../llvm/ProfileData/Coverage/MCDCTypes.h | 36 +
 .../ProfileData/Coverage/CoverageMapping.cpp  |  2 +-
 .../Coverage/CoverageMappingReader.cpp|  7 ++-
 .../ProfileData/CoverageMappingTest.cpp   |  7 ++-
 6 files changed, 80 insertions(+), 58 deletions(-)
 create mode 100644 llvm/include/llvm/ProfileData/Coverage/MCDCTypes.h

diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..888725dd2fc734 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -95,8 +95,6 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 }
 
 namespace {
-using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
-using MCDCParameters = CounterMappingRegion::MCDCParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -107,7 +105,7 @@ class SourceMappingRegion {
   std::optional FalseCount;
 
   /// Parameters used for Modified Condition/Decision Coverage
-  MCDCParameters MCDCParams;
+  mcdc::Parameters MCDCParams;
 
   /// The region's starting location.
   std::optional LocStart;
@@ -131,7 +129,7 @@ class SourceMappingRegion {
 SkippedRegion(false) {}
 
   SourceMappingRegion(Counter Count, std::optional FalseCount,
-  MCDCParameters MCDCParams,
+  mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd,
   bool GapRegion = false)
@@ -139,7 +137,7 @@ class SourceMappingRegion {
 LocStart(LocStart), LocEnd(LocEnd), GapRegion(GapRegion),
 SkippedRegion(false) {}
 
-  SourceMappingRegion(MCDCParameters MCDCParams,
+  SourceMappingRegion(mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd)
   : MCDCParams(MCDCParams), LocStart(LocStart), LocEnd(LocEnd),
@@ -187,7 +185,7 @@ class SourceMappingRegion {
 
   bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
 
-  const MCDCParameters &getMCDCParams() const { return MCDCParams; }
+  const mcdc::Parameters &getMCDCParams() const { return MCDCParams; }
 };
 
 /// Spelling locations for the start and end of a source region.
@@ -587,8 +585,8 @@ struct EmptyCoverageMappingBuilder : public 
CoverageMappingBuilder {
 struct MCDCCoverageBuilder {
 
   struct DecisionIDPair {
-MCDCConditionID TrueID = 0;
-MCDCConditionID FalseID = 0;
+mcdc::ConditionID TrueID = 0;
+mcdc::ConditionID FalseID = 0;
   };
 
   /// The AST walk recursively visits nested logical-AND or logical-OR binary
@@ -682,9 +680,9 @@ struct MCDCCoverageBuilder {
   CodeGenModule &CGM;
 
   llvm::SmallVector DecisionStack;
-  llvm::DenseMap &CondIDs;
+  llvm::DenseMap &CondIDs;
   llvm::DenseMap &MCDCBitmapMap;
-  MCDCConditionID NextID = 1;
+  mcdc::ConditionID NextID = 1;
   bool NotMapped = false;
 
   /// Represent a sentinel value of [0,0] for the bottom of DecisionStack.
@@ -696,9 +694,10 @@ struct MCDCCoverageBuilder {
   }
 
 public:
-  MCDCCoverageBuilder(CodeGenModule &CGM,
-  llvm::DenseMap &CondIDMap,
-  llvm::DenseMap &MCDCBitmapMap)
+  MCDCCoverageBuilder(
+  CodeGenModule &CGM,
+  llvm::DenseMap &CondIDMap,
+  llvm::DenseMap &MCDCBitmapMap)
   : CGM(CGM), DecisionStack(1, DecisionStackSentinel), CondIDs(CondIDMap),
 MCDCBitmapMap(MCDCBitmapMap) {}
 
@@ -713,12 +712,12 @@ struct MCDCCoverageBuilder {
   bool isBuilding() const { return (NextID > 1); }
 
   /// Set the given condition's ID.
-  void setCondID(const Expr *Cond, MCDCConditionID ID) {
+  void setCondID(const Expr *Cond, mcdc::ConditionID ID) {
 CondIDs[CodeGenFunction::stripCond(Cond)] = ID;
   }
 
   /// Return the ID of a given condition.
-  MCDCConditionID getCondID(const Expr *Cond) const {
+  mcdc::ConditionID getCondID(const Expr *Cond) const {
 auto I = CondIDs.find(CodeGenFunction::stripCond(Cond));
 if (I == CondIDs.end())
   return 0;
@@ -755,7 +754,7 @@ struct MCDCCoverageBuilder {
   setCondID(E->getLHS(), NextID++);
 
 // Assign a ID+1 for the RHS.
-MCDCConditionID RHSid = NextID++;
+mcdc::ConditionID RHSid = NextID++;
 setCondID(E->getRHS(), RHSid);
 
 // Push the LHS decision IDs onto the DecisionStack.
@@ -865,8 +864,8 @@ struct Co

[clang] [llvm] [MC/DC] Refactor: Introduce `MCDCTypes.h` for `coverage::mcdc` (PR #81459)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-pgo

Author: NAKAMURA Takumi (chapuni)


Changes

They can be also used in `clang`.
Introduce the lightweight header instead of `CoverageMapping.h`.

---
Full diff: https://github.com/llvm/llvm-project/pull/81459.diff


6 Files Affected:

- (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+26-27) 
- (modified) llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h (+11-22) 
- (added) llvm/include/llvm/ProfileData/Coverage/MCDCTypes.h (+36) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMapping.cpp (+1-1) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp (+3-4) 
- (modified) llvm/unittests/ProfileData/CoverageMappingTest.cpp (+3-4) 


``diff
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..888725dd2fc734 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -95,8 +95,6 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 }
 
 namespace {
-using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
-using MCDCParameters = CounterMappingRegion::MCDCParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -107,7 +105,7 @@ class SourceMappingRegion {
   std::optional FalseCount;
 
   /// Parameters used for Modified Condition/Decision Coverage
-  MCDCParameters MCDCParams;
+  mcdc::Parameters MCDCParams;
 
   /// The region's starting location.
   std::optional LocStart;
@@ -131,7 +129,7 @@ class SourceMappingRegion {
 SkippedRegion(false) {}
 
   SourceMappingRegion(Counter Count, std::optional FalseCount,
-  MCDCParameters MCDCParams,
+  mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd,
   bool GapRegion = false)
@@ -139,7 +137,7 @@ class SourceMappingRegion {
 LocStart(LocStart), LocEnd(LocEnd), GapRegion(GapRegion),
 SkippedRegion(false) {}
 
-  SourceMappingRegion(MCDCParameters MCDCParams,
+  SourceMappingRegion(mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd)
   : MCDCParams(MCDCParams), LocStart(LocStart), LocEnd(LocEnd),
@@ -187,7 +185,7 @@ class SourceMappingRegion {
 
   bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
 
-  const MCDCParameters &getMCDCParams() const { return MCDCParams; }
+  const mcdc::Parameters &getMCDCParams() const { return MCDCParams; }
 };
 
 /// Spelling locations for the start and end of a source region.
@@ -587,8 +585,8 @@ struct EmptyCoverageMappingBuilder : public 
CoverageMappingBuilder {
 struct MCDCCoverageBuilder {
 
   struct DecisionIDPair {
-MCDCConditionID TrueID = 0;
-MCDCConditionID FalseID = 0;
+mcdc::ConditionID TrueID = 0;
+mcdc::ConditionID FalseID = 0;
   };
 
   /// The AST walk recursively visits nested logical-AND or logical-OR binary
@@ -682,9 +680,9 @@ struct MCDCCoverageBuilder {
   CodeGenModule &CGM;
 
   llvm::SmallVector DecisionStack;
-  llvm::DenseMap &CondIDs;
+  llvm::DenseMap &CondIDs;
   llvm::DenseMap &MCDCBitmapMap;
-  MCDCConditionID NextID = 1;
+  mcdc::ConditionID NextID = 1;
   bool NotMapped = false;
 
   /// Represent a sentinel value of [0,0] for the bottom of DecisionStack.
@@ -696,9 +694,10 @@ struct MCDCCoverageBuilder {
   }
 
 public:
-  MCDCCoverageBuilder(CodeGenModule &CGM,
-  llvm::DenseMap &CondIDMap,
-  llvm::DenseMap &MCDCBitmapMap)
+  MCDCCoverageBuilder(
+  CodeGenModule &CGM,
+  llvm::DenseMap &CondIDMap,
+  llvm::DenseMap &MCDCBitmapMap)
   : CGM(CGM), DecisionStack(1, DecisionStackSentinel), CondIDs(CondIDMap),
 MCDCBitmapMap(MCDCBitmapMap) {}
 
@@ -713,12 +712,12 @@ struct MCDCCoverageBuilder {
   bool isBuilding() const { return (NextID > 1); }
 
   /// Set the given condition's ID.
-  void setCondID(const Expr *Cond, MCDCConditionID ID) {
+  void setCondID(const Expr *Cond, mcdc::ConditionID ID) {
 CondIDs[CodeGenFunction::stripCond(Cond)] = ID;
   }
 
   /// Return the ID of a given condition.
-  MCDCConditionID getCondID(const Expr *Cond) const {
+  mcdc::ConditionID getCondID(const Expr *Cond) const {
 auto I = CondIDs.find(CodeGenFunction::stripCond(Cond));
 if (I == CondIDs.end())
   return 0;
@@ -755,7 +754,7 @@ struct MCDCCoverageBuilder {
   setCondID(E->getLHS(), NextID++);
 
 // Assign a ID+1 for the RHS.
-MCDCConditionID RHSid = NextID++;
+mcdc::ConditionID RHSid = NextID++;
 setCondID(E->getRHS(), RHSid);
 
 // Push the LHS decision IDs onto the DecisionStack.
@@ -865,8 +864,8 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,
 std::optional EndLoc = std::nullopt,
 std::optional Fal

[clang] [llvm] [MC/DC] Refactor: Introduce `MCDCTypes.h` for `coverage::mcdc` (PR #81459)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: NAKAMURA Takumi (chapuni)


Changes

They can be also used in `clang`.
Introduce the lightweight header instead of `CoverageMapping.h`.

---
Full diff: https://github.com/llvm/llvm-project/pull/81459.diff


6 Files Affected:

- (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+26-27) 
- (modified) llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h (+11-22) 
- (added) llvm/include/llvm/ProfileData/Coverage/MCDCTypes.h (+36) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMapping.cpp (+1-1) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp (+3-4) 
- (modified) llvm/unittests/ProfileData/CoverageMappingTest.cpp (+3-4) 


``diff
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..888725dd2fc734 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -95,8 +95,6 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 }
 
 namespace {
-using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
-using MCDCParameters = CounterMappingRegion::MCDCParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -107,7 +105,7 @@ class SourceMappingRegion {
   std::optional FalseCount;
 
   /// Parameters used for Modified Condition/Decision Coverage
-  MCDCParameters MCDCParams;
+  mcdc::Parameters MCDCParams;
 
   /// The region's starting location.
   std::optional LocStart;
@@ -131,7 +129,7 @@ class SourceMappingRegion {
 SkippedRegion(false) {}
 
   SourceMappingRegion(Counter Count, std::optional FalseCount,
-  MCDCParameters MCDCParams,
+  mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd,
   bool GapRegion = false)
@@ -139,7 +137,7 @@ class SourceMappingRegion {
 LocStart(LocStart), LocEnd(LocEnd), GapRegion(GapRegion),
 SkippedRegion(false) {}
 
-  SourceMappingRegion(MCDCParameters MCDCParams,
+  SourceMappingRegion(mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd)
   : MCDCParams(MCDCParams), LocStart(LocStart), LocEnd(LocEnd),
@@ -187,7 +185,7 @@ class SourceMappingRegion {
 
   bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
 
-  const MCDCParameters &getMCDCParams() const { return MCDCParams; }
+  const mcdc::Parameters &getMCDCParams() const { return MCDCParams; }
 };
 
 /// Spelling locations for the start and end of a source region.
@@ -587,8 +585,8 @@ struct EmptyCoverageMappingBuilder : public 
CoverageMappingBuilder {
 struct MCDCCoverageBuilder {
 
   struct DecisionIDPair {
-MCDCConditionID TrueID = 0;
-MCDCConditionID FalseID = 0;
+mcdc::ConditionID TrueID = 0;
+mcdc::ConditionID FalseID = 0;
   };
 
   /// The AST walk recursively visits nested logical-AND or logical-OR binary
@@ -682,9 +680,9 @@ struct MCDCCoverageBuilder {
   CodeGenModule &CGM;
 
   llvm::SmallVector DecisionStack;
-  llvm::DenseMap &CondIDs;
+  llvm::DenseMap &CondIDs;
   llvm::DenseMap &MCDCBitmapMap;
-  MCDCConditionID NextID = 1;
+  mcdc::ConditionID NextID = 1;
   bool NotMapped = false;
 
   /// Represent a sentinel value of [0,0] for the bottom of DecisionStack.
@@ -696,9 +694,10 @@ struct MCDCCoverageBuilder {
   }
 
 public:
-  MCDCCoverageBuilder(CodeGenModule &CGM,
-  llvm::DenseMap &CondIDMap,
-  llvm::DenseMap &MCDCBitmapMap)
+  MCDCCoverageBuilder(
+  CodeGenModule &CGM,
+  llvm::DenseMap &CondIDMap,
+  llvm::DenseMap &MCDCBitmapMap)
   : CGM(CGM), DecisionStack(1, DecisionStackSentinel), CondIDs(CondIDMap),
 MCDCBitmapMap(MCDCBitmapMap) {}
 
@@ -713,12 +712,12 @@ struct MCDCCoverageBuilder {
   bool isBuilding() const { return (NextID > 1); }
 
   /// Set the given condition's ID.
-  void setCondID(const Expr *Cond, MCDCConditionID ID) {
+  void setCondID(const Expr *Cond, mcdc::ConditionID ID) {
 CondIDs[CodeGenFunction::stripCond(Cond)] = ID;
   }
 
   /// Return the ID of a given condition.
-  MCDCConditionID getCondID(const Expr *Cond) const {
+  mcdc::ConditionID getCondID(const Expr *Cond) const {
 auto I = CondIDs.find(CodeGenFunction::stripCond(Cond));
 if (I == CondIDs.end())
   return 0;
@@ -755,7 +754,7 @@ struct MCDCCoverageBuilder {
   setCondID(E->getLHS(), NextID++);
 
 // Assign a ID+1 for the RHS.
-MCDCConditionID RHSid = NextID++;
+mcdc::ConditionID RHSid = NextID++;
 setCondID(E->getRHS(), RHSid);
 
 // Push the LHS decision IDs onto the DecisionStack.
@@ -865,8 +864,8 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,
 std::optional EndLoc = std::nullopt,
 std::optional F

[clang] [llvm] [MC/DC] Refactor: Introduce `MCDCTypes.h` for `coverage::mcdc` (PR #81459)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-codegen

Author: NAKAMURA Takumi (chapuni)


Changes

They can be also used in `clang`.
Introduce the lightweight header instead of `CoverageMapping.h`.

---
Full diff: https://github.com/llvm/llvm-project/pull/81459.diff


6 Files Affected:

- (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+26-27) 
- (modified) llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h (+11-22) 
- (added) llvm/include/llvm/ProfileData/Coverage/MCDCTypes.h (+36) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMapping.cpp (+1-1) 
- (modified) llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp (+3-4) 
- (modified) llvm/unittests/ProfileData/CoverageMappingTest.cpp (+3-4) 


``diff
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..888725dd2fc734 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -95,8 +95,6 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 }
 
 namespace {
-using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
-using MCDCParameters = CounterMappingRegion::MCDCParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -107,7 +105,7 @@ class SourceMappingRegion {
   std::optional FalseCount;
 
   /// Parameters used for Modified Condition/Decision Coverage
-  MCDCParameters MCDCParams;
+  mcdc::Parameters MCDCParams;
 
   /// The region's starting location.
   std::optional LocStart;
@@ -131,7 +129,7 @@ class SourceMappingRegion {
 SkippedRegion(false) {}
 
   SourceMappingRegion(Counter Count, std::optional FalseCount,
-  MCDCParameters MCDCParams,
+  mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd,
   bool GapRegion = false)
@@ -139,7 +137,7 @@ class SourceMappingRegion {
 LocStart(LocStart), LocEnd(LocEnd), GapRegion(GapRegion),
 SkippedRegion(false) {}
 
-  SourceMappingRegion(MCDCParameters MCDCParams,
+  SourceMappingRegion(mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd)
   : MCDCParams(MCDCParams), LocStart(LocStart), LocEnd(LocEnd),
@@ -187,7 +185,7 @@ class SourceMappingRegion {
 
   bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
 
-  const MCDCParameters &getMCDCParams() const { return MCDCParams; }
+  const mcdc::Parameters &getMCDCParams() const { return MCDCParams; }
 };
 
 /// Spelling locations for the start and end of a source region.
@@ -587,8 +585,8 @@ struct EmptyCoverageMappingBuilder : public 
CoverageMappingBuilder {
 struct MCDCCoverageBuilder {
 
   struct DecisionIDPair {
-MCDCConditionID TrueID = 0;
-MCDCConditionID FalseID = 0;
+mcdc::ConditionID TrueID = 0;
+mcdc::ConditionID FalseID = 0;
   };
 
   /// The AST walk recursively visits nested logical-AND or logical-OR binary
@@ -682,9 +680,9 @@ struct MCDCCoverageBuilder {
   CodeGenModule &CGM;
 
   llvm::SmallVector DecisionStack;
-  llvm::DenseMap &CondIDs;
+  llvm::DenseMap &CondIDs;
   llvm::DenseMap &MCDCBitmapMap;
-  MCDCConditionID NextID = 1;
+  mcdc::ConditionID NextID = 1;
   bool NotMapped = false;
 
   /// Represent a sentinel value of [0,0] for the bottom of DecisionStack.
@@ -696,9 +694,10 @@ struct MCDCCoverageBuilder {
   }
 
 public:
-  MCDCCoverageBuilder(CodeGenModule &CGM,
-  llvm::DenseMap &CondIDMap,
-  llvm::DenseMap &MCDCBitmapMap)
+  MCDCCoverageBuilder(
+  CodeGenModule &CGM,
+  llvm::DenseMap &CondIDMap,
+  llvm::DenseMap &MCDCBitmapMap)
   : CGM(CGM), DecisionStack(1, DecisionStackSentinel), CondIDs(CondIDMap),
 MCDCBitmapMap(MCDCBitmapMap) {}
 
@@ -713,12 +712,12 @@ struct MCDCCoverageBuilder {
   bool isBuilding() const { return (NextID > 1); }
 
   /// Set the given condition's ID.
-  void setCondID(const Expr *Cond, MCDCConditionID ID) {
+  void setCondID(const Expr *Cond, mcdc::ConditionID ID) {
 CondIDs[CodeGenFunction::stripCond(Cond)] = ID;
   }
 
   /// Return the ID of a given condition.
-  MCDCConditionID getCondID(const Expr *Cond) const {
+  mcdc::ConditionID getCondID(const Expr *Cond) const {
 auto I = CondIDs.find(CodeGenFunction::stripCond(Cond));
 if (I == CondIDs.end())
   return 0;
@@ -755,7 +754,7 @@ struct MCDCCoverageBuilder {
   setCondID(E->getLHS(), NextID++);
 
 // Assign a ID+1 for the RHS.
-MCDCConditionID RHSid = NextID++;
+mcdc::ConditionID RHSid = NextID++;
 setCondID(E->getRHS(), RHSid);
 
 // Push the LHS decision IDs onto the DecisionStack.
@@ -865,8 +864,8 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,
 std::optional EndLoc = std::nullopt,
 std::op

[clang] [llvm] __ARM_ARCH macro definition fix (PR #81301)

2024-02-12 Thread James Westwood via cfe-commits

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


[clang] Multilib support for libraries with exceptions (PR #75031)

2024-02-12 Thread Dominik Wójt via cfe-commits

https://github.com/domin144 approved this pull request.


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


[clang] [llvm] [MC/DC] Refactor: Introduce `MCDCTypes.h` for `coverage::mcdc` (PR #81459)

2024-02-12 Thread NAKAMURA Takumi via cfe-commits

https://github.com/chapuni updated 
https://github.com/llvm/llvm-project/pull/81459

>From 03bab9acf5aa3bf13c2223e92dbad040202d34bd Mon Sep 17 00:00:00 2001
From: NAKAMURA Takumi 
Date: Mon, 12 Feb 2024 18:43:56 +0900
Subject: [PATCH 1/2] [MC/DC] Refactor: Introduce `MCDCTypes.h` for the
 namespace `coverage::mcdc`

---
 clang/lib/CodeGen/CoverageMappingGen.cpp  | 53 +--
 .../ProfileData/Coverage/CoverageMapping.h| 33 
 .../llvm/ProfileData/Coverage/MCDCTypes.h | 36 +
 .../ProfileData/Coverage/CoverageMapping.cpp  |  2 +-
 .../Coverage/CoverageMappingReader.cpp|  7 ++-
 .../ProfileData/CoverageMappingTest.cpp   |  7 ++-
 6 files changed, 80 insertions(+), 58 deletions(-)
 create mode 100644 llvm/include/llvm/ProfileData/Coverage/MCDCTypes.h

diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 0c43317642bca4..888725dd2fc734 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -95,8 +95,6 @@ void CoverageSourceInfo::updateNextTokLoc(SourceLocation Loc) 
{
 }
 
 namespace {
-using MCDCConditionID = CounterMappingRegion::MCDCConditionID;
-using MCDCParameters = CounterMappingRegion::MCDCParameters;
 
 /// A region of source code that can be mapped to a counter.
 class SourceMappingRegion {
@@ -107,7 +105,7 @@ class SourceMappingRegion {
   std::optional FalseCount;
 
   /// Parameters used for Modified Condition/Decision Coverage
-  MCDCParameters MCDCParams;
+  mcdc::Parameters MCDCParams;
 
   /// The region's starting location.
   std::optional LocStart;
@@ -131,7 +129,7 @@ class SourceMappingRegion {
 SkippedRegion(false) {}
 
   SourceMappingRegion(Counter Count, std::optional FalseCount,
-  MCDCParameters MCDCParams,
+  mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd,
   bool GapRegion = false)
@@ -139,7 +137,7 @@ class SourceMappingRegion {
 LocStart(LocStart), LocEnd(LocEnd), GapRegion(GapRegion),
 SkippedRegion(false) {}
 
-  SourceMappingRegion(MCDCParameters MCDCParams,
+  SourceMappingRegion(mcdc::Parameters MCDCParams,
   std::optional LocStart,
   std::optional LocEnd)
   : MCDCParams(MCDCParams), LocStart(LocStart), LocEnd(LocEnd),
@@ -187,7 +185,7 @@ class SourceMappingRegion {
 
   bool isMCDCDecision() const { return MCDCParams.NumConditions != 0; }
 
-  const MCDCParameters &getMCDCParams() const { return MCDCParams; }
+  const mcdc::Parameters &getMCDCParams() const { return MCDCParams; }
 };
 
 /// Spelling locations for the start and end of a source region.
@@ -587,8 +585,8 @@ struct EmptyCoverageMappingBuilder : public 
CoverageMappingBuilder {
 struct MCDCCoverageBuilder {
 
   struct DecisionIDPair {
-MCDCConditionID TrueID = 0;
-MCDCConditionID FalseID = 0;
+mcdc::ConditionID TrueID = 0;
+mcdc::ConditionID FalseID = 0;
   };
 
   /// The AST walk recursively visits nested logical-AND or logical-OR binary
@@ -682,9 +680,9 @@ struct MCDCCoverageBuilder {
   CodeGenModule &CGM;
 
   llvm::SmallVector DecisionStack;
-  llvm::DenseMap &CondIDs;
+  llvm::DenseMap &CondIDs;
   llvm::DenseMap &MCDCBitmapMap;
-  MCDCConditionID NextID = 1;
+  mcdc::ConditionID NextID = 1;
   bool NotMapped = false;
 
   /// Represent a sentinel value of [0,0] for the bottom of DecisionStack.
@@ -696,9 +694,10 @@ struct MCDCCoverageBuilder {
   }
 
 public:
-  MCDCCoverageBuilder(CodeGenModule &CGM,
-  llvm::DenseMap &CondIDMap,
-  llvm::DenseMap &MCDCBitmapMap)
+  MCDCCoverageBuilder(
+  CodeGenModule &CGM,
+  llvm::DenseMap &CondIDMap,
+  llvm::DenseMap &MCDCBitmapMap)
   : CGM(CGM), DecisionStack(1, DecisionStackSentinel), CondIDs(CondIDMap),
 MCDCBitmapMap(MCDCBitmapMap) {}
 
@@ -713,12 +712,12 @@ struct MCDCCoverageBuilder {
   bool isBuilding() const { return (NextID > 1); }
 
   /// Set the given condition's ID.
-  void setCondID(const Expr *Cond, MCDCConditionID ID) {
+  void setCondID(const Expr *Cond, mcdc::ConditionID ID) {
 CondIDs[CodeGenFunction::stripCond(Cond)] = ID;
   }
 
   /// Return the ID of a given condition.
-  MCDCConditionID getCondID(const Expr *Cond) const {
+  mcdc::ConditionID getCondID(const Expr *Cond) const {
 auto I = CondIDs.find(CodeGenFunction::stripCond(Cond));
 if (I == CondIDs.end())
   return 0;
@@ -755,7 +754,7 @@ struct MCDCCoverageBuilder {
   setCondID(E->getLHS(), NextID++);
 
 // Assign a ID+1 for the RHS.
-MCDCConditionID RHSid = NextID++;
+mcdc::ConditionID RHSid = NextID++;
 setCondID(E->getRHS(), RHSid);
 
 // Push the LHS decision IDs onto the DecisionStack.
@@ -865,8 +864,8 @@ struct CounterCoverageMappingBuilder
 std::optional StartLoc = std::nullopt,

[clang] [llvm] [LLVM] Add `__builtin_readsteadycounter` intrinsic and builtin for realtime clocks (PR #81331)

2024-02-12 Thread Simon Pilgrim via cfe-commits

RKSimon wrote:

Are we assuming any particular relationship to __builtin_readcyclecounter in 
terms of scales etc? 

__builtin_readsteadycounter could be used to access x86 MPERF clock counters, 
but to access the corresponding APERF clock we'd then need a 
__builtin_readvariablecounter equivalent (__builtin_readcyclecounter gives the 
separate RDTSC clock value)

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


[clang] [clang][analyzer] Reformat code of BoolAssignmentChecker (NFC). (PR #81461)

2024-02-12 Thread Balázs Kéri via cfe-commits

https://github.com/balazske created 
https://github.com/llvm/llvm-project/pull/81461

This is only a code reformatting and rename of variables to the newer format.

From d1078be3394fc240de014f72116e18d6740b5773 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= 
Date: Mon, 12 Feb 2024 09:59:32 +0100
Subject: [PATCH] [clang][analyzer] Reformat code of BoolAssignmentChecker
 (NFC).

This is only a code reformatting and rename of variables to the
newer format.
---
 .../Checkers/BoolAssignmentChecker.cpp| 55 +--
 1 file changed, 27 insertions(+), 28 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
index a09db6d2d0ec5b..837cbbce8f45f3 100644
--- a/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
@@ -23,19 +23,19 @@ using namespace clang;
 using namespace ento;
 
 namespace {
-  class BoolAssignmentChecker : public Checker< check::Bind > {
-const BugType BT{this, "Assignment of a non-Boolean value"};
-void emitReport(ProgramStateRef state, CheckerContext &C,
-bool IsTainted = false) const;
-
-  public:
-void checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const;
-  };
+class BoolAssignmentChecker : public Checker {
+  const BugType BT{this, "Assignment of a non-Boolean value"};
+  void emitReport(ProgramStateRef State, CheckerContext &C,
+  bool IsTainted = false) const;
+
+public:
+  void checkBind(SVal Loc, SVal Val, const Stmt *S, CheckerContext &C) const;
+};
 } // end anonymous namespace
 
-void BoolAssignmentChecker::emitReport(ProgramStateRef state, CheckerContext 
&C,
+void BoolAssignmentChecker::emitReport(ProgramStateRef State, CheckerContext 
&C,
bool IsTainted) const {
-  if (ExplodedNode *N = C.generateNonFatalErrorNode(state)) {
+  if (ExplodedNode *N = C.generateNonFatalErrorNode(State)) {
 StringRef Msg = IsTainted ? "Might assign a tainted non-Boolean value"
   : "Assignment of a non-Boolean value";
 C.emitReport(std::make_unique(BT, Msg, N));
@@ -47,59 +47,58 @@ static bool isBooleanType(QualType Ty) {
 return true;
 
   if (const TypedefType *TT = Ty->getAs())
-return TT->getDecl()->getName() == "BOOL"   || // Objective-C
-   TT->getDecl()->getName() == "_Bool"  || // stdbool.h < C99
-   TT->getDecl()->getName() == "Boolean";  // MacTypes.h
+return TT->getDecl()->getName() == "BOOL" ||  // Objective-C
+   TT->getDecl()->getName() == "_Bool" || // stdbool.h < C99
+   TT->getDecl()->getName() == "Boolean"; // MacTypes.h
 
   return false;
 }
 
-void BoolAssignmentChecker::checkBind(SVal loc, SVal val, const Stmt *S,
+void BoolAssignmentChecker::checkBind(SVal Loc, SVal Val, const Stmt *S,
   CheckerContext &C) const {
 
   // We are only interested in stores into Booleans.
   const TypedValueRegion *TR =
-dyn_cast_or_null(loc.getAsRegion());
+  dyn_cast_or_null(Loc.getAsRegion());
 
   if (!TR)
 return;
 
-  QualType valTy = TR->getValueType();
+  QualType RegTy = TR->getValueType();
 
-  if (!isBooleanType(valTy))
+  if (!isBooleanType(RegTy))
 return;
 
   // Get the value of the right-hand side.  We only care about values
   // that are defined (UnknownVals and UndefinedVals are handled by other
   // checkers).
-  std::optional NV = val.getAs();
+  std::optional NV = Val.getAs();
   if (!NV)
 return;
 
   // Check if the assigned value meets our criteria for correctness.  It must
   // be a value that is either 0 or 1.  One way to check this is to see if
   // the value is possibly < 0 (for a negative value) or greater than 1.
-  ProgramStateRef state = C.getState();
-  SValBuilder &svalBuilder = C.getSValBuilder();
-  BasicValueFactory &BVF = svalBuilder.getBasicValueFactory();
+  ProgramStateRef State = C.getState();
+  BasicValueFactory &BVF = C.getSValBuilder().getBasicValueFactory();
   ConstraintManager &CM = C.getConstraintManager();
 
-  llvm::APSInt Zero = BVF.getValue(0, valTy);
-  llvm::APSInt One = BVF.getValue(1, valTy);
+  llvm::APSInt Zero = BVF.getValue(0, RegTy);
+  llvm::APSInt One = BVF.getValue(1, RegTy);
 
   ProgramStateRef StIn, StOut;
-  std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(state, *NV, Zero, One);
+  std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(State, *NV, Zero, One);
 
   if (!StIn)
 emitReport(StOut, C);
-  if (StIn && StOut && taint::isTainted(state, *NV))
+  if (StIn && StOut && taint::isTainted(State, *NV))
 emitReport(StOut, C, /*IsTainted=*/true);
 }
 
-void ento::registerBoolAssignmentChecker(CheckerManager &mgr) {
-mgr.registerChecker();
+void ento::registerBoolAssignmentChecker(CheckerManager &Mgr) {
+  Mgr.registerChecker();
 }
 
-bool ento::shouldRegisterBoolAssignmentChec

[clang] [clang][analyzer] Reformat code of BoolAssignmentChecker (NFC). (PR #81461)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Balázs Kéri (balazske)


Changes

This is only a code reformatting and rename of variables to the newer format.

---
Full diff: https://github.com/llvm/llvm-project/pull/81461.diff


1 Files Affected:

- (modified) clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp 
(+27-28) 


``diff
diff --git a/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
index a09db6d2d0ec5b..837cbbce8f45f3 100644
--- a/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
@@ -23,19 +23,19 @@ using namespace clang;
 using namespace ento;
 
 namespace {
-  class BoolAssignmentChecker : public Checker< check::Bind > {
-const BugType BT{this, "Assignment of a non-Boolean value"};
-void emitReport(ProgramStateRef state, CheckerContext &C,
-bool IsTainted = false) const;
-
-  public:
-void checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const;
-  };
+class BoolAssignmentChecker : public Checker {
+  const BugType BT{this, "Assignment of a non-Boolean value"};
+  void emitReport(ProgramStateRef State, CheckerContext &C,
+  bool IsTainted = false) const;
+
+public:
+  void checkBind(SVal Loc, SVal Val, const Stmt *S, CheckerContext &C) const;
+};
 } // end anonymous namespace
 
-void BoolAssignmentChecker::emitReport(ProgramStateRef state, CheckerContext 
&C,
+void BoolAssignmentChecker::emitReport(ProgramStateRef State, CheckerContext 
&C,
bool IsTainted) const {
-  if (ExplodedNode *N = C.generateNonFatalErrorNode(state)) {
+  if (ExplodedNode *N = C.generateNonFatalErrorNode(State)) {
 StringRef Msg = IsTainted ? "Might assign a tainted non-Boolean value"
   : "Assignment of a non-Boolean value";
 C.emitReport(std::make_unique(BT, Msg, N));
@@ -47,59 +47,58 @@ static bool isBooleanType(QualType Ty) {
 return true;
 
   if (const TypedefType *TT = Ty->getAs())
-return TT->getDecl()->getName() == "BOOL"   || // Objective-C
-   TT->getDecl()->getName() == "_Bool"  || // stdbool.h < C99
-   TT->getDecl()->getName() == "Boolean";  // MacTypes.h
+return TT->getDecl()->getName() == "BOOL" ||  // Objective-C
+   TT->getDecl()->getName() == "_Bool" || // stdbool.h < C99
+   TT->getDecl()->getName() == "Boolean"; // MacTypes.h
 
   return false;
 }
 
-void BoolAssignmentChecker::checkBind(SVal loc, SVal val, const Stmt *S,
+void BoolAssignmentChecker::checkBind(SVal Loc, SVal Val, const Stmt *S,
   CheckerContext &C) const {
 
   // We are only interested in stores into Booleans.
   const TypedValueRegion *TR =
-dyn_cast_or_null(loc.getAsRegion());
+  dyn_cast_or_null(Loc.getAsRegion());
 
   if (!TR)
 return;
 
-  QualType valTy = TR->getValueType();
+  QualType RegTy = TR->getValueType();
 
-  if (!isBooleanType(valTy))
+  if (!isBooleanType(RegTy))
 return;
 
   // Get the value of the right-hand side.  We only care about values
   // that are defined (UnknownVals and UndefinedVals are handled by other
   // checkers).
-  std::optional NV = val.getAs();
+  std::optional NV = Val.getAs();
   if (!NV)
 return;
 
   // Check if the assigned value meets our criteria for correctness.  It must
   // be a value that is either 0 or 1.  One way to check this is to see if
   // the value is possibly < 0 (for a negative value) or greater than 1.
-  ProgramStateRef state = C.getState();
-  SValBuilder &svalBuilder = C.getSValBuilder();
-  BasicValueFactory &BVF = svalBuilder.getBasicValueFactory();
+  ProgramStateRef State = C.getState();
+  BasicValueFactory &BVF = C.getSValBuilder().getBasicValueFactory();
   ConstraintManager &CM = C.getConstraintManager();
 
-  llvm::APSInt Zero = BVF.getValue(0, valTy);
-  llvm::APSInt One = BVF.getValue(1, valTy);
+  llvm::APSInt Zero = BVF.getValue(0, RegTy);
+  llvm::APSInt One = BVF.getValue(1, RegTy);
 
   ProgramStateRef StIn, StOut;
-  std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(state, *NV, Zero, One);
+  std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(State, *NV, Zero, One);
 
   if (!StIn)
 emitReport(StOut, C);
-  if (StIn && StOut && taint::isTainted(state, *NV))
+  if (StIn && StOut && taint::isTainted(State, *NV))
 emitReport(StOut, C, /*IsTainted=*/true);
 }
 
-void ento::registerBoolAssignmentChecker(CheckerManager &mgr) {
-mgr.registerChecker();
+void ento::registerBoolAssignmentChecker(CheckerManager &Mgr) {
+  Mgr.registerChecker();
 }
 
-bool ento::shouldRegisterBoolAssignmentChecker(const CheckerManager &mgr) {
+bool ento::shouldRegisterBoolAssignmentChecker(const CheckerManager &Mgr) {
   return true;
 }

``




https://github.com/llvm/llvm-project/pull/81461
___
cfe-com

[clang] [llvm] [AArch64] Add soft-float ABI (PR #74460)

2024-02-12 Thread via cfe-commits

ostannard wrote:

Ping, the ABI specification change 
(https://github.com/ARM-software/abi-aa/pull/232) has now been merged.

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


[clang] [clang-tools-extra] [codegen] Emit cleanups for lifetime-extended temporaries when an expr contains control-flow (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] [AArch64][SME2] Refactor arm_sme.td into multiclasses (PR #78169)

2024-02-12 Thread Matthew Devereau via cfe-commits

https://github.com/MDevereau updated 
https://github.com/llvm/llvm-project/pull/78169

>From aa9b6e584e5f469d5ed5d8ceaa56c3b424a98b02 Mon Sep 17 00:00:00 2001
From: Matt Devereau 
Date: Thu, 11 Jan 2024 17:21:10 +
Subject: [PATCH] [AArch64][SME2] Refactor arm_sme.td into multiclasses

Create some multiclasses for FMLA/FMLS, MLAL and MLSL
to reduce the size of arm_sme.td
---
 clang/include/clang/Basic/arm_sme.td | 283 ++-
 1 file changed, 107 insertions(+), 176 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sme.td 
b/clang/include/clang/Basic/arm_sme.td
index 2da0e8d2aba9a4..7d4b8c08776e6d 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -424,141 +424,118 @@ let TargetGuard = "sme2,sme-i16i64" in {
 }
 
 // FMLA/FMLS
-let TargetGuard = "sme2" in {
-  def SVMLA_MULTI_VG1x2_F32 : Inst<"svmla_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_MULTI_VG1x4_F32 : Inst<"svmla_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x2_F32 : Inst<"svmls_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x4_F32 : Inst<"svmls_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_SINGLE_VG1x2_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_SINGLE_VG1x4_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x2_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x4_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_LANE_VG1x2_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLA_LANE_VG1x4_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x2_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x4_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
+multiclass multi_vec_fmla_fmls {
+  let TargetGuard = "sme2" in {
+def NAME # _MULTI_VG1x2_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x2",
  "vm22",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x4",
  "vm44",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x2", "vm2d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x4", "vm4d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x2",   
  "vm2di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+def NAME # _LANE_VG1x4_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x4",   
  "vm4di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x4",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+  }
+  let TargetGuard = "sme2,sme-f64f64" in {
+def NAME # _MULTI_VG1x2_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x2",
  "vm22",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x4",
  "vm44",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x2", "vm2d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x4", "vm4d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F64   : Inst<"sv" # n # "_lane_za64[_{d}]_vg1x2",   
  "vm2di", "d", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>;
+def NAME # _LANE_VG1x4_F64   : Inst<"sv" # n # "_lane_

[clang] [AArch64][SME2] Refactor arm_sme.td into multiclasses (PR #78169)

2024-02-12 Thread Matthew Devereau via cfe-commits

https://github.com/MDevereau updated 
https://github.com/llvm/llvm-project/pull/78169

>From 79bf1ffc720d97e96bda477b445502d2cbe71369 Mon Sep 17 00:00:00 2001
From: Matt Devereau 
Date: Thu, 11 Jan 2024 17:21:10 +
Subject: [PATCH] [AArch64][SME2] Refactor arm_sme.td into multiclasses

Create some multiclasses for FMLA/FMLS, MLAL and MLSL
to reduce the size of arm_sme.td
---
 clang/include/clang/Basic/arm_sme.td | 282 ++-
 1 file changed, 106 insertions(+), 176 deletions(-)

diff --git a/clang/include/clang/Basic/arm_sme.td 
b/clang/include/clang/Basic/arm_sme.td
index 2da0e8d2aba9a4..a5e7ec6b03f8fa 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -424,141 +424,117 @@ let TargetGuard = "sme2,sme-i16i64" in {
 }
 
 // FMLA/FMLS
-let TargetGuard = "sme2" in {
-  def SVMLA_MULTI_VG1x2_F32 : Inst<"svmla_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_MULTI_VG1x4_F32 : Inst<"svmla_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x2_F32 : Inst<"svmls_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x4_F32 : Inst<"svmls_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_SINGLE_VG1x2_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_SINGLE_VG1x4_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x2_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x4_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_LANE_VG1x2_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLA_LANE_VG1x4_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x2_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x4_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
+multiclass multi_vec_fmla_fmls {
+  let TargetGuard = "sme2" in {
+def NAME # _MULTI_VG1x2_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x2",
  "vm22",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x4",
  "vm44",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x2", "vm2d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x4", "vm4d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x2",   
  "vm2di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+def NAME # _LANE_VG1x4_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x4",   
  "vm4di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x4",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+  }
+  let TargetGuard = "sme2,sme-f64f64" in {
+def NAME # _MULTI_VG1x2_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x2",
  "vm22",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x4",
  "vm44",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x2", "vm2d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x4", "vm4d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F64   : Inst<"sv" # n # "_lane_za64[_{d}]_vg1x2",   
  "vm2di", "d", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>;
+def NAME # _LANE_VG1x4_F64   : Inst<"sv" # n # "_lane_

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread James Westwood via cfe-commits

https://github.com/jwestwood921 created 
https://github.com/llvm/llvm-project/pull/81466

Added functionality to the ARMTargetParser to obtain the minor version of each 
architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH 
correctly.

In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version 
for ISAs up to and including v8. From v8.1 onwards, it's definition is changed 
to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = 
X*100 + Y.

>From 08628a75872266bdb1365ed39754512b1a400a70 Mon Sep 17 00:00:00 2001
From: James Westwood 
Date: Fri, 9 Feb 2024 19:06:20 +
Subject: [PATCH] __ARM_ARCH macro definition fix

Added functionality to the ARMTargetParser to obtain the minor version of each 
architecture, and amended ARM.cpp and AArch64.cpp to define
__ARM_ARCH correctly.

In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version 
for ISAs up to and including v8. From v8.1 onwards, it's
definition is changed to include minor versions, such that for an architecture 
vX.Y, __ARM_ARCH = X*100 + Y.
---
 clang/lib/Basic/Targets/AArch64.cpp   | 17 +-
 clang/lib/Basic/Targets/ARM.cpp   | 14 -
 clang/lib/Basic/Targets/ARM.h |  1 +
 clang/test/Preprocessor/arm-target-features.c | 34 +--
 .../llvm/TargetParser/ARMTargetParser.h   |  1 +
 llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++
 .../TargetParser/TargetParserTest.cpp |  8 +++
 7 files changed, 111 insertions(+), 22 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 68032961451d90..32bca34f8976eb 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
+
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0)
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()));
+  else
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()*100 +
+   ArchInfo->Version.getMinor().value()));
+
   Builder.defineMacro("__ARM_ARCH_PROFILE",
   std::string("'") + (char)ArchInfo->Profile + "'");
 
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 55b71557452fa0..f1d649425840bc 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
   SubArch = llvm::ARM::getSubArch(ArchKind);
   ArchProfile = llvm::ARM::parseArchProfile(SubArch);
   ArchVersion = llvm::ARM::parseArchVersion(SubArch);
+  ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch);
 
   // cache CPU related strings
   CPUAttr = getCPUAttr();
@@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (!CPUAttr.empty())
 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
 
-  // ACLE 6.4.1 ARM/Thumb instruction set architecture
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
-  Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchVersion >= 9 || ArchMinorVersion != 0)
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + 
ArchMinorVersion));
+  else
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 
   if (ArchVersion >= 8) {
 // ACLE 6.5.7 Crypto Extension
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 9802eb01abf3c4..9c4bd299f67339 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public 
TargetInfo {
   llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
   llvm::ARM::ProfileKind ArchProfile;
   unsigned ArchVersion;

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread via cfe-commits

github-actions[bot] wrote:



Thank you for submitting a Pull Request (PR) to the LLVM Project!

This PR will be automatically labeled and the relevant teams will be
notified.

If you wish to, you can add reviewers by using the "Reviewers" section on this 
page.

If this is not working for you, it is probably because you do not have write
permissions for the repository. In which case you can instead tag reviewers by
name in a comment by using `@` followed by their GitHub username.

If you have received no comments on your PR for a week, you can request a review
by "ping"ing the PR by adding a comment “Ping”. The common courtesy "ping" rate
is once a week. Please remember that you are asking for valuable time from 
other developers.

If you have further questions, they may be answered by the [LLVM GitHub User 
Guide](https://llvm.org/docs/GitHub.html).

You can also ask questions in a comment on this PR, on the [LLVM 
Discord](https://discord.com/invite/xS7Z362) or on the 
[forums](https://discourse.llvm.org/).

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


[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: James Westwood (jwestwood921)


Changes

Added functionality to the ARMTargetParser to obtain the minor version of each 
architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH 
correctly.

In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version 
for ISAs up to and including v8. From v8.1 onwards, it's definition is changed 
to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = 
X*100 + Y.

---
Full diff: https://github.com/llvm/llvm-project/pull/81466.diff


7 Files Affected:

- (modified) clang/lib/Basic/Targets/AArch64.cpp (+15-2) 
- (modified) clang/lib/Basic/Targets/ARM.cpp (+11-3) 
- (modified) clang/lib/Basic/Targets/ARM.h (+1) 
- (modified) clang/test/Preprocessor/arm-target-features.c (+17-17) 
- (modified) llvm/include/llvm/TargetParser/ARMTargetParser.h (+1) 
- (modified) llvm/lib/TargetParser/ARMTargetParser.cpp (+58) 
- (modified) llvm/unittests/TargetParser/TargetParserTest.cpp (+8) 


``diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 68032961451d90..32bca34f8976eb 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
+
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0)
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()));
+  else
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()*100 +
+   ArchInfo->Version.getMinor().value()));
+
   Builder.defineMacro("__ARM_ARCH_PROFILE",
   std::string("'") + (char)ArchInfo->Profile + "'");
 
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 55b71557452fa0..f1d649425840bc 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
   SubArch = llvm::ARM::getSubArch(ArchKind);
   ArchProfile = llvm::ARM::parseArchProfile(SubArch);
   ArchVersion = llvm::ARM::parseArchVersion(SubArch);
+  ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch);
 
   // cache CPU related strings
   CPUAttr = getCPUAttr();
@@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (!CPUAttr.empty())
 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
 
-  // ACLE 6.4.1 ARM/Thumb instruction set architecture
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
-  Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchVersion >= 9 || ArchMinorVersion != 0)
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + 
ArchMinorVersion));
+  else
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 
   if (ArchVersion >= 8) {
 // ACLE 6.5.7 Crypto Extension
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 71322a094f5edb..df06e4d120637a 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public 
TargetInfo {
   llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
   llvm::ARM::ProfileKind ArchProfile;
   unsigned ArchVersion;
+  unsigned ArchMinorVersion;
 
   LLVM_PREFERRED_TYPE(FPUMode)
   unsigned FPU : 5;
diff --git a/clang/test/Preprocessor/arm-target-features.c 
b/clang/test/Preprocessor/arm-target-features.c
index 236c9f2479b705..733d068b09b1fe 100644
--- a/clang/test/Preprocessor/arm-target-features.c
+++ b/clang/test/Preprocessor/arm-target-features.c
@@ -737,7 +737,7 @@
 
 // Test whether predefines are as expected when targeting cortex-m55 (softfp 
FP ABI as default).
 // RUN: %clang -target arm-eabi -mcpu=cortex-m55 -x c -E -dM %s

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-backend-aarch64

Author: James Westwood (jwestwood921)


Changes

Added functionality to the ARMTargetParser to obtain the minor version of each 
architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH 
correctly.

In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version 
for ISAs up to and including v8. From v8.1 onwards, it's definition is changed 
to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = 
X*100 + Y.

---
Full diff: https://github.com/llvm/llvm-project/pull/81466.diff


7 Files Affected:

- (modified) clang/lib/Basic/Targets/AArch64.cpp (+15-2) 
- (modified) clang/lib/Basic/Targets/ARM.cpp (+11-3) 
- (modified) clang/lib/Basic/Targets/ARM.h (+1) 
- (modified) clang/test/Preprocessor/arm-target-features.c (+17-17) 
- (modified) llvm/include/llvm/TargetParser/ARMTargetParser.h (+1) 
- (modified) llvm/lib/TargetParser/ARMTargetParser.cpp (+58) 
- (modified) llvm/unittests/TargetParser/TargetParserTest.cpp (+8) 


``diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 68032961451d90..32bca34f8976eb 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
+
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0)
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()));
+  else
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()*100 +
+   ArchInfo->Version.getMinor().value()));
+
   Builder.defineMacro("__ARM_ARCH_PROFILE",
   std::string("'") + (char)ArchInfo->Profile + "'");
 
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 55b71557452fa0..f1d649425840bc 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
   SubArch = llvm::ARM::getSubArch(ArchKind);
   ArchProfile = llvm::ARM::parseArchProfile(SubArch);
   ArchVersion = llvm::ARM::parseArchVersion(SubArch);
+  ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch);
 
   // cache CPU related strings
   CPUAttr = getCPUAttr();
@@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (!CPUAttr.empty())
 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
 
-  // ACLE 6.4.1 ARM/Thumb instruction set architecture
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
-  Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchVersion >= 9 || ArchMinorVersion != 0)
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + 
ArchMinorVersion));
+  else
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 
   if (ArchVersion >= 8) {
 // ACLE 6.5.7 Crypto Extension
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 71322a094f5edb..df06e4d120637a 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public 
TargetInfo {
   llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
   llvm::ARM::ProfileKind ArchProfile;
   unsigned ArchVersion;
+  unsigned ArchMinorVersion;
 
   LLVM_PREFERRED_TYPE(FPUMode)
   unsigned FPU : 5;
diff --git a/clang/test/Preprocessor/arm-target-features.c 
b/clang/test/Preprocessor/arm-target-features.c
index 236c9f2479b705..733d068b09b1fe 100644
--- a/clang/test/Preprocessor/arm-target-features.c
+++ b/clang/test/Preprocessor/arm-target-features.c
@@ -737,7 +737,7 @@
 
 // Test whether predefines are as expected when targeting cortex-m55 (softfp 
FP ABI as default).
 // RUN: %clang -target arm-eabi -mcpu=cortex-m55 -x c

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread via cfe-commits

github-actions[bot] wrote:

⚠️ We detected that you are using a GitHub private e-mail address to contribute 
to the repo.
  Please turn off [Keep my email addresses 
private](https://github.com/settings/emails) setting in your account.
  See [LLVM 
Discourse](https://discourse.llvm.org/t/hidden-emails-on-github-should-we-do-something-about-it)
 for more information.


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


[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 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 c609846155279090a4f9e659f63fb851e4946cb7 
4b91b1be657dcf01d5c7f70d4c62a8ba60185efd -- clang/lib/Basic/Targets/AArch64.cpp 
clang/lib/Basic/Targets/ARM.cpp clang/lib/Basic/Targets/ARM.h 
clang/test/Preprocessor/arm-target-features.c 
llvm/include/llvm/TargetParser/ARMTargetParser.h 
llvm/lib/TargetParser/ARMTargetParser.cpp 
llvm/unittests/TargetParser/TargetParserTest.cpp
``





View the diff from clang-format here.


``diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 32bca34f89..3ef283f824 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -379,7 +379,7 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 std::to_string(ArchInfo->Version.getMajor()));
   else
 Builder.defineMacro("__ARM_ARCH",
-std::to_string(ArchInfo->Version.getMajor()*100 +
+std::to_string(ArchInfo->Version.getMajor() * 100 +
ArchInfo->Version.getMinor().value()));
 
   Builder.defineMacro("__ARM_ARCH_PROFILE",
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index f1d6494258..9ac558caa2 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -744,7 +744,8 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   // minor version number, e.g. for ARM architecture ARMvX.Y:
   // __ARM_ARCH = X * 100 + Y.
   if (ArchVersion >= 9 || ArchMinorVersion != 0)
-Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + 
ArchMinorVersion));
+Builder.defineMacro("__ARM_ARCH",
+Twine(ArchVersion * 100 + ArchMinorVersion));
   else
 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 

``




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


[clang] [clang-tools-extra] [codegen] Emit cleanups for lifetime-extended temporaries when an expr contains control-flow (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/80698

>From 28d90711ff8e4924135d4bd4e5f252d96ac41b93 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Tue, 23 Jan 2024 20:18:25 +
Subject: [PATCH 01/11] [misc-coroutine-hostile-raii] Use getOperand instead of
 getCommonExpr

---
 .../misc/CoroutineHostileRAIICheck.cpp|  2 +-
 .../checkers/misc/coroutine-hostile-raii.cpp  | 34 ++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp 
b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
index a0e8700b0522bc..360335b86c6418 100644
--- a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
@@ -56,7 +56,7 @@ AST_MATCHER_P(Stmt, forEachPrevStmt, 
ast_matchers::internal::Matcher,
 // Matches the expression awaited by the `co_await`.
 AST_MATCHER_P(CoawaitExpr, awaitable, ast_matchers::internal::Matcher,
   InnerMatcher) {
-  if (Expr *E = Node.getCommonExpr())
+  if (Expr *E = Node.getOperand())
 return InnerMatcher.matches(*E, Finder, Builder);
   return false;
 }
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
index 55a7e4b8f2954a..c23c355dac1b2a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
@@ -1,7 +1,7 @@
 // RUN: %check_clang_tidy -std=c++20 %s misc-coroutine-hostile-raii %t \
 // RUN:   -config="{CheckOptions: {\
 // RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; 
::my::other::Mutex', \
-// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::my::other::awaitable' \
+// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::transformable::awaitable' \
 // RUN: }}"
 
 namespace std {
@@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
 absl::Mutex no_warning_5;
 }
 
+// 

+// Safe awaitable
+// 

 namespace safe {
   struct awaitable {
   bool await_ready() noexcept { return false; }
@@ -150,6 +153,32 @@ ReturnObject RAIISafeSuspendTest() {
   co_await other{};
 } 
 
+// 

+// Safe transformable awaitable
+// 

+struct transformable { struct awaitable{}; };
+using alias_transformable_awaitable = transformable::awaitable;
+struct UseTransformAwaitable {
+  struct promise_type {
+UseTransformAwaitable get_return_object() { return {}; }
+std::suspend_always initial_suspend() { return {}; }
+std::suspend_always final_suspend() noexcept { return {}; }
+void unhandled_exception() {}
+std::suspend_always await_transform(transformable::awaitable) { return {}; 
}
+  };
+};
+
+auto retAwaitable() { return transformable::awaitable{}; }
+UseTransformAwaitable RAIISafeSuspendTest2() {
+  absl::Mutex a;
+  co_await retAwaitable();
+  co_await transformable::awaitable{};
+  co_await alias_transformable_awaitable{};
+}
+
+// 

+// Lambdas
+// 

 void lambda() {
   absl::Mutex no_warning;
   auto lambda = []() -> ReturnObject {
@@ -164,6 +193,9 @@ void lambda() {
   absl::Mutex no_warning_2;
 }
 
+// 

+// Denylisted RAII
+// 

 template
 ReturnObject raii_in_template(){
   T a;

>From 442809ce6047f8f83c9f3f54b17182c18535bb03 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Mon, 5 Feb 2024 15:52:56 +
Subject: [PATCH 02/11] [codegen] Emit cleanups for lifetime-extended
 temporaries when statment-expression has control-flow

---
 clang/lib/CodeGen/CGCleanup.cpp   | 31 +--
 clang/lib/CodeGen/CodeGenFunction.h   |  4 +
 .../return-in-stmt-expr-cleanup.cpp   | 37 +
 .../coro-suspend-in-agg-init.cpp  | 82 +++
 4 files changed, 145 insertions(+), 9 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/return-in-stmt-expr-cleanup.cpp
 create mode 100644 clang/test/CodeGenCoroutines/coro-suspend-in-agg-init.cpp

diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp
index f87caf050eeaa7..da0528b271aa37 100644
--- a/clang/lib/CodeGen/CGCleanup.cpp
+++ b/clang/lib/CodeGen/CGCleanup.cpp
@@ -488,16 +48

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread James Westwood via cfe-commits

https://github.com/jwestwood921 updated 
https://github.com/llvm/llvm-project/pull/81466

>From 08628a75872266bdb1365ed39754512b1a400a70 Mon Sep 17 00:00:00 2001
From: James Westwood 
Date: Fri, 9 Feb 2024 19:06:20 +
Subject: [PATCH 1/2] __ARM_ARCH macro definition fix

Added functionality to the ARMTargetParser to obtain the minor version of each 
architecture, and amended ARM.cpp and AArch64.cpp to define
__ARM_ARCH correctly.

In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version 
for ISAs up to and including v8. From v8.1 onwards, it's
definition is changed to include minor versions, such that for an architecture 
vX.Y, __ARM_ARCH = X*100 + Y.
---
 clang/lib/Basic/Targets/AArch64.cpp   | 17 +-
 clang/lib/Basic/Targets/ARM.cpp   | 14 -
 clang/lib/Basic/Targets/ARM.h |  1 +
 clang/test/Preprocessor/arm-target-features.c | 34 +--
 .../llvm/TargetParser/ARMTargetParser.h   |  1 +
 llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++
 .../TargetParser/TargetParserTest.cpp |  8 +++
 7 files changed, 111 insertions(+), 22 deletions(-)

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index 68032961451d90..32bca34f8976eb 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions 
&Opts,
 
   // ACLE predefines. Many can only have one possible value on v8 AArch64.
   Builder.defineMacro("__ARM_ACLE", "200");
-  Builder.defineMacro("__ARM_ARCH",
-  std::to_string(ArchInfo->Version.getMajor()));
+
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0)
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()));
+  else
+Builder.defineMacro("__ARM_ARCH",
+std::to_string(ArchInfo->Version.getMajor()*100 +
+   ArchInfo->Version.getMinor().value()));
+
   Builder.defineMacro("__ARM_ARCH_PROFILE",
   std::string("'") + (char)ArchInfo->Profile + "'");
 
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 55b71557452fa0..f1d649425840bc 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
   SubArch = llvm::ARM::getSubArch(ArchKind);
   ArchProfile = llvm::ARM::parseArchProfile(SubArch);
   ArchVersion = llvm::ARM::parseArchVersion(SubArch);
+  ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch);
 
   // cache CPU related strings
   CPUAttr = getCPUAttr();
@@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions 
&Opts,
   if (!CPUAttr.empty())
 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
 
-  // ACLE 6.4.1 ARM/Thumb instruction set architecture
-  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
-  Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
+  // ACLE 5.4.1 ARM/Thumb instruction set architecture
+  // __ARM_ARCH is defined as an integer value indicating the current ARM ISA.
+  // For ISAs up to and including v8, __ARM_ARCH is equal to the major version
+  // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the
+  // minor version number, e.g. for ARM architecture ARMvX.Y:
+  // __ARM_ARCH = X * 100 + Y.
+  if (ArchVersion >= 9 || ArchMinorVersion != 0)
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + 
ArchMinorVersion));
+  else
+Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
 
   if (ArchVersion >= 8) {
 // ACLE 6.5.7 Crypto Extension
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 9802eb01abf3c4..9c4bd299f67339 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public 
TargetInfo {
   llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
   llvm::ARM::ProfileKind ArchProfile;
   unsigned ArchVersion;
+  unsigned ArchMinorVersion;
 
   unsigned FPU : 5;
   unsigned MVE : 2;
diff --git a/clang/test/Preprocessor/arm-target-features.c 
b/clang/test/Preprocessor/arm-target-features.c
index 236c9f2479b705..733d068b09b1fe 100644
--- a/clang/test/Preprocessor/arm-target-features.c
+++ b/clang/test/Preprocessor/arm-target-features.c
@@ -737,7 +737,7 @@
 
 // Test whether predefines are as expected when targetin

[clang] [Clang][Sema]: Allow copy constructor side effects (PR #81127)

2024-02-12 Thread Vinayak Dev via cfe-commits

vinayakdsci wrote:

@Endilll sorry for repeated pings, but I think @cor3ntin might be possibly busy.

If this looks good, can we go ahead with this PR?

Thanks!

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


[clang] [Clang][Sema]: Allow copy constructor side effects (PR #81127)

2024-02-12 Thread via cfe-commits

cor3ntin wrote:

We have a policy against more than one ping per week, thanks.

FYI, if we are not going to fix the C++11 case, we should be very explicit 
about it. IE this PR is not a complete fix of 
https://github.com/llvm/llvm-project/issues/79518

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


[clang] [Clang][RISCV] Add assumptions to vsetvli/vsetvlimax (PR #79975)

2024-02-12 Thread Yingwei Zheng via cfe-commits

dtcxzyw wrote:

Can we implement this in `computeKnownBitsFromOperator/getRangeForIntrinsic`?
https://github.com/llvm/llvm-project/blob/b21e3282864c9f7ad656c64bc375f5869ef76d19/llvm/lib/Analysis/ValueTracking.cpp#L1578-L1584

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


[clang] [clang-tools-extra] [codegen] Emit cleanups for lifetime-extended temporaries when an expr contains control-flow (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] 268799c - [clang][Interp][NFC] Refactor Pointer::toAPValue()

2024-02-12 Thread Timm Bäder via cfe-commits

Author: Timm Bäder
Date: 2024-02-12T13:27:42+01:00
New Revision: 268799cc59ef7af237278d058c6e2ee2c8eb227d

URL: 
https://github.com/llvm/llvm-project/commit/268799cc59ef7af237278d058c6e2ee2c8eb227d
DIFF: 
https://github.com/llvm/llvm-project/commit/268799cc59ef7af237278d058c6e2ee2c8eb227d.diff

LOG: [clang][Interp][NFC] Refactor Pointer::toAPValue()

Use early-out style rather than letting control flow through
the entire function.

Added: 


Modified: 
clang/lib/AST/Interp/Pointer.cpp

Removed: 




diff  --git a/clang/lib/AST/Interp/Pointer.cpp 
b/clang/lib/AST/Interp/Pointer.cpp
index 316a7ed5fa1bb8..dd8868d0b1ec22 100644
--- a/clang/lib/AST/Interp/Pointer.cpp
+++ b/clang/lib/AST/Interp/Pointer.cpp
@@ -83,63 +83,47 @@ void Pointer::operator=(Pointer &&P) {
 }
 
 APValue Pointer::toAPValue() const {
-  APValue::LValueBase Base;
   llvm::SmallVector Path;
-  CharUnits Offset;
-  bool IsNullPtr;
-  bool IsOnePastEnd;
-
-  if (isZero()) {
-Base = static_cast(nullptr);
-IsNullPtr = true;
-IsOnePastEnd = false;
-Offset = CharUnits::Zero();
-  } else {
-// Build the lvalue base from the block.
-const Descriptor *Desc = getDeclDesc();
-if (auto *VD = Desc->asValueDecl())
-  Base = VD;
-else if (auto *E = Desc->asExpr())
-  Base = E;
-else
-  llvm_unreachable("Invalid allocation type");
-
-// Not a null pointer.
-IsNullPtr = false;
-
-if (isUnknownSizeArray()) {
-  IsOnePastEnd = false;
-  Offset = CharUnits::Zero();
-} else if (Desc->asExpr()) {
-  // Pointer pointing to a an expression.
-  IsOnePastEnd = false;
-  Offset = CharUnits::Zero();
+
+  if (isZero())
+return APValue(static_cast(nullptr), CharUnits::Zero(), Path,
+   false, /*IsNullPtr=*/false);
+
+  // Build the lvalue base from the block.
+  const Descriptor *Desc = getDeclDesc();
+  APValue::LValueBase Base;
+  if (auto *VD = Desc->asValueDecl())
+Base = VD;
+  else if (auto *E = Desc->asExpr())
+Base = E;
+  else
+llvm_unreachable("Invalid allocation type");
+
+  if (isUnknownSizeArray() || Desc->asExpr())
+return APValue(Base, CharUnits::Zero(), Path, false, false);
+
+  // TODO: compute the offset into the object.
+  CharUnits Offset = CharUnits::Zero();
+  bool IsOnePastEnd = isOnePastEnd();
+
+  // Build the path into the object.
+  Pointer Ptr = *this;
+  while (Ptr.isField() || Ptr.isArrayElement()) {
+if (Ptr.isArrayElement()) {
+  Path.push_back(APValue::LValuePathEntry::ArrayIndex(Ptr.getIndex()));
+  Ptr = Ptr.getArray();
 } else {
-  // TODO: compute the offset into the object.
-  Offset = CharUnits::Zero();
-
-  // Build the path into the object.
-  Pointer Ptr = *this;
-  while (Ptr.isField() || Ptr.isArrayElement()) {
-if (Ptr.isArrayElement()) {
-  Path.push_back(APValue::LValuePathEntry::ArrayIndex(Ptr.getIndex()));
-  Ptr = Ptr.getArray();
-} else {
-  // TODO: figure out if base is virtual
-  bool IsVirtual = false;
-
-  // Create a path entry for the field.
-  const Descriptor *Desc = Ptr.getFieldDesc();
-  if (const auto *BaseOrMember = Desc->asDecl()) {
-Path.push_back(APValue::LValuePathEntry({BaseOrMember, 
IsVirtual}));
-Ptr = Ptr.getBase();
-continue;
-  }
-  llvm_unreachable("Invalid field type");
-}
+  // TODO: figure out if base is virtual
+  bool IsVirtual = false;
+
+  // Create a path entry for the field.
+  const Descriptor *Desc = Ptr.getFieldDesc();
+  if (const auto *BaseOrMember = Desc->asDecl()) {
+Path.push_back(APValue::LValuePathEntry({BaseOrMember, IsVirtual}));
+Ptr = Ptr.getBase();
+continue;
   }
-
-  IsOnePastEnd = isOnePastEnd();
+  llvm_unreachable("Invalid field type");
 }
   }
 
@@ -149,7 +133,7 @@ APValue Pointer::toAPValue() const {
   // Just invert the order of the elements.
   std::reverse(Path.begin(), Path.end());
 
-  return APValue(Base, Offset, Path, IsOnePastEnd, IsNullPtr);
+  return APValue(Base, Offset, Path, IsOnePastEnd, /*IsNullPtr=*/false);
 }
 
 std::string Pointer::toDiagnosticString(const ASTContext &Ctx) const {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Sema]: Allow copy constructor side effects (PR #81127)

2024-02-12 Thread Vinayak Dev via cfe-commits

vinayakdsci wrote:

Sorry about the pings, I think I got a little ahead of myself there.
But for C++11, we got to the conclusion that copy elision gives different 
behaviour for C++17 and later and thus different diagnostics?
In case I made a mistake, I'd be very happy to fix it.

Thanks
P.S. Sorry about the pings, please forgive me.

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits

https://github.com/arsenm commented:

Needs documentation in AMDGPUUsage. Should also clarify behavior of 0 

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits


@@ -356,6 +356,19 @@ void AMDGPUTargetCodeGenInfo::setFunctionDeclAttributes(
 if (NumVGPR != 0)
   F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR));
   }
+
+  if (const auto *Attr = FD->getAttr()) {
+uint32_t X = Attr->getNumWorkGroupsX();
+uint32_t Y = Attr->getNumWorkGroupsY();
+uint32_t Z = Attr->getNumWorkGroupsZ();
+
+if (X != 0 && Y != 0 && Z != 0) {
+  std::string AttrVal = llvm::utostr(X) + std::string(", ") +
+llvm::utostr(Y) + std::string(", ") +
+llvm::utostr(Z);

arsenm wrote:

SmallString + raw_svector_ostream 

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits


@@ -1108,3 +1108,8 @@ void 
GCNUserSGPRUsageInfo::allocKernargPreloadSGPRs(unsigned NumSGPRs) {
 unsigned GCNUserSGPRUsageInfo::getNumFreeUserSGPRs() {
   return AMDGPU::getMaxNumUserSGPRs(ST) - NumUsedUserSGPRs;
 }
+
+SmallVector

arsenm wrote:

std::array<3>?

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits


@@ -0,0 +1,84 @@
+; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s 
| FileCheck %s

arsenm wrote:

Don't need -verify-machineinstrs 

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits


@@ -356,6 +356,19 @@ void AMDGPUTargetCodeGenInfo::setFunctionDeclAttributes(
 if (NumVGPR != 0)
   F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR));
   }
+
+  if (const auto *Attr = FD->getAttr()) {
+uint32_t X = Attr->getNumWorkGroupsX();
+uint32_t Y = Attr->getNumWorkGroupsY();
+uint32_t Z = Attr->getNumWorkGroupsZ();
+
+if (X != 0 && Y != 0 && Z != 0) {

arsenm wrote:

shouldn't it try to set this if any dimension has a relevant value?

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits


@@ -2031,6 +2031,13 @@ def AMDGPUNumVGPR : InheritableAttr {
   let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
 }
 
+def AMDGPUNumWorkGroups : InheritableAttr {
+  let Spellings = [Clang<"amdgpu_num_work_groups", 0>];

arsenm wrote:

max_num? num_work_groups implies an exact match 

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


[clang] [llvm] [AMDGPU] Adding the amdgpu-num-work-groups function attribute (PR #79035)

2024-02-12 Thread Matt Arsenault via cfe-commits

arsenm wrote:

Also should have follow up patch to propagate in AMDGPUAttributor, and another 
to lower to !range in AMDGPULowerKernelAttributes

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/80698

>From 28d90711ff8e4924135d4bd4e5f252d96ac41b93 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Tue, 23 Jan 2024 20:18:25 +
Subject: [PATCH 01/12] [misc-coroutine-hostile-raii] Use getOperand instead of
 getCommonExpr

---
 .../misc/CoroutineHostileRAIICheck.cpp|  2 +-
 .../checkers/misc/coroutine-hostile-raii.cpp  | 34 ++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp 
b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
index a0e8700b0522bc..360335b86c6418 100644
--- a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
@@ -56,7 +56,7 @@ AST_MATCHER_P(Stmt, forEachPrevStmt, 
ast_matchers::internal::Matcher,
 // Matches the expression awaited by the `co_await`.
 AST_MATCHER_P(CoawaitExpr, awaitable, ast_matchers::internal::Matcher,
   InnerMatcher) {
-  if (Expr *E = Node.getCommonExpr())
+  if (Expr *E = Node.getOperand())
 return InnerMatcher.matches(*E, Finder, Builder);
   return false;
 }
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
index 55a7e4b8f2954a..c23c355dac1b2a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
@@ -1,7 +1,7 @@
 // RUN: %check_clang_tidy -std=c++20 %s misc-coroutine-hostile-raii %t \
 // RUN:   -config="{CheckOptions: {\
 // RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; 
::my::other::Mutex', \
-// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::my::other::awaitable' \
+// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::transformable::awaitable' \
 // RUN: }}"
 
 namespace std {
@@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
 absl::Mutex no_warning_5;
 }
 
+// 

+// Safe awaitable
+// 

 namespace safe {
   struct awaitable {
   bool await_ready() noexcept { return false; }
@@ -150,6 +153,32 @@ ReturnObject RAIISafeSuspendTest() {
   co_await other{};
 } 
 
+// 

+// Safe transformable awaitable
+// 

+struct transformable { struct awaitable{}; };
+using alias_transformable_awaitable = transformable::awaitable;
+struct UseTransformAwaitable {
+  struct promise_type {
+UseTransformAwaitable get_return_object() { return {}; }
+std::suspend_always initial_suspend() { return {}; }
+std::suspend_always final_suspend() noexcept { return {}; }
+void unhandled_exception() {}
+std::suspend_always await_transform(transformable::awaitable) { return {}; 
}
+  };
+};
+
+auto retAwaitable() { return transformable::awaitable{}; }
+UseTransformAwaitable RAIISafeSuspendTest2() {
+  absl::Mutex a;
+  co_await retAwaitable();
+  co_await transformable::awaitable{};
+  co_await alias_transformable_awaitable{};
+}
+
+// 

+// Lambdas
+// 

 void lambda() {
   absl::Mutex no_warning;
   auto lambda = []() -> ReturnObject {
@@ -164,6 +193,9 @@ void lambda() {
   absl::Mutex no_warning_2;
 }
 
+// 

+// Denylisted RAII
+// 

 template
 ReturnObject raii_in_template(){
   T a;

>From 442809ce6047f8f83c9f3f54b17182c18535bb03 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Mon, 5 Feb 2024 15:52:56 +
Subject: [PATCH 02/12] [codegen] Emit cleanups for lifetime-extended
 temporaries when statment-expression has control-flow

---
 clang/lib/CodeGen/CGCleanup.cpp   | 31 +--
 clang/lib/CodeGen/CodeGenFunction.h   |  4 +
 .../return-in-stmt-expr-cleanup.cpp   | 37 +
 .../coro-suspend-in-agg-init.cpp  | 82 +++
 4 files changed, 145 insertions(+), 9 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/return-in-stmt-expr-cleanup.cpp
 create mode 100644 clang/test/CodeGenCoroutines/coro-suspend-in-agg-init.cpp

diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp
index f87caf050eeaa7..da0528b271aa37 100644
--- a/clang/lib/CodeGen/CGCleanup.cpp
+++ b/clang/lib/CodeGen/CGCleanup.cpp
@@ -488,16 +48

[clang] [clang][dataflow] Add `Environment::initializeFieldsWithValues()`. (PR #81239)

2024-02-12 Thread via cfe-commits

martinboehme wrote:

CI failure appears to be an infrastructure failure

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


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-12 Thread Dominik Wójt via cfe-commits

https://github.com/domin144 created 
https://github.com/llvm/llvm-project/pull/81474

The deduced "-march=" option always started with aarch64, which is not a valid 
value. There was also no way to distinguish between armv8-r and armv8-a. After 
this commit, the deduced "-march=" option will start with greatest available 
"armv*-a" value or "armv8-r".

From 8f8d2b304aa90c0aea00d67e86d285ecd870e443 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20W=C3=B3jt?= 
Date: Mon, 12 Feb 2024 13:38:14 +0100
Subject: [PATCH] [clang][AArch64] multilib: fix deduction of "-march=" option

The deduced "-march=" option always started with aarch64, which is not a
valid value. There was also no way to distinguish between armv8-r and
armv8-a. After this commit, the deduced "-march=" option will start with
greatest available "armv*-a" value or "armv8-r".
---
 clang/lib/Driver/ToolChain.cpp | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 388030592b4836..bfc80ac79df1e3 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D,
   for (const auto &Ext : AArch64::Extensions)
 if (FeatureSet.contains(Ext.NegFeature))
   MArch.push_back(("no" + Ext.Name).str());
-  MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str());
+  StringRef ArchName;
+  for (const auto &ArchInfo : AArch64::ArchInfos)
+if (FeatureSet.contains(ArchInfo->ArchFeature))
+  ArchName = ArchInfo->Name;
+  MArch.insert(MArch.begin(), ("-march=" + ArchName).str());
   Result.push_back(llvm::join(MArch, "+"));
 }
 

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-driver

Author: Dominik Wójt (domin144)


Changes

The deduced "-march=" option always started with aarch64, which is not a valid 
value. There was also no way to distinguish between armv8-r and armv8-a. After 
this commit, the deduced "-march=" option will start with greatest available 
"armv*-a" value or "armv8-r".

---
Full diff: https://github.com/llvm/llvm-project/pull/81474.diff


1 Files Affected:

- (modified) clang/lib/Driver/ToolChain.cpp (+5-1) 


``diff
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 388030592b4836..bfc80ac79df1e3 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D,
   for (const auto &Ext : AArch64::Extensions)
 if (FeatureSet.contains(Ext.NegFeature))
   MArch.push_back(("no" + Ext.Name).str());
-  MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str());
+  StringRef ArchName;
+  for (const auto &ArchInfo : AArch64::ArchInfos)
+if (FeatureSet.contains(ArchInfo->ArchFeature))
+  ArchName = ArchInfo->Name;
+  MArch.insert(MArch.begin(), ("-march=" + ArchName).str());
   Result.push_back(llvm::join(MArch, "+"));
 }
 

``




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


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Dominik Wójt (domin144)


Changes

The deduced "-march=" option always started with aarch64, which is not a valid 
value. There was also no way to distinguish between armv8-r and armv8-a. After 
this commit, the deduced "-march=" option will start with greatest available 
"armv*-a" value or "armv8-r".

---
Full diff: https://github.com/llvm/llvm-project/pull/81474.diff


1 Files Affected:

- (modified) clang/lib/Driver/ToolChain.cpp (+5-1) 


``diff
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 388030592b4836..bfc80ac79df1e3 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D,
   for (const auto &Ext : AArch64::Extensions)
 if (FeatureSet.contains(Ext.NegFeature))
   MArch.push_back(("no" + Ext.Name).str());
-  MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str());
+  StringRef ArchName;
+  for (const auto &ArchInfo : AArch64::ArchInfos)
+if (FeatureSet.contains(ArchInfo->ArchFeature))
+  ArchName = ArchInfo->Name;
+  MArch.insert(MArch.begin(), ("-march=" + ArchName).str());
   Result.push_back(llvm::join(MArch, "+"));
 }
 

``




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


[clang] [ObjC] Check entire chain of superclasses to see if class layout can be statically known (PR #81335)

2024-02-12 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

> @rjmccall Are these tests adequate?

While we appreciate the enthusiasm, please only ping reviewers after about a 
week of not hearing from them on a review 
(https://llvm.org/docs/CodeReview.html#code-reviews-speed-and-reciprocity), 
thanks!

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


[clang] [llvm] [LLVM] Add `__builtin_readsteadycounter` intrinsic and builtin for realtime clocks (PR #81331)

2024-02-12 Thread Joseph Huber via cfe-commits

jhuber6 wrote:

> Are we assuming any particular relationship to __builtin_readcyclecounter in 
> terms of scales etc?
> 
> __builtin_readsteadycounter could be used to access x86 MPERF clock counters, 
> but to access the corresponding APERF clock we'd then need a 
> __builtin_readvariablecounter equivalent (__builtin_readcyclecounter gives 
> the separate RDTSC clock value)

Not currently at least. The idea is just to expose the counter that has a fixed 
tick rate, compared to the cycle counter which is variable.

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

usx95 wrote:

I updated the patch to work for all the initializations that were missing 
cleanups due to branch in an expression.

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


[clang] [AArch64][SME2] Refactor arm_sme.td into multiclasses (PR #78169)

2024-02-12 Thread Matthew Devereau via cfe-commits

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


[clang] [AArch64][SME2] Refactor arm_sme.td into multiclasses (PR #78169)

2024-02-12 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Matthew Devereau (MDevereau)


Changes

Create some multiclasses for FMLA/FMLS, MLAL and MLSL to reduce the size of 
arm_sme.td

---

Patch is 36.16 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/78169.diff


1 Files Affected:

- (modified) clang/include/clang/Basic/arm_sme.td (+106-176) 


``diff
diff --git a/clang/include/clang/Basic/arm_sme.td 
b/clang/include/clang/Basic/arm_sme.td
index 2da0e8d2aba9a..a5e7ec6b03f8f 100644
--- a/clang/include/clang/Basic/arm_sme.td
+++ b/clang/include/clang/Basic/arm_sme.td
@@ -424,141 +424,117 @@ let TargetGuard = "sme2,sme-i16i64" in {
 }
 
 // FMLA/FMLS
-let TargetGuard = "sme2" in {
-  def SVMLA_MULTI_VG1x2_F32 : Inst<"svmla_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_MULTI_VG1x4_F32 : Inst<"svmla_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x2_F32 : Inst<"svmls_za32[_{d}]_vg1x2", "vm22", "f", 
MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_MULTI_VG1x4_F32 : Inst<"svmls_za32[_{d}]_vg1x4", "vm44", "f", 
MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_SINGLE_VG1x2_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLA_SINGLE_VG1x4_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x2_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x2", "vm2d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>;
-  def SVMLS_SINGLE_VG1x4_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x4", "vm4d", 
"f", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>;
-
-  def SVMLA_LANE_VG1x2_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLA_LANE_VG1x4_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x2_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x2", "vm2di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
-  def SVMLS_LANE_VG1x4_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x4", "vm4di", "f", 
MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], 
[ImmCheck<3, ImmCheck0_3>]>;
+multiclass multi_vec_fmla_fmls {
+  let TargetGuard = "sme2" in {
+def NAME # _MULTI_VG1x2_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x2",
  "vm22",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F32  : Inst<"sv" # n # "_za32[_{d}]_vg1x4",
  "vm44",  "f", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x2", "vm2d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F32 : Inst<"sv" # n # 
"[_single]_za32[_{d}]_vg1x4", "vm4d",  "f", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x2",   
  "vm2di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+def NAME # _LANE_VG1x4_F32   : Inst<"sv" # n # "_lane_za32[_{d}]_vg1x4",   
  "vm4di", "f", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x4",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>;
+  }
+  let TargetGuard = "sme2,sme-f64f64" in {
+def NAME # _MULTI_VG1x2_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x2",
  "vm22",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x2",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _MULTI_VG1x4_F64  : Inst<"sv" # n # "_za64[_{d}]_vg1x4",
  "vm44",  "d", MergeNone, "aarch64_sme_f" # n # "_vg1x4",[IsStreaming, 
IsInOutZA], []>;
+def NAME # _SINGLE_VG1x2_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x2", "vm2d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x2", [IsStreaming, IsInOutZA], []>;
+def NAME # _SINGLE_VG1x4_F64 : Inst<"sv" # n # 
"[_single]_za64[_{d}]_vg1x4", "vm4d",  "d", MergeNone, "aarch64_sme_f" # n # 
"_single_vg1x4", [IsStreaming, IsInOutZA], []>;
+def NAME # _LANE_VG1x2_F64   : Inst<"sv" # n # "_lane_za64[_{d}]_vg1x2",   
  "vm2di", "d", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x2",   [IsStreaming, 
IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>;
+def NAME # _LANE_VG1x4_F64   : Inst<"sv" # n # "_lane_za64[_{d}]_vg1x4",   
  "vm4di", "d", MergeNone, "aarch64_sme_f" # n # "_lane_vg1x4",   [IsStreaming, 

[clang] Diagnose misuse of the cleanup attribute (PR #80040)

2024-02-12 Thread Aaron Ballman via cfe-commits

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


[clang] Diagnose misuse of the cleanup attribute (PR #80040)

2024-02-12 Thread Aaron Ballman via cfe-commits


@@ -1,7 +1,7 @@
-// RUN: %clang_cc1 %s -verify -fsyntax-only
+// RUN: %clang_cc1 -Wfree-nonheap-object -fsyntax-only -verify %s
 
 void c1(int *a);
-
+typedef unsigned long size_t;

AaronBallman wrote:

```suggestion
typedef __typeof__(sizeof(0)) size_t;
```

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


[clang] Diagnose misuse of the cleanup attribute (PR #80040)

2024-02-12 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman commented:

Precommit CI found a valid failure on Windows: 
```
FAIL: Clang :: Sema/attr-cleanup.c (15237 of 19292)
 TEST 'Clang :: Sema/attr-cleanup.c' FAILED 

Exit Code: 1
Command Output (stdout):
--
# RUN: at line 1
c:\ws\src\build\build-clang-windows\bin\clang.exe -cc1 -internal-isystem 
C:\ws\src\build\build-clang-windows\lib\clang\19\include -nostdsysteminc 
-Wfree-nonheap-object -fsyntax-only -verify 
C:\ws\src\clang\test\Sema\attr-cleanup.c
# executed command: 'c:\ws\src\build\build-clang-windows\bin\clang.exe' -cc1 
-internal-isystem 'C:\ws\src\build\build-clang-windows\lib\clang\19\include' 
-nostdsysteminc -Wfree-nonheap-object -fsyntax-only -verify 
'C:\ws\src\clang\test\Sema\attr-cleanup.c'
# .---command stderr
# | error: 'expected-warning' diagnostics seen but not expected:
# |   File C:\ws\src\clang\test\Sema\attr-cleanup.c Line 53: incompatible 
redeclaration of library function 'malloc'
# | error: 'expected-note' diagnostics seen but not expected:
# |   File C:\ws\src\clang\test\Sema\attr-cleanup.c Line 53: 'malloc' is a 
builtin with type 'void *(unsigned long long)'
# | 2 errors generated.
# `-
# error: command failed with exit status: 1
```
I left a suggestion on how to correct this.

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/80698

>From 28d90711ff8e4924135d4bd4e5f252d96ac41b93 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Tue, 23 Jan 2024 20:18:25 +
Subject: [PATCH 01/13] [misc-coroutine-hostile-raii] Use getOperand instead of
 getCommonExpr

---
 .../misc/CoroutineHostileRAIICheck.cpp|  2 +-
 .../checkers/misc/coroutine-hostile-raii.cpp  | 34 ++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp 
b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
index a0e8700b0522bc..360335b86c6418 100644
--- a/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp
@@ -56,7 +56,7 @@ AST_MATCHER_P(Stmt, forEachPrevStmt, 
ast_matchers::internal::Matcher,
 // Matches the expression awaited by the `co_await`.
 AST_MATCHER_P(CoawaitExpr, awaitable, ast_matchers::internal::Matcher,
   InnerMatcher) {
-  if (Expr *E = Node.getCommonExpr())
+  if (Expr *E = Node.getOperand())
 return InnerMatcher.matches(*E, Finder, Builder);
   return false;
 }
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
index 55a7e4b8f2954a..c23c355dac1b2a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp
@@ -1,7 +1,7 @@
 // RUN: %check_clang_tidy -std=c++20 %s misc-coroutine-hostile-raii %t \
 // RUN:   -config="{CheckOptions: {\
 // RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; 
::my::other::Mutex', \
-// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::my::other::awaitable' \
+// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 
'safe::awaitable; ::transformable::awaitable' \
 // RUN: }}"
 
 namespace std {
@@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
 absl::Mutex no_warning_5;
 }
 
+// 

+// Safe awaitable
+// 

 namespace safe {
   struct awaitable {
   bool await_ready() noexcept { return false; }
@@ -150,6 +153,32 @@ ReturnObject RAIISafeSuspendTest() {
   co_await other{};
 } 
 
+// 

+// Safe transformable awaitable
+// 

+struct transformable { struct awaitable{}; };
+using alias_transformable_awaitable = transformable::awaitable;
+struct UseTransformAwaitable {
+  struct promise_type {
+UseTransformAwaitable get_return_object() { return {}; }
+std::suspend_always initial_suspend() { return {}; }
+std::suspend_always final_suspend() noexcept { return {}; }
+void unhandled_exception() {}
+std::suspend_always await_transform(transformable::awaitable) { return {}; 
}
+  };
+};
+
+auto retAwaitable() { return transformable::awaitable{}; }
+UseTransformAwaitable RAIISafeSuspendTest2() {
+  absl::Mutex a;
+  co_await retAwaitable();
+  co_await transformable::awaitable{};
+  co_await alias_transformable_awaitable{};
+}
+
+// 

+// Lambdas
+// 

 void lambda() {
   absl::Mutex no_warning;
   auto lambda = []() -> ReturnObject {
@@ -164,6 +193,9 @@ void lambda() {
   absl::Mutex no_warning_2;
 }
 
+// 

+// Denylisted RAII
+// 

 template
 ReturnObject raii_in_template(){
   T a;

>From 442809ce6047f8f83c9f3f54b17182c18535bb03 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena 
Date: Mon, 5 Feb 2024 15:52:56 +
Subject: [PATCH 02/13] [codegen] Emit cleanups for lifetime-extended
 temporaries when statment-expression has control-flow

---
 clang/lib/CodeGen/CGCleanup.cpp   | 31 +--
 clang/lib/CodeGen/CodeGenFunction.h   |  4 +
 .../return-in-stmt-expr-cleanup.cpp   | 37 +
 .../coro-suspend-in-agg-init.cpp  | 82 +++
 4 files changed, 145 insertions(+), 9 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/return-in-stmt-expr-cleanup.cpp
 create mode 100644 clang/test/CodeGenCoroutines/coro-suspend-in-agg-init.cpp

diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp
index f87caf050eeaa7..da0528b271aa37 100644
--- a/clang/lib/CodeGen/CGCleanup.cpp
+++ b/clang/lib/CodeGen/CGCleanup.cpp
@@ -488,16 +48

[clang] [clang][Sema] Fix for enums overflowing (#24667) (PR #78742)

2024-02-12 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

> @AaronBallman I am a little confused about what is the correct behavior for 
> one the the cases in the test file for c.
> 
> ```c++
> enum PR4515 {PR4515a=1u,PR4515b=(PR4515a-2)/2};
> int CheckPR4515[PR4515b==0?1:-1];
> ```
> 
> At present since everything is ints this works fine, but some things are not 
> clear to me once the enum is allowed to be an unsigned type 
> https://godbolt.org/z/8bfr8s3n5
> 
> ```c++
> enum PR4515 {PR4515a=1u,PR4515b=(PR4515a-2)/2};
>  auto a = PR4515a;
>  auto b = PR4515b;
>  auto c = (1 - 2)/2;
>  auto d = (1u - 2)/2;
>  auto e = (PR4515a-2)/2;
> ```
> 
> values
> 
> ```
> a:
> .long   1   # 0x1
> 
> b:
> .long   0   # 0x0
> 
> c:
> .long   0   # 0x0
> 
> d:
> .long   2147483647  # 0x7fff
> 
> e:
> .long   0   # 0x0
> ```
> 
> specifically around the value for `PR4515b=(PR4515a-2)/2` if `PR4515a` has 
> type unsigned int, then the value of this expression is 2147483647 see `d`, 
> but if it has type int then it has value of 0 see `c` which is the expected 
> value for the test. However, with the new change the enum type would be 
> unsigned since it was specified as unsigned, which I believe is the new 
> behavior.

I think the enumeration constant type is `int` and not `unsigned int`, per 
6.7.2.2p12 bullet 4: `int, if given explicitly with = and the value of the 
integer constant expression is representable by an int; or,`

```
enum PR4515 {
  PR4515a=1u, // has type int per 6.7.2.2p12 bullet 4 because 1 is 
representable by an int
  PR4515b=(PR4515a-2)/2   // has type int per 6.7.2.2p12 bullet 4 because (1 - 
2) / 2 is representable by an int
};
```
WDYT?

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] [llvm] [LLVM] Add `__builtin_readsteadycounter` intrinsic and builtin for realtime clocks (PR #81331)

2024-02-12 Thread Joseph Huber via cfe-commits

https://github.com/jhuber6 updated 
https://github.com/llvm/llvm-project/pull/81331

>From 30341079e795c2668588b791f2c97b44006e7a04 Mon Sep 17 00:00:00 2001
From: Joseph Huber 
Date: Fri, 9 Feb 2024 16:13:42 -0600
Subject: [PATCH] [WIP][LLVM] Add `__builtin_readsteadycounter` intrinsic and
 buiiltin

Summary:
This patch adds a new intrinsic and builtin function mirroring the
existing `__builtin_readcyclecounter`. The difference is that this
implementation targets a separate counter that some targets have which
returns a fixed frequency clock that can be used to determine elapsed
time, this is different compared to the cycle counter which often has
variable frequency. This is currently only valid for the NVPTX and
AMDGPU targets.
---
 clang/docs/LanguageExtensions.rst | 31 ++
 clang/include/clang/Basic/Builtins.td |  6 ++
 clang/lib/CodeGen/CGBuiltin.cpp   |  4 ++
 clang/test/CodeGen/builtins.c |  6 ++
 llvm/include/llvm/CodeGen/ISDOpcodes.h|  6 ++
 llvm/include/llvm/IR/Intrinsics.td|  2 +
 llvm/include/llvm/Support/TargetOpcodes.def   |  3 +
 llvm/include/llvm/Target/GenericOpcodes.td|  6 ++
 .../Target/GlobalISel/SelectionDAGCompat.td   |  1 +
 .../include/llvm/Target/TargetSelectionDAG.td |  3 +
 llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp  |  2 +
 llvm/lib/CodeGen/IntrinsicLowering.cpp|  6 ++
 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp |  6 +-
 .../SelectionDAG/LegalizeIntegerTypes.cpp |  7 ++-
 llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h |  2 +-
 .../SelectionDAG/SelectionDAGBuilder.cpp  |  8 +++
 .../SelectionDAG/SelectionDAGDumper.cpp   |  1 +
 llvm/lib/CodeGen/TargetLoweringBase.cpp   |  3 +
 .../lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp |  2 +
 .../Target/AMDGPU/AMDGPURegisterBankInfo.cpp  |  1 +
 llvm/lib/Target/AMDGPU/SIISelLowering.cpp |  4 ++
 llvm/lib/Target/AMDGPU/SMInstructions.td  | 14 +
 llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp   |  3 +
 llvm/lib/Target/NVPTX/NVPTXInstrInfo.td   |  1 -
 llvm/lib/Target/NVPTX/NVPTXIntrinsics.td  |  4 ++
 .../GlobalISel/legalizer-info-validation.mir  |  3 +
 llvm/test/CodeGen/AMDGPU/readsteadycounter.ll | 24 +++
 llvm/test/CodeGen/NVPTX/intrinsics.ll | 12 
 .../builtins/match-table-replacerreg.td   | 24 +++
 .../match-table-imms.td   | 32 +-
 .../match-table-intrinsics.td |  5 +-
 .../match-table-patfrag-root.td   |  4 +-
 .../GlobalISelCombinerEmitter/match-table.td  | 62 +--
 llvm/test/TableGen/GlobalISelEmitter.td   |  2 +-
 34 files changed, 228 insertions(+), 72 deletions(-)
 create mode 100644 llvm/test/CodeGen/AMDGPU/readsteadycounter.ll

diff --git a/clang/docs/LanguageExtensions.rst 
b/clang/docs/LanguageExtensions.rst
index e91156837290f7..4cc73599f9bae0 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -2764,6 +2764,37 @@ Query for this feature with 
``__has_builtin(__builtin_readcyclecounter)``. Note
 that even if present, its use may depend on run-time privilege or other OS
 controlled state.
 
+``__builtin_readsteadycounter``
+--
+
+``__builtin_readsteadycounter`` is used to access the fixed frequency counter
+register (or a similar steady-rate clock) on those targets that support it.
+The function is similar to ``__builtin_readcyclecounter`` above except that the
+frequency is fixed, making it suitable for measuring elapsed time.
+
+**Syntax**:
+
+.. code-block:: c++
+
+  __builtin_readsteadycounter()
+
+**Example of Use**:
+
+.. code-block:: c++
+
+  unsigned long long t0 = __builtin_readsteadycounter();
+  do_something();
+  unsigned long long t1 = __builtin_readsteadycounter();
+  unsigned long long secs_to_do_something = (t1 - t0) / tick_rate;
+
+**Description**:
+
+The ``__builtin_readsteadycounter()`` builtin returns the frequency counter 
value.
+When not supported by the target, the return value is always zero. This builtin
+takes no arguments and produces an unsigned long long result.
+
+Query for this feature with ``__has_builtin(__builtin_readsteadycounter)``.
+
 ``__builtin_dump_struct``
 -
 
diff --git a/clang/include/clang/Basic/Builtins.td 
b/clang/include/clang/Basic/Builtins.td
index 31a2bdeb2d3e5e..193d5851f9f29f 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -1110,6 +1110,12 @@ def ReadCycleCounter : Builtin {
   let Prototype = "unsigned long long int()";
 }
 
+def ReadSteadyCounter : Builtin {
+  let Spellings = ["__builtin_readsteadycounter"];
+  let Attributes = [NoThrow];
+  let Prototype = "unsigned long long int()";
+}
+
 def Trap : Builtin {
   let Spellings = ["__builtin_trap"];
   let Attributes = [NoThrow, NoReturn];
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index a7a410dab1a018..ee0b7504769622 100644
--- a/

[clang] [clang-tools-extra] [codegen] Emit missing cleanups when an expression contains a branch (PR #80698)

2024-02-12 Thread Utkarsh Saxena via cfe-commits

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


[clang] [clang-format] Update FormatToken::isSimpleTypeSpecifier() (PR #80241)

2024-02-12 Thread Haojian Wu via cfe-commits

hokein wrote:

This change introduced an asan crash when running the 
`QualifierFixerTest.IsQualifierType` unittest:

```
$ tools/clang/unittests/Format/FormatTests 
--gtest_filter="QualifierFixerTest.IsQualifierType"
Note: Google Test filter = QualifierFixerTest.IsQualifierType
[==] Running 1 test from 1 test suite.
[--] Global test environment set-up.
[--] 1 test from QualifierFixerTest
[ RUN  ] QualifierFixerTest.IsQualifierType
=
==2418936==ERROR: AddressSanitizer: heap-use-after-free on address 
0x62107ca8 at pc 0x55ba1c653541 bp 0x7ffcf3b39400 sp 0x7ffcf3b393f8
READ of size 8 at 0x62107ca8 thread T0
#0 0x55ba1c653540 in getTokenID 
llvm-project/clang/include/clang/Basic/IdentifierTable.h:304:62
#1 0x55ba1c653540 in clang::IdentifierInfo::isKeyword(clang::LangOptions 
const&) const llvm-project/clang/lib/Basic/IdentifierTable.cpp:345:38
#2 0x55ba1c742ca6 in 
clang::format::LeftRightQualifierAlignmentFixer::isConfiguredQualifierOrType(clang::format::FormatToken
 const*, std::vector> const&) 
llvm-project/clang/lib/Format/QualifierAlignmentFixer.cpp:620:23
#3 0x55ba1c16dd29 in clang::format::test::(anonymous 
namespace)::QualifierFixerTest_IsQualifierType_Test::TestBody() 
llvm-project/clang/unittests/Format/QualifierFixerTest.cpp:1070:3
#4 0x55ba1c5b2edc in testing::Test::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:2687:5
#5 0x55ba1c5b50b0 in testing::TestInfo::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:2836:11
#6 0x55ba1c5b73ee in testing::TestSuite::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:3015:30
#7 0x55ba1c5e317f in testing::internal::UnitTestImpl::RunAllTests() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:5920:44
#8 0x55ba1c5e23f0 in testing::UnitTest::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:5484:10
#9 0x55ba1c57dff0 in RUN_ALL_TESTS 
llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
#10 0x55ba1c57dff0 in main 
llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
#11 0x7f960e6456c9 in __libc_start_call_main 
csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#12 0x7f960e645784 in __libc_start_main csu/../csu/libc-start.c:360:3
#13 0x55ba1b9c42d0 in _start 
(llvm-project/build-asan/tools/clang/unittests/Format/FormatTests+0xa9a2d0) 
(BuildId: b18a4002905d1789605532475cf5513986b28718)

0x62107ca8 is located 936 bytes inside of 4096-byte region 
[0x62107900,0x62108900)
freed by thread T0 here:
#0 0x55ba1ba8f606 in operator delete(void*, std::align_val_t) 
(llvm-project/build-asan/tools/clang/unittests/Format/FormatTests+0xb65606) 
(BuildId: b18a4002905d1789605532475cf5513986b28718)
#1 0x55ba1c03fef6 in Deallocate 
llvm-project/llvm/include/llvm/Support/AllocatorBase.h:99:5
#2 0x55ba1c03fef6 in llvm::BumpPtrAllocatorImpl::DeallocateSlabs(void**, void**) 
llvm-project/llvm/include/llvm/Support/Allocator.h:356:28
#3 0x55ba1c03f485 in llvm::BumpPtrAllocatorImpl::~BumpPtrAllocatorImpl() 
llvm-project/llvm/include/llvm/Support/Allocator.h:98:5
#4 0x55ba1c16cb3f in ~IdentifierTable 
llvm-project/clang/include/clang/Basic/IdentifierTable.h:630:7
#5 0x55ba1c16cb3f in ~TestLexer 
llvm-project/clang/unittests/Format/TestLexer.h:58:7
#6 0x55ba1c16cb3f in annotate 
llvm-project/clang/unittests/Format/QualifierFixerTest.cpp:33:5
#7 0x55ba1c16cb3f in clang::format::test::(anonymous 
namespace)::QualifierFixerTest_IsQualifierType_Test::TestBody() 
llvm-project/clang/unittests/Format/QualifierFixerTest.cpp:1056:17
#8 0x55ba1c5b2edc in testing::Test::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:2687:5
#9 0x55ba1c5b50b0 in testing::TestInfo::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:2836:11
#10 0x55ba1c5b73ee in testing::TestSuite::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:3015:30
#11 0x55ba1c5e317f in testing::internal::UnitTestImpl::RunAllTests() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:5920:44
#12 0x55ba1c5e23f0 in testing::UnitTest::Run() 
llvm-project/third-party/unittest/googletest/src/gtest.cc:5484:10
#13 0x55ba1c57dff0 in RUN_ALL_TESTS 
llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
#14 0x55ba1c57dff0 in main 
llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
#15 0x7f960e6456c9 in __libc_start_call_main 
csu/../sysdeps/nptl/libc_start_call_main.h:58:16

previously allocated by thread T0 here:
#0 0x55ba1ba8eba6 in operator new(unsigned long, std::align_val_t) 
(llvm-project/build-asan/tools/clang/unittests/Format/FormatTests+0xb64ba6) 
(BuildId: b18a4002905d1789605532475cf5513986b28718)
#1 0x55ba1c43d4bd in llvm::allocate_buffer(unsigned long, unsigned long) 
llvm-project/llvm/lib/Support/MemAlloc.cpp:16:10
   

[clang] [llvm] __ARM_ARCH macro fix (PR #81466)

2024-02-12 Thread Jack Styles via cfe-commits

Stylie777 wrote:

I think this can be one commit, the formatting changes can be squashed into the 
commit that makes the changes. Also make sure the commit message fits in with 
LLVM guidelines. See: https://llvm.org/docs/DeveloperPolicy.html#id18

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


[clang] f5fd0de - [LinkerWrapper][NFC] Rename 'all' to 'generic' for architecture agnostic IR

2024-02-12 Thread Joseph Huber via cfe-commits

Author: Joseph Huber
Date: 2024-02-12T08:15:48-06:00
New Revision: f5fd0deb2371d0bae3bef2563f50e005a140fc6d

URL: 
https://github.com/llvm/llvm-project/commit/f5fd0deb2371d0bae3bef2563f50e005a140fc6d
DIFF: 
https://github.com/llvm/llvm-project/commit/f5fd0deb2371d0bae3bef2563f50e005a140fc6d.diff

LOG: [LinkerWrapper][NFC] Rename 'all' to 'generic' for architecture agnostic IR

Summary:
A previous patch introduced `all` as a special architecture. I have
decided I do not like this name and have changed it to `generic`.

Added: 


Modified: 
clang/docs/ClangLinkerWrapper.rst
clang/test/Driver/linker-wrapper.c
llvm/lib/Object/OffloadBinary.cpp

Removed: 




diff  --git a/clang/docs/ClangLinkerWrapper.rst 
b/clang/docs/ClangLinkerWrapper.rst
index 6d7770b50e7260..3bef5584757351 100644
--- a/clang/docs/ClangLinkerWrapper.rst
+++ b/clang/docs/ClangLinkerWrapper.rst
@@ -79,6 +79,14 @@ linking is desired, simply do not run the binaries through 
the
 ``clang-linker-wrapper``. This will simply append the embedded device code so
 that it can be linked later.
 
+Matching
+
+
+The linker wrapper will link extracted device code that is compatible with each
+other. Generally, this requires that the target triple and architecture match.
+An exception is made when the architecture is listed as ``generic``, which will
+cause it be linked with any other device code with the same target triple.
+
 Example
 ===
 

diff  --git a/clang/test/Driver/linker-wrapper.c 
b/clang/test/Driver/linker-wrapper.c
index 647629a5969bdc..7fd46778ac9102 100644
--- a/clang/test/Driver/linker-wrapper.c
+++ b/clang/test/Driver/linker-wrapper.c
@@ -173,7 +173,7 @@ __attribute__((visibility("protected"), used)) int x;
 // AMD-TARGET-ID: clang{{.*}} -o {{.*}}.img --target=amdgcn-amd-amdhsa 
-mcpu=gfx90a:xnack- -O2 -Wl,--no-undefined {{.*}}.o {{.*}}.o
 
 // RUN: clang-offload-packager -o %t-lib.out \
-// RUN:   --image=file=%t.elf.o,kind=openmp,triple=amdgcn-amd-amdhsa,arch=all
+// RUN:   
--image=file=%t.elf.o,kind=openmp,triple=amdgcn-amd-amdhsa,arch=generic
 // RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o 
-fembed-offload-object=%t-lib.out
 // RUN: llvm-ar rcs %t.a %t.o
 // RUN: clang-offload-packager -o %t1.out \

diff  --git a/llvm/lib/Object/OffloadBinary.cpp 
b/llvm/lib/Object/OffloadBinary.cpp
index 58b9b39e0d2721..4ab6536dc90b52 100644
--- a/llvm/lib/Object/OffloadBinary.cpp
+++ b/llvm/lib/Object/OffloadBinary.cpp
@@ -356,7 +356,7 @@ bool object::areTargetsCompatible(const 
OffloadFile::TargetID &LHS,
 return false;
 
   // If the architecture is "all" we assume it is always compatible.
-  if (LHS.second.equals("all") || RHS.second.equals("all"))
+  if (LHS.second.equals("generic") || RHS.second.equals("generic"))
 return true;
 
   // Only The AMDGPU target requires additional checks.



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ObjC] Check entire chain of superclasses to see if class layout can be statically known (PR #81335)

2024-02-12 Thread via cfe-commits

https://github.com/AtariDreams updated 
https://github.com/llvm/llvm-project/pull/81335

>From 6103fff6c5040e70fa28bd088f8eafbe479cbab1 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:51:15 -0500
Subject: [PATCH 1/2] [ObjC] Add pre-commit tests [NFC]

---
 .../constant-non-fragile-ivar-offset.m| 82 +++
 1 file changed, 82 insertions(+)

diff --git a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m 
b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
index 788b3220af3067..6806fbf8f435aa 100644
--- a/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
+++ b/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m
@@ -1,6 +1,12 @@
 // RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | 
FileCheck %s
 
 // CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 
20
+// CHECK: @"OBJC_IVAR_$_MyClass.myIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_MyClass._myProperty" = hidden constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.privateId" = constant i64 24
+// CHECK: @"OBJC_IVAR_$_AnotherClass.anotherPrivateId" = hidden constant i64 32
+// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = constant i64 20
+// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = global i64 24
 // CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden 
global i64 12
 
 @interface NSObject {
@@ -20,6 +26,82 @@ -(void)meth {
 }
 @end
 
+// Scenario 1: Ivars declared in the @interface
+@interface MyClass : NSObject
+{
+int myIvar; // Declare an ivar
+}
+
+@property (nonatomic, assign) int myProperty; // Synthesize a property
+
+@end
+
+@implementation MyClass 
+
+- (void)exampleMethod {
+self.myProperty = 42; // Access the property
+myIvar = 10; // Access the ivar directly
+}
+
+@end
+
+// Scenario 2: Ivars declared directly in the @implementation
+@interface AnotherClass : NSObject
+{
+  id privateId;
+}
+
+@end
+
+@implementation AnotherClass
+{
+id anotherPrivateId; // Declare an ivar directly in the implementation
+}
+
+- (void)doSomething {
+   privateId = anotherPrivateId;
+}
+
+@end
+
+// Scenario 3: Inheritance and Ivars
+@interface SuperClass : NSObject
+{
+int superClassIvar;
+}
+@end
+
+@implementation SuperClass
+@end
+
+@interface SubClass : SuperClass
+{
+double subClassIvar;
+}
+@end
+
+@implementation SubClass
+- (void)exampleMethod {
+// CHECK: load i64, ptr @"OBJC_IVAR_$SuperClass
+superClassIvar = 100; // Access superclass ivar
+subClassIvar = 3.14; // Access subclass ivar
+}
+@end
+
+// Scenario 4: Custom Getter/Setter Methods
+@interface CustomPropertyClass : NSObject
+@property (nonatomic, strong, getter=myCustomGetter, setter=myCustomSetter:) 
id customProperty;
+@end
+
+@implementation CustomPropertyClass
+- (id) myCustomGetter {
+return 0;
+}
+
+- (void)myCustomSetter:(id)newValue {
+}
+@end
+
 @interface NotNSObject {
   int these, might, change;
 }

>From 3a5cfce7c2b7c3537347ad7ec8d721f3e356a262 Mon Sep 17 00:00:00 2001
From: Rose <83477269+ataridre...@users.noreply.github.com>
Date: Fri, 9 Feb 2024 17:47:59 -0500
Subject: [PATCH 2/2] [ObjC] Check entire chain of superclasses to see if class
 layout can be statically known

As of now, we only check if a class directly inherits from NSObject to 
determine if said class has fixed offsets and can therefore have its memory 
layout statically known.

However, if an NSObject subclass has fixed offsets, then so must the subclasses 
of that subclass, so this allows us to optimize instances of subclasses of 
subclasses that inherit from NSObject and so on.

To determine this, we need to find that the compiler can see the implementation 
of each intermediate class, as that means it is statically linked.

Fixes: #81369
---
 clang/lib/CodeGen/CGObjCMac.cpp   | 22 ++-
 .../constant-non-fragile-ivar-offset.m|  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 27d77e9a8a5511..ceee70a5d79b3e 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -1593,12 +1593,22 @@ class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   }
 
   bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
-// NSObject is a fixed size. If we can see the @implementation of a class
-// which inherits from NSObject then we know that all it's offsets also 
must
-// be fixed. FIXME: Can we do this if see a chain of super classes with
-// implementations leading to NSObject?
-return ID->getImplementation() && ID->getSuperClass() &&
-   ID->getSuperClass()->getName() == "NSObject";
+// Test a class by checking its superclasses up to its base class if it has
+// one
+while (ID) {
+  // The base class NSObject is a fixed size
+  if (ID->getName() == "NSObject")
+return true;
+
+ 

[clang] [Clang][C++23] Implement P1774R8: Portable assumptions (PR #81014)

2024-02-12 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

> > > @Sirraide, would you be comfortable if you, @erichkeane, and I 
> > > co-authored an RFC to the community?
> > 
> > 
> > Sure, I’d be happy to help with that as best I can. An RFC makes sense imo 
> > seeing as this really impacts more parts of LLVM than just Clang.
> 
> Excellent, thanks! I will try to get a draft of the RFC over to you both 
> sometime tomorrow and we can go from there. I'll put it in a Google Doc so we 
> can hopefully collaborate more easily on it.

The RFC is now posted: 
https://discourse.llvm.org/t/rfc-builtin-assume-assume-optimization-behavior/76943

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


[clang] 50ed98f - Revert "Reland "[clang-format] Update FormatToken::isSimpleTypeSpecifier() (#80241)""

2024-02-12 Thread Haojian Wu via cfe-commits

Author: Haojian Wu
Date: 2024-02-12T15:24:27+01:00
New Revision: 50ed98f1cf2516c59de0351fa683639c937782ea

URL: 
https://github.com/llvm/llvm-project/commit/50ed98f1cf2516c59de0351fa683639c937782ea
DIFF: 
https://github.com/llvm/llvm-project/commit/50ed98f1cf2516c59de0351fa683639c937782ea.diff

LOG: Revert "Reland "[clang-format] Update FormatToken::isSimpleTypeSpecifier() 
(#80241)""

The change caused an asan crash when running the 
`QualifierFixerTest.IsQualifierType` unittest, see
details: https://github.com/llvm/llvm-project/pull/80241#issuecomment-1938749844

This reverts commit 7f40c5cc4e15a0a67b031f13370afc342a5dc14b.

Added: 


Modified: 
clang/lib/Format/FormatToken.cpp

Removed: 




diff  --git a/clang/lib/Format/FormatToken.cpp 
b/clang/lib/Format/FormatToken.cpp
index 33bcde3c25ece9..b791c5a26bbe3a 100644
--- a/clang/lib/Format/FormatToken.cpp
+++ b/clang/lib/Format/FormatToken.cpp
@@ -14,7 +14,9 @@
 
 #include "FormatToken.h"
 #include "ContinuationIndenter.h"
-#include "TokenAnalyzer.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/Debug.h"
+#include 
 
 namespace clang {
 namespace format {
@@ -32,9 +34,41 @@ const char *getTokenTypeName(TokenType Type) {
   return nullptr;
 }
 
+// FIXME: This is copy&pasted from Sema. Put it in a common place and remove
+// duplication.
 bool FormatToken::isSimpleTypeSpecifier() const {
-  assert(LangOpts.CPlusPlus);
-  return Tok.isSimpleTypeSpecifier(LangOpts);
+  switch (Tok.getKind()) {
+  case tok::kw_short:
+  case tok::kw_long:
+  case tok::kw___int64:
+  case tok::kw___int128:
+  case tok::kw_signed:
+  case tok::kw_unsigned:
+  case tok::kw_void:
+  case tok::kw_char:
+  case tok::kw_int:
+  case tok::kw_half:
+  case tok::kw_float:
+  case tok::kw_double:
+  case tok::kw___bf16:
+  case tok::kw__Float16:
+  case tok::kw___float128:
+  case tok::kw___ibm128:
+  case tok::kw_wchar_t:
+  case tok::kw_bool:
+#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
+#include "clang/Basic/TransformTypeTraits.def"
+  case tok::annot_typename:
+  case tok::kw_char8_t:
+  case tok::kw_char16_t:
+  case tok::kw_char32_t:
+  case tok::kw_typeof:
+  case tok::kw_decltype:
+  case tok::kw__Atomic:
+return true;
+  default:
+return false;
+  }
 }
 
 bool FormatToken::isTypeOrIdentifier() const {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Update FormatToken::isSimpleTypeSpecifier() (PR #80241)

2024-02-12 Thread Haojian Wu via cfe-commits

hokein wrote:

I have reverted it in 50ed98f1cf2516c59de0351fa683639c937782ea, feel free to 
reland it with a fix.

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


[clang] [clang-format] Support of TableGen value annotations. (PR #80299)

2024-02-12 Thread Hirofumi Nakamura via cfe-commits

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


[clang] 6a47161 - [clang-format] Support of TableGen value annotations. (#80299)

2024-02-12 Thread via cfe-commits

Author: Hirofumi Nakamura
Date: 2024-02-12T23:27:09+09:00
New Revision: 6a471611a4b98396abb0680229aa0694ffe88a43

URL: 
https://github.com/llvm/llvm-project/commit/6a471611a4b98396abb0680229aa0694ffe88a43
DIFF: 
https://github.com/llvm/llvm-project/commit/6a471611a4b98396abb0680229aa0694ffe88a43.diff

LOG: [clang-format] Support of TableGen value annotations. (#80299)

This implements the annotation of the values in TableGen.
The main changes are,

- parseTableGenValue(), the simplified parser method for the syntax of
values.
- modified consumeToken() to parseTableGenValue in 'if', 'assert' and
after '='.
- modified parseParens() to call parseTableGenValue inside.
- modified parseSquare() to to call parseTableGenValue inside, with
skipping separator tokens.
- modified parseAngle() to call parseTableGenValue inside, with skipping
separator tokens.

Added: 


Modified: 
clang/lib/Format/FormatToken.h
clang/lib/Format/FormatTokenLexer.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp

Removed: 




diff  --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index bace91b5f99b4d..0c1dce7a294082 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -150,7 +150,17 @@ namespace format {
   TYPE(StructuredBindingLSquare)   
\
   TYPE(TableGenBangOperator)   
\
   TYPE(TableGenCondOperator)   
\
+  TYPE(TableGenCondOperatorColon)  
\
+  TYPE(TableGenCondOperatorComma)  
\
+  TYPE(TableGenDAGArgCloser)   
\
+  TYPE(TableGenDAGArgListColon)
\
+  TYPE(TableGenDAGArgListComma)
\
+  TYPE(TableGenDAGArgOpener)   
\
+  TYPE(TableGenListCloser) 
\
+  TYPE(TableGenListOpener) 
\
   TYPE(TableGenMultiLineString)
\
+  TYPE(TableGenTrailingPasteOperator)  
\
+  TYPE(TableGenValueSuffix)
\
   TYPE(TemplateCloser) 
\
   TYPE(TemplateOpener) 
\
   TYPE(TemplateString) 
\

diff  --git a/clang/lib/Format/FormatTokenLexer.cpp 
b/clang/lib/Format/FormatTokenLexer.cpp
index a57659fd422720..492e7e96dd22e6 100644
--- a/clang/lib/Format/FormatTokenLexer.cpp
+++ b/clang/lib/Format/FormatTokenLexer.cpp
@@ -812,7 +812,7 @@ void FormatTokenLexer::handleTableGenMultilineString() {
   auto CloseOffset = Lex->getBuffer().find("}]", OpenOffset);
   if (CloseOffset == StringRef::npos)
 return;
-  auto Text = Lex->getBuffer().substr(OpenOffset, CloseOffset + 2);
+  auto Text = Lex->getBuffer().substr(OpenOffset, CloseOffset - OpenOffset + 
2);
   MultiLineString->TokenText = Text;
   resetLexer(SourceMgr.getFileOffset(
   Lex->getSourceLocation(Lex->getBufferLocation() - 2 + Text.size(;

diff  --git a/clang/lib/Format/TokenAnnotator.cpp 
b/clang/lib/Format/TokenAnnotator.cpp
index b1034002f351bf..d353388a862b56 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -256,6 +256,18 @@ class AnnotatingParser {
   }
 }
   }
+  if (Style.isTableGen()) {
+if (CurrentToken->isOneOf(tok::comma, tok::equal)) {
+  // They appear as separators. Unless they are not in class 
definition.
+  next();
+  continue;
+}
+// In angle, there must be Value like tokens. Types are also able to be
+// parsed in the same way with Values.
+if (!parseTableGenValue())
+  return false;
+continue;
+  }
   if (!consumeToken())
 return false;
 }
@@ -388,6 +400,28 @@ class AnnotatingParser {
   Contexts.back().IsExpression = !IsForOrCatch;
 }
 
+if (Style.isTableGen()) {
+  if (FormatToken *Prev = OpeningParen.Previous) {
+if (Prev->is(TT_TableGenCondOperator)) {
+  Contexts.back().IsTableGenCondOpe = true;
+  Contexts.back().IsExpression = true;
+} else if (Contexts.size() > 1 &&
+   Contexts[Contexts.size() - 2].IsTableGenBangOpe) {
+  // Hack to handle bang operators. The parent context's flag
+  // was set by parseTableGenSimpleValue().
+  // We have to specify the context 

[clang] 2b5e4ee - [clang][analyzer] Remove 'alpha.core.CallAndMessageUnInitRefArg' from documentation (NFC). (#81138)

2024-02-12 Thread via cfe-commits

Author: Balázs Kéri
Date: 2024-02-12T15:30:58+01:00
New Revision: 2b5e4eeb26ce57a8d7c2835cffc80388f43f044a

URL: 
https://github.com/llvm/llvm-project/commit/2b5e4eeb26ce57a8d7c2835cffc80388f43f044a
DIFF: 
https://github.com/llvm/llvm-project/commit/2b5e4eeb26ce57a8d7c2835cffc80388f43f044a.diff

LOG: [clang][analyzer] Remove 'alpha.core.CallAndMessageUnInitRefArg' from 
documentation (NFC). (#81138)

This checker does not exist (any more?) but appeared in the
documentation. No other references to CallAndMessageUnInitRefArg are
found in the full clang code.

Added: 


Modified: 
clang/docs/analyzer/checkers.rst
clang/www/analyzer/alpha_checks.html

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index bb637cf1b8007b..510629d8a2d480 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1890,28 +1890,6 @@ the locking/unlocking of ``mtx_t`` mutexes.
mtx_lock(&mtx1); // warn: This lock has already been acquired
  }
 
-.. _alpha-core-CallAndMessageUnInitRefArg:
-
-alpha.core.CallAndMessageUnInitRefArg (C,C++, ObjC)
-"""
-Check for logical errors for function calls and Objective-C
-message expressions (e.g., uninitialized arguments, null function pointers, 
and pointer to undefined variables).
-
-.. code-block:: c
-
- void test(void) {
-   int t;
-   int &p = t;
-   int &s = p;
-   int &q = s;
-   foo(q); // warn
- }
-
- void test(void) {
-   int x;
-   foo(&x); // warn
- }
-
 .. _alpha-core-CastSize:
 
 alpha.core.CastSize (C)

diff  --git a/clang/www/analyzer/alpha_checks.html 
b/clang/www/analyzer/alpha_checks.html
index 11ef7d405dd4c8..7bbe4a20288f23 100644
--- a/clang/www/analyzer/alpha_checks.html
+++ b/clang/www/analyzer/alpha_checks.html
@@ -87,29 +87,6 @@ Core Alpha Checkers
 
 
 
-
-alpha.core.CallAndMessageUnInitRefArg
-(C, C++)
-Check for uninitialized arguments in function calls and Objective-C
-message expressions.
-
-
-void test(void) {
-  int t;
-  int &p = t;
-  int &s = p;
-  int &q = s;
-  foo(q); // warn
-}
-
-
-void test(void) {
-  int x;
-  foo(&x); // warn
-}
-
-
-
 
 alpha.core.CastSize
 (C)



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][analyzer] Remove 'alpha.core.CallAndMessageUnInitRefArg' from documentation (NFC). (PR #81138)

2024-02-12 Thread Balázs Kéri via cfe-commits

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


[clang] [clang][NFC] Refactor `Sema::TemplateDeductionResult` (PR #81398)

2024-02-12 Thread Erich Keane via cfe-commits


@@ -33,6 +33,7 @@ namespace clang {
 class Decl;
 struct DeducedPack;
 class Sema;
+enum class TemplateDeductionResult;

erichkeane wrote:

should we specify the underlying type in all of these?  I wonder if we can just 
specify it as `uint8_t`?  Would mean not having to store it as a bitfield if we 
didn't want.

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


[clang] [clang][NFC] Refactor `Sema::TemplateDeductionResult` (PR #81398)

2024-02-12 Thread Erich Keane via cfe-commits


@@ -11445,11 +11452,16 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl 
*Found, Decl *Templated,
   (ParamD = Param.dyn_cast()) ||
   (ParamD = Param.dyn_cast()) ||
   (ParamD = Param.dyn_cast());
-  switch (DeductionFailure.Result) {
-  case Sema::TDK_Success:
-llvm_unreachable("TDK_success while diagnosing bad deduction");
+  switch (DeductionFailure.getResult()) {
+  case TemplateDeductionResult::Success:
+llvm_unreachable(
+"TemplateDeductionResult::Success while diagnosing bad deduction");
+  case TemplateDeductionResult::Invalid:
+  case TemplateDeductionResult::NonDependentConversionFailure:
+  case TemplateDeductionResult::AlreadyDiagnosed:
+return;

erichkeane wrote:

Ah, shoot... `Invalid` and `AlreadyDiagnosed` make sense to me to be here.  I 
have no idea on the `NonDependentConversionFailure`, that one MIGHT be worth 
diagnosing, but I have no idea what such a diagnostic could look like.

Could you replace the 'return;' for that one with an assert and run the lit 
tests to see if it is something that might be valuable doing something with?

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


[clang] 15b0cc1 - [clang][Interp][NFC] Move a declaration into an if statement

2024-02-12 Thread Timm Bäder via cfe-commits

Author: Timm Bäder
Date: 2024-02-12T15:36:07+01:00
New Revision: 15b0cc1212701908400e8059c6581ffe85d8070f

URL: 
https://github.com/llvm/llvm-project/commit/15b0cc1212701908400e8059c6581ffe85d8070f
DIFF: 
https://github.com/llvm/llvm-project/commit/15b0cc1212701908400e8059c6581ffe85d8070f.diff

LOG: [clang][Interp][NFC] Move a declaration into an if statement

Added: 


Modified: 
clang/lib/AST/Interp/ByteCodeExprGen.cpp

Removed: 




diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp 
b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 6993d751fe58f..8a2c1e54e10a5 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -2283,8 +2283,7 @@ bool ByteCodeExprGen::dereferenceParam(
 const Expr *LV, PrimType T, const ParmVarDecl *PD, DerefKind AK,
 llvm::function_ref Direct,
 llvm::function_ref Indirect) {
-  auto It = this->Params.find(PD);
-  if (It != this->Params.end()) {
+  if (auto It = this->Params.find(PD); It != this->Params.end()) {
 unsigned Idx = It->second.Offset;
 switch (AK) {
 case DerefKind::Read:



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] ea8de6e - [clang][Interp][NFC] Make two local variables const

2024-02-12 Thread Timm Bäder via cfe-commits

Author: Timm Bäder
Date: 2024-02-12T15:36:07+01:00
New Revision: ea8de6e4336cf82aa541c6ad951b62585c3ea55c

URL: 
https://github.com/llvm/llvm-project/commit/ea8de6e4336cf82aa541c6ad951b62585c3ea55c
DIFF: 
https://github.com/llvm/llvm-project/commit/ea8de6e4336cf82aa541c6ad951b62585c3ea55c.diff

LOG: [clang][Interp][NFC] Make two local variables const

Added: 


Modified: 
clang/lib/AST/Interp/Pointer.cpp

Removed: 




diff  --git a/clang/lib/AST/Interp/Pointer.cpp 
b/clang/lib/AST/Interp/Pointer.cpp
index dd8868d0b1ec22..1eedbc360c1575 100644
--- a/clang/lib/AST/Interp/Pointer.cpp
+++ b/clang/lib/AST/Interp/Pointer.cpp
@@ -92,9 +92,9 @@ APValue Pointer::toAPValue() const {
   // Build the lvalue base from the block.
   const Descriptor *Desc = getDeclDesc();
   APValue::LValueBase Base;
-  if (auto *VD = Desc->asValueDecl())
+  if (const auto *VD = Desc->asValueDecl())
 Base = VD;
-  else if (auto *E = Desc->asExpr())
+  else if (const auto *E = Desc->asExpr())
 Base = E;
   else
 llvm_unreachable("Invalid allocation type");



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Refactor `IdentifierInfo::ObjcOrBuiltinID` (PR #71709)

2024-02-12 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman approved this pull request.

LGTM! Precommit CI didn't run for Windows, but I tested the changes locally and 
all tests came back clean for me.

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


[clang] [clang] Add -Wmissing-designated-field-initializers (PR #81364)

2024-02-12 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman commented:

Thank you for this improvement! Please add a release note to 
`clang/docs/ReleaseNotes.rst` so users know about the new diagnostic group.

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


[clang] [clang] Add -Wmissing-designated-field-initializers (PR #81364)

2024-02-12 Thread Aaron Ballman via cfe-commits

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


[clang] [clang] Add -Wmissing-designated-field-initializers (PR #81364)

2024-02-12 Thread Aaron Ballman via cfe-commits


@@ -6165,6 +6165,10 @@ def ext_initializer_string_for_char_array_too_long : 
ExtWarn<
 def warn_missing_field_initializers : Warning<
   "missing field %0 initializer">,
   InGroup, DefaultIgnore;
+// The same warning, but another group is needed to disable it separately.
+def warn_missing_designated_field_initializers : Warning<
+  "missing field %0 initializer">,
+  InGroup, DefaultIgnore;

AaronBallman wrote:

```suggestion
// The same warning, but another group is needed to disable it separately.
def warn_missing_designated_field_initializers : Warning<
  warn_missing_field_initializers.Summary>,
  InGroup, DefaultIgnore;
```
This way we don't have to worry about the two diagnostics getting different 
wording.

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


[clang] [clang] Add -Wmissing-designated-field-initializers (PR #81364)

2024-02-12 Thread Aaron Ballman via cfe-commits


@@ -2363,23 +2356,32 @@ void InitListChecker::CheckStructUnionTypes(
   }
 
   // Emit warnings for missing struct field initializers.
-  if (!VerifyOnly && InitializedSomething && CheckForMissingFields &&
-  !RD->isUnion()) {
-// It is possible we have one or more unnamed bitfields remaining.
-// Find first (if any) named field and emit warning.
-for (RecordDecl::field_iterator it = HasDesignatedInit ? RD->field_begin()
-   : Field,
-end = RD->field_end();
- it != end; ++it) {
-  if (HasDesignatedInit && InitializedFields.count(*it))
-continue;
+  if (!VerifyOnly && InitializedSomething && !RD->isUnion()) {
+// Disable missing fields check for:
+// - Zero initializers
+// - Designated initializers (only in C). This matches gcc behaviour.
+bool DisableCheck =
+IList->isIdiomaticZeroInitializer(SemaRef.getLangOpts()) ||
+(HasDesignatedInit && !SemaRef.getLangOpts().CPlusPlus);

AaronBallman wrote:

This can be hoisted into the preceding `if` statement so we drop a level of 
indentation below.

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


[clang] [clang-format] Support of TableGen value annotations. (PR #80299)

2024-02-12 Thread Hirofumi Nakamura via cfe-commits

hnakamura5 wrote:

Thank you very much!
Currently I think this will be the largest part. I try to make so. Thank you 
again for this, and of course for the other parts.

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


[clang] [Clang][Sema] fix crash in codegen stage when an lambda expression declared in an unevaluated context (PR #80802)

2024-02-12 Thread Qizhi Hu via cfe-commits

jcsxky wrote:

@cor3ntin @erichkeane Could you please take another look at this PR? I think 
current version would be a reasonable fix since it transforms type only when 
it's needed. Or you have any other opinions? Thank you for guidance!

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


[clang] 635dfd5 - [clang][Interp] Fix a designated initializer testcase

2024-02-12 Thread Timm Bäder via cfe-commits

Author: Timm Bäder
Date: 2024-02-12T15:36:07+01:00
New Revision: 635dfd5d69c6be52a8a2bb612f3483d9a1226cfa

URL: 
https://github.com/llvm/llvm-project/commit/635dfd5d69c6be52a8a2bb612f3483d9a1226cfa
DIFF: 
https://github.com/llvm/llvm-project/commit/635dfd5d69c6be52a8a2bb612f3483d9a1226cfa.diff

LOG: [clang][Interp] Fix a designated initializer testcase

This protected GetPtrField and ArrayDecay ops from dummy pointers
which fixes the attached test case for designated initializers in C.

Added: 


Modified: 
clang/lib/AST/Interp/Interp.h
clang/lib/AST/Interp/Pointer.cpp
clang/test/AST/Interp/c.c

Removed: 




diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 15c137098af355..e2fda18e3f44d4 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1187,15 +1187,18 @@ inline bool GetPtrGlobal(InterpState &S, CodePtr OpPC, 
uint32_t I) {
 /// 2) Pushes Pointer.atField(Off) on the stack
 inline bool GetPtrField(InterpState &S, CodePtr OpPC, uint32_t Off) {
   const Pointer &Ptr = S.Stk.pop();
+
   if (S.inConstantContext() && !CheckNull(S, OpPC, Ptr, CSK_Field))
 return false;
-  if (!CheckExtern(S, OpPC, Ptr))
-return false;
-  if (!CheckRange(S, OpPC, Ptr, CSK_Field))
-return false;
-  if (!CheckSubobject(S, OpPC, Ptr, CSK_Field))
-return false;
 
+  if (CheckDummy(S, OpPC, Ptr)) {
+if (!CheckExtern(S, OpPC, Ptr))
+  return false;
+if (!CheckRange(S, OpPC, Ptr, CSK_Field))
+  return false;
+if (!CheckSubobject(S, OpPC, Ptr, CSK_Field))
+  return false;
+  }
   S.Stk.push(Ptr.atField(Off));
   return true;
 }
@@ -1896,8 +1899,10 @@ inline bool ArrayElemPop(InterpState &S, CodePtr OpPC, 
uint32_t Index) {
 inline bool ArrayDecay(InterpState &S, CodePtr OpPC) {
   const Pointer &Ptr = S.Stk.pop();
 
-  if (Ptr.isDummy())
-return false;
+  if (Ptr.isDummy()) {
+S.Stk.push(Ptr);
+return true;
+  }
 
   if (!Ptr.isUnknownSizeArray()) {
 S.Stk.push(Ptr.atIndex(0));

diff  --git a/clang/lib/AST/Interp/Pointer.cpp 
b/clang/lib/AST/Interp/Pointer.cpp
index 1eedbc360c1575..d68af7922af5aa 100644
--- a/clang/lib/AST/Interp/Pointer.cpp
+++ b/clang/lib/AST/Interp/Pointer.cpp
@@ -99,7 +99,7 @@ APValue Pointer::toAPValue() const {
   else
 llvm_unreachable("Invalid allocation type");
 
-  if (isUnknownSizeArray() || Desc->asExpr())
+  if (isDummy() || isUnknownSizeArray() || Desc->asExpr())
 return APValue(Base, CharUnits::Zero(), Path, false, false);
 
   // TODO: compute the offset into the object.

diff  --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index afbc518e2af600..392b682afd602b 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -112,3 +112,15 @@ _Static_assert(sizeof(name2) == 0, ""); // expected-error 
{{failed}} \
 #ifdef __SIZEOF_INT128__
 void *PR28739d = &(&PR28739d)[(__int128)(unsigned long)-1]; // all-warning 
{{refers past the last possible element}}
 #endif
+
+extern float global_float;
+struct XX { int a, *b; };
+struct XY { int before; struct XX xx, *xp; float* after; } xy[] = {
+  0, 0, &xy[0].xx.a, &xy[0].xx, &global_float,
+  [1].xx = 0, &xy[1].xx.a, &xy[1].xx, &global_float,
+  0,  // all-note {{previous initialization is here}}
+  0,  // all-note {{previous initialization is here}}
+  [2].before = 0, // all-warning {{initializer overrides prior initialization 
of this subobject}}
+  0,  // all-warning {{initializer overrides prior initialization 
of this subobject}}
+  &xy[2].xx.a, &xy[2].xx, &global_float
+};



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Avoid printing overly large integer. (PR #75902)

2024-02-12 Thread Erich Keane via cfe-commits
=?utf-8?q?“Nhat?= ,
=?utf-8?q?“Nhat?= ,
=?utf-8?q?“Nhat?= ,
=?utf-8?q?“Nhat?= ,
=?utf-8?q?“Nhat?= ,Nhat Nguyen
 
Message-ID:
In-Reply-To: 


erichkeane wrote:

Looks like all the tests disappeared?  Only thing I see is the code change.  
Also, no release note is currently present.

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


[clang] [llvm] [LLVM] Add `__builtin_readsteadycounter` intrinsic and builtin for realtime clocks (PR #81331)

2024-02-12 Thread Jon Chesterfield via cfe-commits

JonChesterfield wrote:

New intrinsic sounds right - a constant frequency counter is a different thing 
to a variable frequency counter.

"Steady" implies unchanging, so I'd agree with `readfixedfreqtimer` or similar.

We can't have a ratio between the two counters since one changes frequency and 
one doesn't.

Does x64 have something that maps usefully onto a fixed frequency counter 
intrinsic?

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


[clang] [clang] Support `__is_trivially_copyable(int()&)==false` (PR #81298)

2024-02-12 Thread Erich Keane via cfe-commits

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


[clang] [clang] Support `__is_trivially_copyable(int()&)==false` (PR #81298)

2024-02-12 Thread Erich Keane via cfe-commits

https://github.com/erichkeane commented:

This would need a release note + I think it needs better testing.  
@AaronBallman might wish to take a look as well, this is his code ownership.

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


  1   2   3   4   5   >