[clang] [ObjC] Fix offsets following `[[no_unique_address]]` for `@encode()` (PR #71321)
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)
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)
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)
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)
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)
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)
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)
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)
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