Skip to content

Commit d04788c

Browse files
committed
[CIR][Lifetime] Fix think'o and properly handle ctor init to ptr from owner
1 parent bb7cfcd commit d04788c

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

clang/lib/CIR/Dialect/Transforms/LifetimeCheck.cpp

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
4747
void checkMoveAssignment(CallOp callOp, const clang::CXXMethodDecl *m);
4848
void checkOperatorStar(CallOp callOp);
4949

50+
// Helpers
51+
bool isCtorInitFromOwner(CallOp callOp,
52+
const clang::CXXConstructorDecl *ctor);
53+
5054
struct Options {
5155
enum : unsigned {
5256
None = 0,
@@ -107,7 +111,7 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
107111
State(DataTy d) { val.setInt(d); }
108112
State(mlir::Value v, DataTy d = LocalValue) {
109113
assert((d == LocalValue || d == OwnedBy) && "expected value or owned");
110-
val.setPointerAndInt(v, LocalValue);
114+
val.setPointerAndInt(v, d);
111115
}
112116

113117
static constexpr int KindBits = 3;
@@ -845,6 +849,27 @@ void LifetimeCheckPass::checkMoveAssignment(CallOp callOp,
845849
getPmap()[src].clear(); // TODO: should we add null to 'src' pset?
846850
}
847851

852+
// User defined ctors that initialize from owner types is one
853+
// way of tracking owned pointers.
854+
//
855+
// Example:
856+
// MyIntPointer::MyIntPointer(MyIntOwner const&)(%5, %4)
857+
//
858+
bool LifetimeCheckPass::isCtorInitFromOwner(
859+
CallOp callOp, const clang::CXXConstructorDecl *ctor) {
860+
if (callOp.getNumOperands() < 2)
861+
return false;
862+
863+
// FIXME: should we scan all arguments past first to look for an owner?
864+
auto addr = callOp.getOperand(0);
865+
auto owner = callOp.getOperand(1);
866+
867+
if (ptrs.count(addr) && owners.count(owner))
868+
return true;
869+
870+
return false;
871+
}
872+
848873
void LifetimeCheckPass::checkCtor(CallOp callOp,
849874
const clang::CXXConstructorDecl *ctor) {
850875
// TODO: zero init
@@ -879,17 +904,17 @@ void LifetimeCheckPass::checkCtor(CallOp callOp,
879904
return;
880905
}
881906

882-
// Copy ctor call that initializes a pointer type from an owner
883-
// Example:
884-
// MyIntPointer::MyIntPointer(MyIntOwner const&)(%5, %4)
907+
// User defined copy ctor calls ...
885908
if (ctor->isCopyConstructor()) {
909+
llvm_unreachable("NYI");
910+
}
911+
912+
if (isCtorInitFromOwner(callOp, ctor)) {
886913
auto addr = callOp.getOperand(0);
887914
auto owner = callOp.getOperand(1);
888-
889-
if (ptrs.count(addr) && owners.count(owner)) {
890-
getPmap()[addr].clear();
891-
getPmap()[addr].insert(State::getOwnedBy(owner));
892-
}
915+
getPmap()[addr].clear();
916+
getPmap()[addr].insert(State::getOwnedBy(owner));
917+
return;
893918
}
894919
}
895920

0 commit comments

Comments
 (0)