[llvm-branch-commits] [llvm] [AllocToken, Clang] Implement __builtin_alloc_token_infer() and llvm.alloc.token.id (PR #156842)
https://github.com/melver updated
https://github.com/llvm/llvm-project/pull/156842
>From 48227c8f7712b2dc807b252d18353c91905b1fb5 Mon Sep 17 00:00:00 2001
From: Marco Elver
Date: Mon, 8 Sep 2025 17:19:04 +0200
Subject: [PATCH] fixup!
Created using spr 1.3.8-beta.1
---
llvm/lib/Transforms/Instrumentation/AllocToken.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
b/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
index d5ac3035df71b..3a28705d87523 100644
--- a/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AllocToken.cpp
@@ -151,7 +151,8 @@ STATISTIC(NumAllocations, "Allocations found");
/// Expected format is: !{, }
MDNode *getAllocTokenHintMetadata(const CallBase &CB) {
MDNode *Ret = nullptr;
- if (auto *II = dyn_cast(&CB)) {
+ if (auto *II = dyn_cast(&CB);
+ II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
auto *MDV = cast(II->getArgOperand(0));
Ret = cast(MDV->getMetadata());
// If the intrinsic has an empty MDNode, type inference failed.
@@ -358,7 +359,7 @@ bool AllocToken::instrumentFunction(Function &F) {
// Collect all allocation calls to avoid iterator invalidation.
for (Instruction &I : instructions(F)) {
// Collect all alloc_token_* intrinsics.
-if (IntrinsicInst *II = dyn_cast(&I);
+if (auto *II = dyn_cast(&I);
II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
IntrinsicInsts.emplace_back(II);
continue;
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [not] Update disable-symbolization.test to work with internal shell (PR #157236)
https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/157236 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] [InstCombine] Set !prof metadata on selects (PR #157599)
mtrofin wrote: > TBH I don't think selects should be validated by profcheck at all, only > branches. Some get lowered to branches later on - otherwise, yes, I'd also love to not worry about them. https://github.com/llvm/llvm-project/pull/157599 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] release/21.x: [X86] Only fold AND/ANDNP back to VSELECT if we know the predicated mask select is legal (#156663) (PR #157047)
https://github.com/tru updated https://github.com/llvm/llvm-project/pull/157047
>From 81d3b6ee82bfa49e4d7b7a03c0785fca4e820894 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim
Date: Wed, 3 Sep 2025 15:01:12 +0100
Subject: [PATCH] [X86] Only fold AND/ANDNP back to VSELECT if we know the
predicated mask select is legal (#156663)
By only checking type legality we didn't account for 128/256-bit ops
being run on non-AVX512VL targets, or vXi8/i16 ops being run on
non-AVX512BW targets
This check is cropping up in several places now and I intend to hoist it
out into a common helper, but this initial fix needs to be as clean as
possible to be back ported to 21.X
Fixes #156256
(cherry picked from commit 86879d46f6476386dc07772ede83cd43b6ddd739)
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 4
llvm/test/CodeGen/X86/pr156256.ll | 25 +
2 files changed, 29 insertions(+)
create mode 100644 llvm/test/CodeGen/X86/pr156256.ll
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp
b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 578519b1cc3c9..86877be48eca8 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -51775,6 +51775,8 @@ static SDValue combineAnd(SDNode *N, SelectionDAG &DAG,
SDValue X, Y;
EVT CondVT = VT.changeVectorElementType(MVT::i1);
if (TLI.isTypeLegal(VT) && TLI.isTypeLegal(CondVT) &&
+(VT.is512BitVector() || Subtarget.hasVLX()) &&
+(VT.getScalarSizeInBits() >= 32 || Subtarget.hasBWI()) &&
sd_match(N, m_And(m_Value(X),
m_OneUse(m_SExt(m_AllOf(
m_Value(Y), m_SpecificVT(CondVT),
@@ -55329,6 +55331,8 @@ static SDValue combineAndnp(SDNode *N, SelectionDAG
&DAG,
SDValue Src = N0.getOperand(0);
EVT SrcVT = Src.getValueType();
if (Src.getOpcode() == ISD::SETCC && SrcVT.getScalarType() == MVT::i1 &&
+(VT.is512BitVector() || Subtarget.hasVLX()) &&
+(VT.getScalarSizeInBits() >= 32 || Subtarget.hasBWI()) &&
TLI.isTypeLegal(SrcVT) && N0.hasOneUse() && Src.hasOneUse())
return DAG.getSelect(DL, VT, DAG.getNOT(DL, Src, SrcVT), N1,
getZeroVector(VT, Subtarget, DAG, DL));
diff --git a/llvm/test/CodeGen/X86/pr156256.ll
b/llvm/test/CodeGen/X86/pr156256.ll
new file mode 100644
index 0..13caa6fee5878
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr156256.ll
@@ -0,0 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512dq | FileCheck %s
--check-prefix=AVX512
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512dq,+avx512vl |
FileCheck %s --check-prefix=AVX512VL
+
+define <16 x i16> @PR156256(<16 x i32> %a, <16 x i32> %b) {
+; AVX512-LABEL: PR156256:
+; AVX512: # %bb.0:
+; AVX512-NEXT:vpcmpnleud %zmm1, %zmm0, %k0
+; AVX512-NEXT:vpmovm2d %k0, %zmm0
+; AVX512-NEXT:vpmovdw %zmm0, %ymm0
+; AVX512-NEXT:vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; AVX512-NEXT:retq
+;
+; AVX512VL-LABEL: PR156256:
+; AVX512VL: # %bb.0:
+; AVX512VL-NEXT:vpcmpnleud %zmm1, %zmm0, %k0
+; AVX512VL-NEXT:vpmovm2d %k0, %zmm0
+; AVX512VL-NEXT:vpmovdw %zmm0, %ymm0
+; AVX512VL-NEXT:vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
+; AVX512VL-NEXT:retq
+ %icmp = icmp ugt <16 x i32> %a, %b
+ %sext = sext <16 x i1> %icmp to <16 x i16>
+ %and = and <16 x i16> %sext, splat (i16 16256)
+ ret <16 x i16> %and
+}
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] Add llvm.protected.field.ptr intrinsic and pre-ISel lowering. (PR #151647)
https://github.com/pcc updated https://github.com/llvm/llvm-project/pull/151647 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [libcxx] 0bbb936 - [libc++] Fix broken precondition of __bit_log2 (#155476)
Author: Louis Dionne
Date: 2025-09-09T10:33:32+02:00
New Revision: 0bbb93672952ea6d7fa7c06d084a69ffd623d7c8
URL:
https://github.com/llvm/llvm-project/commit/0bbb93672952ea6d7fa7c06d084a69ffd623d7c8
DIFF:
https://github.com/llvm/llvm-project/commit/0bbb93672952ea6d7fa7c06d084a69ffd623d7c8.diff
LOG: [libc++] Fix broken precondition of __bit_log2 (#155476)
In #135303, we started using `__bit_log2` instead of `__log2i` inside
`std::sort`. However, `__bit_log2` has a precondition that `__log2i`
didn't have, which is that the input is non-zero. While it technically
makes no sense to request the logarithm of 0, `__log2i` handled that
case and returned 0 without issues.
After switching to `__bit_log2`, passing 0 as an input results in an
unsigned integer overflow which can trigger
`-fsanitize=unsigned-integer-overflow`. While not technically UB in
itself, it's clearly not intended either.
To fix this, we add an internal assertion to `__bit_log2` which catches
the issue in our test suite, and we make sure not to violate
`__bit_log2`'s preconditions before we call it from `std::sort`.
(cherry picked from commit 2ae4b92a1cf01b7d09f70ccc919eca2b5d02b080)
Added:
Modified:
libcxx/include/__algorithm/sort.h
libcxx/include/__bit/bit_log2.h
libcxx/src/algorithm.cpp
Removed:
diff --git a/libcxx/include/__algorithm/sort.h
b/libcxx/include/__algorithm/sort.h
index 06cb5b8ce7057..8aa894e9228c6 100644
--- a/libcxx/include/__algorithm/sort.h
+++ b/libcxx/include/__algorithm/sort.h
@@ -860,6 +860,9 @@ __sort<__less&, long double*>(long double*,
long double*, __less
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
__sort_dispatch(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Comp& __comp) {
+ if (__first == __last) // log(0) is undefined, so don't try computing the
depth
+return;
+
typedef typename iterator_traits<_RandomAccessIterator>::
diff erence_type
diff erence_type;
diff erence_type __depth_limit = 2 *
std::__bit_log2(std::__to_unsigned_like(__last - __first));
diff --git a/libcxx/include/__bit/bit_log2.h b/libcxx/include/__bit/bit_log2.h
index 8077cd91d6fd7..9ceeec1b2bc94 100644
--- a/libcxx/include/__bit/bit_log2.h
+++ b/libcxx/include/__bit/bit_log2.h
@@ -9,6 +9,7 @@
#ifndef _LIBCPP___BIT_BIT_LOG2_H
#define _LIBCPP___BIT_BIT_LOG2_H
+#include <__assert>
#include <__bit/countl.h>
#include <__config>
#include <__type_traits/integer_traits.h>
@@ -23,6 +24,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
template
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp __bit_log2(_Tp __t)
_NOEXCEPT {
static_assert(__is_unsigned_integer_v<_Tp>, "__bit_log2 requires an unsigned
integer type");
+ _LIBCPP_ASSERT_INTERNAL(__t != 0, "logarithm of 0 is undefined");
return numeric_limits<_Tp>::digits - 1 - std::__countl_zero(__t);
}
diff --git a/libcxx/src/algorithm.cpp b/libcxx/src/algorithm.cpp
index d388fee5f99cc..8157be6f7406e 100644
--- a/libcxx/src/algorithm.cpp
+++ b/libcxx/src/algorithm.cpp
@@ -13,6 +13,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
template
void __sort(RandomAccessIterator first, RandomAccessIterator last, Comp comp) {
+ if (first == last) // log(0) is undefined, so don't try computing the depth
+return;
+
auto depth_limit = 2 * std::__bit_log2(static_cast(last - first));
// Only use bitset partitioning for arithmetic types. We should also check
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] [Xtensa] Fix lowering FP compare operations. (PR #157520)
https://github.com/andreisfr created
https://github.com/llvm/llvm-project/pull/157520
Implement lowering of the SETONE/SETOGT/SETOGE/SETUGT/SETUGE operations. This
fixes f32 "copysign" and "ueq" tests.
>From dddc4b6181658586dcb8b56d9be8bdc4b2dca7ba Mon Sep 17 00:00:00 2001
From: Andrei Safronov
Date: Wed, 3 Sep 2025 22:31:32 +0300
Subject: [PATCH] [Xtensa] Fix lowering FP compare operations.
Impelement lowering of the SETONE/SETOGT/SETOGE/SETUGT/SETUGE operations.
This fixes f32 "copysign" and "ueq" tests.
---
llvm/lib/Target/Xtensa/XtensaISelLowering.cpp | 16 +
llvm/test/CodeGen/Xtensa/select-cc-fp.ll | 33 ++-
2 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
index fd42fd2e010ba..f847ddb46af76 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
@@ -232,12 +232,6 @@ XtensaTargetLowering::XtensaTargetLowering(const
TargetMachine &TM,
setOperationAction(ISD::SINT_TO_FP, MVT::i32, Legal);
setOperationAction(ISD::FP_TO_UINT, MVT::i32, Legal);
setOperationAction(ISD::FP_TO_SINT, MVT::i32, Legal);
-
-setCondCodeAction(ISD::SETOGT, MVT::f32, Expand);
-setCondCodeAction(ISD::SETOGE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETONE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETUGE, MVT::f32, Expand);
-setCondCodeAction(ISD::SETUGT, MVT::f32, Expand);
} else {
setOperationAction(ISD::BITCAST, MVT::i32, Expand);
setOperationAction(ISD::BITCAST, MVT::f32, Expand);
@@ -877,6 +871,16 @@ static std::pair
getFPBranchKind(ISD::CondCode Cond) {
return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
case ISD::SETGT:
return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
+ case ISD::SETOGT:
+return std::make_pair(Xtensa::BF, Xtensa::ULE_S);
+ case ISD::SETOGE:
+return std::make_pair(Xtensa::BF, Xtensa::ULT_S);
+ case ISD::SETONE:
+return std::make_pair(Xtensa::BF, Xtensa::UEQ_S);
+ case ISD::SETUGT:
+return std::make_pair(Xtensa::BF, Xtensa::OLE_S);
+ case ISD::SETUGE:
+return std::make_pair(Xtensa::BF, Xtensa::OLT_S);
default:
llvm_unreachable("Invalid condition!");
}
diff --git a/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
b/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
index ee45ef006123c..742770de23f37 100644
--- a/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
+++ b/llvm/test/CodeGen/Xtensa/select-cc-fp.ll
@@ -103,8 +103,8 @@ define float @brcc_olt(float %a, float %b) nounwind {
; CHECK: # %bb.0:
; CHECK-NEXT:wfr f8, a3
; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ule.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB3_2
+; CHECK-NEXT:olt.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB3_2
; CHECK-NEXT: # %bb.1: # %t1
; CHECK-NEXT:l32r a8, .LCPI3_1
; CHECK-NEXT:wfr f8, a8
@@ -135,8 +135,8 @@ define float @brcc_ole(float %a, float %b) nounwind {
; CHECK: # %bb.0:
; CHECK-NEXT:wfr f8, a3
; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ult.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB4_2
+; CHECK-NEXT:ole.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB4_2
; CHECK-NEXT: # %bb.1: # %t1
; CHECK-NEXT:l32r a8, .LCPI4_1
; CHECK-NEXT:wfr f8, a8
@@ -232,7 +232,7 @@ define float @brcc_ueq(float %a, float %b) nounwind {
; CHECK-NEXT:wfr f8, a3
; CHECK-NEXT:wfr f9, a2
; CHECK-NEXT:ueq.s b0, f9, f8
-; CHECK-NEXT:bt b0, .LBB7_2
+; CHECK-NEXT:bf b0, .LBB7_2
; CHECK-NEXT: # %bb.1: # %t1
; CHECK-NEXT:l32r a8, .LCPI7_1
; CHECK-NEXT:wfr f8, a8
@@ -327,8 +327,8 @@ define float @brcc_ult(float %a, float %b) nounwind {
; CHECK: # %bb.0:
; CHECK-NEXT:wfr f8, a3
; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:ole.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB10_2
+; CHECK-NEXT:ult.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB10_2
; CHECK-NEXT: # %bb.1: # %t1
; CHECK-NEXT:l32r a8, .LCPI10_1
; CHECK-NEXT:wfr f8, a8
@@ -359,8 +359,8 @@ define float @brcc_ule(float %a, float %b) nounwind {
; CHECK: # %bb.0:
; CHECK-NEXT:wfr f8, a3
; CHECK-NEXT:wfr f9, a2
-; CHECK-NEXT:olt.s b0, f8, f9
-; CHECK-NEXT:bt b0, .LBB11_2
+; CHECK-NEXT:ule.s b0, f9, f8
+; CHECK-NEXT:bf b0, .LBB11_2
; CHECK-NEXT: # %bb.1: # %t1
; CHECK-NEXT:l32r a8, .LCPI11_1
; CHECK-NEXT:wfr f8, a8
@@ -451,6 +451,21 @@ exit:
}
define float @copysign_f32(float %a, float %b) {
+; CHECK-LABEL: copysign_f32:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: # %bb.0: # %entry
+; CHECK-NEXT:l32r a8, .LCPI14_0
+; CHECK-NEXT:and a8, a3, a8
+; CHECK-NEXT:l32r a9, .LCPI14_1
+; CHECK-NEXT:and a9, a2, a9
+; CHECK-NEXT:wfr f8, a9
+; CHECK-NEXT:movi a9, 0
+; CHECK-NEXT:beq a8, a9, .LBB14_2
+; CHECK-NEXT: # %bb.1:
+; CHECK-NEXT:neg.s f8, f8
+; CHECK-NEXT: .LBB14_2: # %entry
+; CHECK-NEXT:rfr a2, f8
+; CHECK-NEXT:ret
entry:
%c = call float @llvm.
[llvm-branch-commits] [llvm] [Offload] Add GenericPluginTy::get_mem_info (PR #157484)
https://github.com/jplehr commented: I thought that the allocation would be done via the `MemoryManager` thing but I can be completely wrong. https://github.com/llvm/llvm-project/pull/157484 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] release/21.x: [CMake][AIX] Enable CMP0182: Create shared library archives by default (#155686) (PR #156504)
https://github.com/hubert-reinterpretcast approved this pull request. LGTM! https://github.com/llvm/llvm-project/pull/156504 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] [flang][do concurent] Add saxpy offload tests for OpenMP mapping (PR #155993)
https://github.com/ergawy edited https://github.com/llvm/llvm-project/pull/155993 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang] [LifetimeSafety] Add support for GSL Pointer types (PR #154009)
https://github.com/usx95 updated
https://github.com/llvm/llvm-project/pull/154009
>From c41c73755ec7863d5fb90e3ff1eb62f0425e374e Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena
Date: Thu, 4 Sep 2025 14:27:37 +
Subject: [PATCH 1/2] all-lvalues-have-origin
>From 9702347310809f432644b76b36668f2e5587d939 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena
Date: Sun, 17 Aug 2025 10:10:18 +
Subject: [PATCH 2/2] [LifetimeSafety] Track gsl::Pointer types
---
clang/lib/Analysis/LifetimeSafety.cpp | 94 -
clang/test/Sema/warn-lifetime-safety.cpp | 120 +++-
.../unittests/Analysis/LifetimeSafetyTest.cpp | 182 +-
3 files changed, 381 insertions(+), 15 deletions(-)
diff --git a/clang/lib/Analysis/LifetimeSafety.cpp
b/clang/lib/Analysis/LifetimeSafety.cpp
index e687e5419c50a..0dd5716d93fb6 100644
--- a/clang/lib/Analysis/LifetimeSafety.cpp
+++ b/clang/lib/Analysis/LifetimeSafety.cpp
@@ -478,6 +478,25 @@ class FactGenerator : public
ConstStmtVisitor {
}
}
+ void VisitCXXConstructExpr(const CXXConstructExpr *CCE) {
+if (isGslPointerType(CCE->getType())) {
+ handleGSLPointerConstruction(CCE);
+ return;
+}
+ }
+
+ void VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE) {
+// Specifically for conversion operators,
+// like `std::string_view p = std::string{};`
+if (isGslPointerType(MCE->getType()) &&
+isa(MCE->getCalleeDecl())) {
+ // The argument is the implicit object itself.
+ handleFunctionCall(MCE, MCE->getMethodDecl(),
+ {MCE->getImplicitObjectArgument()});
+}
+// FIXME: A more general VisitCallExpr could also be used here.
+ }
+
void VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *N) {
/// TODO: Handle nullptr expr as a special 'null' loan. Uninitialized
/// pointers can use the same type of loan.
@@ -530,8 +549,27 @@ class FactGenerator : public
ConstStmtVisitor {
void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *FCE) {
// Check if this is a test point marker. If so, we are done with this
// expression.
-if (VisitTestPoint(FCE))
+if (handleTestPoint(FCE))
return;
+if (isGslPointerType(FCE->getType()))
+ addAssignOriginFact(*FCE, *FCE->getSubExpr());
+ }
+
+ void VisitInitListExpr(const InitListExpr *ILE) {
+if (!hasOrigin(ILE))
+ return;
+// For list initialization with a single element, like `View{...}`, the
+// origin of the list itself is the origin of its single element.
+if (ILE->getNumInits() == 1)
+ addAssignOriginFact(*ILE, *ILE->getInit(0));
+ }
+
+ void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE) {
+if (!hasOrigin(MTE))
+ return;
+// A temporary object's origin is the same as the origin of the
+// expression that initializes it.
+addAssignOriginFact(*MTE, *MTE->getSubExpr());
}
void handleDestructor(const CFGAutomaticObjDtor &DtorOpt) {
@@ -557,10 +595,21 @@ class FactGenerator : public
ConstStmtVisitor {
}
private:
- static bool isPointerType(QualType QT) {
-return QT->isPointerOrReferenceType();
+ static bool isGslPointerType(QualType QT) {
+if (const auto *RD = QT->getAsCXXRecordDecl()) {
+ // We need to check the template definition for specializations.
+ if (auto *CTSD = dyn_cast(RD))
+return CTSD->getSpecializedTemplate()
+->getTemplatedDecl()
+->hasAttr();
+ return RD->hasAttr();
+}
+return false;
}
+ static bool isPointerType(QualType QT) {
+return QT->isPointerOrReferenceType() || isGslPointerType(QT);
+ }
// Check if a type has an origin.
static bool hasOrigin(const Expr *E) {
return E->isGLValue() || isPointerType(E->getType());
@@ -570,6 +619,41 @@ class FactGenerator : public
ConstStmtVisitor {
return isPointerType(VD->getType());
}
+ void handleGSLPointerConstruction(const CXXConstructExpr *CCE) {
+assert(isGslPointerType(CCE->getType()));
+if (CCE->getNumArgs() != 1)
+ return;
+if (hasOrigin(CCE->getArg(0)))
+ addAssignOriginFact(*CCE, *CCE->getArg(0));
+else
+ // This could be a new borrow.
+ handleFunctionCall(CCE, CCE->getConstructor(),
+ {CCE->getArgs(), CCE->getNumArgs()});
+ }
+
+ /// Checks if a call-like expression creates a borrow by passing a value to a
+ /// reference parameter, creating an IssueFact if it does.
+ void handleFunctionCall(const Expr *Call, const FunctionDecl *FD,
+ ArrayRef Args) {
+if (!FD)
+ return;
+// TODO: Handle more than one arguments.
+for (unsigned I = 0; I <= 0 /*Args.size()*/; ++I) {
+ const Expr *ArgExpr = Args[I];
+
+ // Propagate origins for CXX this.
+ if (FD->isCXXClassMember() && I == 0) {
+addAssignOriginFact(*Call, *ArgExpr);
+continue;
+ }
+ // The parameter is a pointer, reference, or gsl::Pointe
[llvm-branch-commits] [llvm] [Offload] Add GenericPluginTy::get_mem_info (PR #157484)
@@ -517,6 +517,11 @@ struct GenELF64PluginTy final : public GenericPluginTy {
#endif
}
+ Expected get_memory_info(const void *TgtPtr) override {
jplehr wrote:
```suggestion
Expected getMemoryInfo(const void *TgtPtr) override {
```
https://github.com/llvm/llvm-project/pull/157484
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [llvm] [MC] Rewrite stdin.s to use python (PR #157232)
@@ -0,0 +1,17 @@ +# RUN: echo "// comment" > %t.input +# RUN: which llvm-mc | %python %s %t + +import subprocess +import sys + +llvm_mc_binary = sys.stdin.readlines()[0].strip() +temp_file = sys.argv[1] petrhosek wrote: Shouldn't this be `sys.argv[2]`? `sys.argv[1]` is this file. I'd consider making all arguments explicit and use `argparse` to avoid any confusion. https://github.com/llvm/llvm-project/pull/157232 ___ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
