[clang] [ObjC] Fix offsets following `[[no_unique_address]]` for `@encode()` (PR #71321)

2023-11-06 Thread Daniel Bertalan via cfe-commits

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


[clang] [ObjC] Fix offsets following `[[no_unique_address]]` for `@encode()` (PR #71321)

2023-11-05 Thread Daniel Bertalan via cfe-commits

https://github.com/BertalanD created 
https://github.com/llvm/llvm-project/pull/71321

Commit 46ca880fca made `@encode` skip fields that are made zero-sized by 
`[[no_unique_address]]`. When iterating the fields, the index which is passed 
to `getFieldOffset` failed to be incremented for those due to the use of an 
early `continue`, so subsequent fields reported an incorrect offset. This 
caused an assertion to be triggered in `getObjCEncodingForStructureImpl`.

Fixes #71250

>From 2ad862a174685a679d398b628769e88c5eebbee6 Mon Sep 17 00:00:00 2001
From: Daniel Bertalan 
Date: Sun, 5 Nov 2023 16:19:50 +0100
Subject: [PATCH] [ObjC] Fix offsets following `[[no_unique_address]]` for
 `@encode()`

Commit 46ca880fca made `@encode` skip fields that are made zero-sized by
`[[no_unique_address]]`. When iterating the fields, the index which is
passed to `getFieldOffset` failed to be incremented for those due to the
use of an early `continue`, so subsequent fields reported an incorrect
offset. This caused an assertion to be triggered in
`getObjCEncodingForStructureImpl`.

Fixes #71250
---
 clang/lib/AST/ASTContext.cpp   |  4 +---
 clang/test/CodeGenObjCXX/encode.mm | 14 ++
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index da90136752210b6..60146e9901bc44d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -8535,14 +8535,12 @@ void 
ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
 }
   }
 
-  unsigned i = 0;
   for (FieldDecl *Field : RDecl->fields()) {
 if (!Field->isZeroLengthBitField(*this) && Field->isZeroSize(*this))
   continue;
-uint64_t offs = layout.getFieldOffset(i);
+uint64_t offs = layout.getFieldOffset(Field->getFieldIndex());
 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
   std::make_pair(offs, Field));
-++i;
   }
 
   if (CXXRec && includeVBases) {
diff --git a/clang/test/CodeGenObjCXX/encode.mm 
b/clang/test/CodeGenObjCXX/encode.mm
index f382e7f23d77335..cad70e379c386bf 100644
--- a/clang/test/CodeGenObjCXX/encode.mm
+++ b/clang/test/CodeGenObjCXX/encode.mm
@@ -339,3 +339,17 @@ @implementation N
 const char *inner0 = @encode(Outer0::Inner0 *);
 const char *inner1 = @encode(Outer0::Inner1 *);
 }
+
+#if __cplusplus >= 202002L
+namespace GH71250 {
+  struct Empty {};
+  struct S {
+[[no_unique_address]] Empty a;
+long b;
+long c;
+  };
+
+  // CHECKCXX20: @_ZN7GH712501sE =  constant [7 x i8] c"{S=qq}\00", align 1
+  extern const char s[] = @encode(S);
+}
+#endif

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


[clang] [ObjC] Fix offsets following `[[no_unique_address]]` for `@encode()` (PR #71321)

2023-11-05 Thread Daniel Bertalan via cfe-commits

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


[clang] [ObjC] Fix offsets following `[[no_unique_address]]` for `@encode()` (PR #71321)

2023-11-05 Thread Daniel Bertalan via cfe-commits

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


[clang] [clang] Implement constexpr evaluation for `__builtin_{add,sub}c` (PR #66005)

2023-09-11 Thread Daniel Bertalan via cfe-commits

https://github.com/BertalanD created 
https://github.com/llvm/llvm-project/pull/66005:

GCC has gained support for these multiprecision arithmetic builtins in 
`r14-1896-g2b4e0415ad6`, and although they aren't explicitly specified as such 
in the documentation, they are usable in a constexpr context.

This commit adds constexpr evaluation support to Clang to match GCC's behavior. 
The implementation mirrors how the builtins are lowered to a pair of 
`u{add,sub}.with.overflow` operations and the carryout is set to 1 if either of 
those result in an overflow.

>From 00050a01970e47bbf3a9c8cdf29c41b699887900 Mon Sep 17 00:00:00 2001
From: Daniel Bertalan 
Date: Sat, 22 Jul 2023 08:20:45 +0200
Subject: [PATCH] [clang] Implement constexpr evaluation for
 `__builtin_{add,sub}c`

GCC has gained support for these multiprecision arithmetic builtins in
`r14-1896-g2b4e0415ad6`, and although they aren't explicitly specified
as such in the documentation, they are usable in a constexpr context.

This commit adds constexpr evaluation support to Clang to match GCC's
behavior. The implementation mirrors how the builtins are lowered to a
pair of `u{add,sub}.with.overflow` operations and the carryout is set to
1 if either of those result in an overflow.
---
 clang/include/clang/Basic/Builtins.def|  20 ++--
 clang/lib/AST/ExprConstant.cpp|  50 +
 .../test/SemaCXX/builtins-multiprecision.cpp  | 105 ++
 3 files changed, 165 insertions(+), 10 deletions(-)
 create mode 100644 clang/test/SemaCXX/builtins-multiprecision.cpp

diff --git a/clang/include/clang/Basic/Builtins.def 
b/clang/include/clang/Basic/Builtins.def
index 586dcf05170eb58..8a54850cca672ba 100644
--- a/clang/include/clang/Basic/Builtins.def
+++ b/clang/include/clang/Basic/Builtins.def
@@ -1619,16 +1619,16 @@ BUILTIN(__builtin_assume, "vb", "nE")
 BUILTIN(__builtin_assume_separate_storage, "vvCD*vCD*", "nE")
 
 // Multiprecision Arithmetic Builtins.
-BUILTIN(__builtin_addcb, "UcUcCUcCUcCUc*", "n")
-BUILTIN(__builtin_addcs, "UsUsCUsCUsCUs*", "n")
-BUILTIN(__builtin_addc, "UiUiCUiCUiCUi*", "n")
-BUILTIN(__builtin_addcl, "ULiULiCULiCULiCULi*", "n")
-BUILTIN(__builtin_addcll, "ULLiULLiCULLiCULLiCULLi*", "n")
-BUILTIN(__builtin_subcb, "UcUcCUcCUcCUc*", "n")
-BUILTIN(__builtin_subcs, "UsUsCUsCUsCUs*", "n")
-BUILTIN(__builtin_subc, "UiUiCUiCUiCUi*", "n")
-BUILTIN(__builtin_subcl, "ULiULiCULiCULiCULi*", "n")
-BUILTIN(__builtin_subcll, "ULLiULLiCULLiCULLiCULLi*", "n")
+BUILTIN(__builtin_addcb, "UcUcCUcCUcCUc*", "nE")
+BUILTIN(__builtin_addcs, "UsUsCUsCUsCUs*", "nE")
+BUILTIN(__builtin_addc, "UiUiCUiCUiCUi*", "nE")
+BUILTIN(__builtin_addcl, "ULiULiCULiCULiCULi*", "nE")
+BUILTIN(__builtin_addcll, "ULLiULLiCULLiCULLiCULLi*", "nE")
+BUILTIN(__builtin_subcb, "UcUcCUcCUcCUc*", "nE")
+BUILTIN(__builtin_subcs, "UsUsCUsCUsCUs*", "nE")
+BUILTIN(__builtin_subc, "UiUiCUiCUiCUi*", "nE")
+BUILTIN(__builtin_subcl, "ULiULiCULiCULiCULi*", "nE")
+BUILTIN(__builtin_subcll, "ULLiULLiCULLiCULLiCULLi*", "nE")
 
 // Checked Arithmetic Builtins for Security.
 BUILTIN(__builtin_add_overflow, "b.", "ntE")
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index dfa48e9c030b6a3..c8f837f7fc1f688 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -12630,6 +12630,56 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
   return false;
 return Success(DidOverflow, E);
   }
+  case Builtin::BI__builtin_addcb:
+  case Builtin::BI__builtin_addcs:
+  case Builtin::BI__builtin_addc:
+  case Builtin::BI__builtin_addcl:
+  case Builtin::BI__builtin_addcll:
+  case Builtin::BI__builtin_subcb:
+  case Builtin::BI__builtin_subcs:
+  case Builtin::BI__builtin_subc:
+  case Builtin::BI__builtin_subcl:
+  case Builtin::BI__builtin_subcll: {
+APSInt X, Y, CarryIn;
+LValue CarryOut;
+
+QualType ResultType = E->getArg(3)->getType()->getPointeeType();
+if (!EvaluateInteger(E->getArg(0), X, Info) ||
+!EvaluateInteger(E->getArg(1), Y, Info) ||
+!EvaluateInteger(E->getArg(2), CarryIn, Info) ||
+!EvaluatePointer(E->getArg(3), CarryOut, Info))
+  return false;
+
+APInt Result;
+bool DidOverflow1 = false;
+bool DidOverflow2 = false;
+
+switch (BuiltinOp) {
+default:
+  llvm_unreachable("Invalid value for BuiltinOp");
+case Builtin::BI__builtin_addcb:
+case Builtin::BI__builtin_addcs:
+case Builtin::BI__builtin_addc:
+case Builtin::BI__builtin_addcl:
+case Builtin::BI__builtin_addcll:
+  Result = X.uadd_ov(Y, DidOverflow1).uadd_ov(CarryIn, DidOverflow2);
+  break;
+case Builtin::BI__builtin_subcb:
+case Builtin::BI__builtin_subcs:
+case Builtin::BI__builtin_subc:
+case Builtin::BI__builtin_subcl:
+case Builtin::BI__builtin_subcll:
+  Result = X.usub_ov(Y, DidOverflow1).usub_ov(CarryIn, DidOverflow2);
+  break;
+}
+
+APSInt DidOverflow(
+APInt(Result.getBitWidth(), D

[clang] [clang] Implement constexpr evaluation for `__builtin_{add,sub}c` (PR #66005)

2023-09-11 Thread Daniel Bertalan via cfe-commits

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


[clang] [clang] Implement constexpr evaluation for `__builtin_{add,sub}c` (PR #66005)

2023-09-11 Thread Daniel Bertalan via cfe-commits

https://github.com/BertalanD updated 
https://github.com/llvm/llvm-project/pull/66005:

>From 1a1f9ce09efb51a26440f378334df97ec014cad5 Mon Sep 17 00:00:00 2001
From: Daniel Bertalan 
Date: Sat, 22 Jul 2023 08:20:45 +0200
Subject: [PATCH] [clang] Implement constexpr evaluation for
 `__builtin_{add,sub}c`

GCC has gained support for these multiprecision arithmetic builtins in
`r14-1896-g2b4e0415ad6`, and although they aren't explicitly specified
as such in the documentation, they are usable in a constexpr context.

This commit adds constexpr evaluation support to Clang to match GCC's
behavior. The implementation mirrors how the builtins are lowered to a
pair of `u{add,sub}.with.overflow` operations and the carryout is set to
1 if either of those result in an overflow.
---
 clang/docs/LanguageExtensions.rst |  12 ++
 clang/include/clang/Basic/Builtins.def|  20 ++--
 clang/lib/AST/ExprConstant.cpp|  50 +
 .../test/SemaCXX/builtins-multiprecision.cpp  | 105 ++
 4 files changed, 177 insertions(+), 10 deletions(-)
 create mode 100644 clang/test/SemaCXX/builtins-multiprecision.cpp

diff --git a/clang/docs/LanguageExtensions.rst 
b/clang/docs/LanguageExtensions.rst
index 11cbdca7a268fc3..8541558fa4c1ec7 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -3449,6 +3449,8 @@ The complete list of builtins are:
   unsigned long  __builtin_subcl (unsigned long x, unsigned long y, 
unsigned long carryin, unsigned long *carryout);
   unsigned long long __builtin_subcll(unsigned long long x, unsigned long long 
y, unsigned long long carryin, unsigned long long *carryout);
 
+These builtins can be used in constant expressions.
+
 Checked Arithmetic Builtins
 ---
 
@@ -5173,6 +5175,11 @@ Intrinsics Support within Constant Expressions
 
 The following builtin intrinsics can be used in constant expressions:
 
+* ``__builtin_addc``
+* ``__builtin_addcb``
+* ``__builtin_addcl``
+* ``__builtin_addcll``
+* ``__builtin_addcs``
 * ``__builtin_bitreverse8``
 * ``__builtin_bitreverse16``
 * ``__builtin_bitreverse32``
@@ -5219,6 +5226,11 @@ The following builtin intrinsics can be used in constant 
expressions:
 * ``__builtin_rotateright16``
 * ``__builtin_rotateright32``
 * ``__builtin_rotateright64``
+* ``__builtin_subc``
+* ``__builtin_subcb``
+* ``__builtin_subcl``
+* ``__builtin_subcll``
+* ``__builtin_subcs``
 
 The following x86-specific intrinsics can be used in constant expressions:
 
diff --git a/clang/include/clang/Basic/Builtins.def 
b/clang/include/clang/Basic/Builtins.def
index 586dcf05170eb58..8a54850cca672ba 100644
--- a/clang/include/clang/Basic/Builtins.def
+++ b/clang/include/clang/Basic/Builtins.def
@@ -1619,16 +1619,16 @@ BUILTIN(__builtin_assume, "vb", "nE")
 BUILTIN(__builtin_assume_separate_storage, "vvCD*vCD*", "nE")
 
 // Multiprecision Arithmetic Builtins.
-BUILTIN(__builtin_addcb, "UcUcCUcCUcCUc*", "n")
-BUILTIN(__builtin_addcs, "UsUsCUsCUsCUs*", "n")
-BUILTIN(__builtin_addc, "UiUiCUiCUiCUi*", "n")
-BUILTIN(__builtin_addcl, "ULiULiCULiCULiCULi*", "n")
-BUILTIN(__builtin_addcll, "ULLiULLiCULLiCULLiCULLi*", "n")
-BUILTIN(__builtin_subcb, "UcUcCUcCUcCUc*", "n")
-BUILTIN(__builtin_subcs, "UsUsCUsCUsCUs*", "n")
-BUILTIN(__builtin_subc, "UiUiCUiCUiCUi*", "n")
-BUILTIN(__builtin_subcl, "ULiULiCULiCULiCULi*", "n")
-BUILTIN(__builtin_subcll, "ULLiULLiCULLiCULLiCULLi*", "n")
+BUILTIN(__builtin_addcb, "UcUcCUcCUcCUc*", "nE")
+BUILTIN(__builtin_addcs, "UsUsCUsCUsCUs*", "nE")
+BUILTIN(__builtin_addc, "UiUiCUiCUiCUi*", "nE")
+BUILTIN(__builtin_addcl, "ULiULiCULiCULiCULi*", "nE")
+BUILTIN(__builtin_addcll, "ULLiULLiCULLiCULLiCULLi*", "nE")
+BUILTIN(__builtin_subcb, "UcUcCUcCUcCUc*", "nE")
+BUILTIN(__builtin_subcs, "UsUsCUsCUsCUs*", "nE")
+BUILTIN(__builtin_subc, "UiUiCUiCUiCUi*", "nE")
+BUILTIN(__builtin_subcl, "ULiULiCULiCULiCULi*", "nE")
+BUILTIN(__builtin_subcll, "ULLiULLiCULLiCULLiCULLi*", "nE")
 
 // Checked Arithmetic Builtins for Security.
 BUILTIN(__builtin_add_overflow, "b.", "ntE")
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index dfa48e9c030b6a3..c8f837f7fc1f688 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -12630,6 +12630,56 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
   return false;
 return Success(DidOverflow, E);
   }
+  case Builtin::BI__builtin_addcb:
+  case Builtin::BI__builtin_addcs:
+  case Builtin::BI__builtin_addc:
+  case Builtin::BI__builtin_addcl:
+  case Builtin::BI__builtin_addcll:
+  case Builtin::BI__builtin_subcb:
+  case Builtin::BI__builtin_subcs:
+  case Builtin::BI__builtin_subc:
+  case Builtin::BI__builtin_subcl:
+  case Builtin::BI__builtin_subcll: {
+APSInt X, Y, CarryIn;
+LValue CarryOut;
+
+QualType ResultType = E->getArg(3)->getType()->getPointeeType();
+if (!EvaluateInteger(E->getArg(0), X, Info) ||
+!EvaluateInteger(E->getArg(1), Y

[clang] [clang] Implement constexpr evaluation for `__builtin_{add,sub}c` (PR #66005)

2024-04-26 Thread Daniel Bertalan via cfe-commits

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


[clang] [clang] Implement constexpr evaluation for `__builtin_{add,sub}c` (PR #66005)

2024-04-26 Thread Daniel Bertalan via cfe-commits

BertalanD wrote:

Obsoleted by #81656 

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