@@ -47,6 +47,10 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
47
47
void checkMoveAssignment (CallOp callOp, const clang::CXXMethodDecl *m);
48
48
void checkOperatorStar (CallOp callOp);
49
49
50
+ // Helpers
51
+ bool isCtorInitFromOwner (CallOp callOp,
52
+ const clang::CXXConstructorDecl *ctor);
53
+
50
54
struct Options {
51
55
enum : unsigned {
52
56
None = 0 ,
@@ -107,7 +111,7 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
107
111
State (DataTy d) { val.setInt (d); }
108
112
State (mlir::Value v, DataTy d = LocalValue) {
109
113
assert ((d == LocalValue || d == OwnedBy) && " expected value or owned" );
110
- val.setPointerAndInt (v, LocalValue );
114
+ val.setPointerAndInt (v, d );
111
115
}
112
116
113
117
static constexpr int KindBits = 3 ;
@@ -845,6 +849,27 @@ void LifetimeCheckPass::checkMoveAssignment(CallOp callOp,
845
849
getPmap ()[src].clear (); // TODO: should we add null to 'src' pset?
846
850
}
847
851
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
+
848
873
void LifetimeCheckPass::checkCtor (CallOp callOp,
849
874
const clang::CXXConstructorDecl *ctor) {
850
875
// TODO: zero init
@@ -879,17 +904,17 @@ void LifetimeCheckPass::checkCtor(CallOp callOp,
879
904
return ;
880
905
}
881
906
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 ...
885
908
if (ctor->isCopyConstructor ()) {
909
+ llvm_unreachable (" NYI" );
910
+ }
911
+
912
+ if (isCtorInitFromOwner (callOp, ctor)) {
886
913
auto addr = callOp.getOperand (0 );
887
914
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 ;
893
918
}
894
919
}
895
920
0 commit comments