Skip to content

Commit 38770e8

Browse files
bcardosolopeslanza
authored andcommitted
[CIR][Lifetime] Use ownedby generation and add more consistency checks
1 parent ba1ccdb commit 38770e8

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
163163
return val.getPointer();
164164
}
165165

166-
void dump(llvm::raw_ostream &OS = llvm::errs());
166+
void dump(llvm::raw_ostream &OS = llvm::errs(), int ownedGen = 0);
167167

168168
static State getInvalid() { return {Invalid}; }
169169
static State getNullPtr() { return {NullPtr}; }
@@ -1121,8 +1121,6 @@ void LifetimeCheckPass::checkCall(CallOp callOp) {
11211121
// o’s first non-const use pset(o) becomes {o__2'}, on o’s second non-const
11221122
// use pset(o) becomes {o__3'}, and so on.
11231123
incOwner(ownerAddr);
1124-
// markPsetInvalid(addr, InvalidStyle::NonConstUseOfOwner,
1125-
// callOp.getLoc());
11261124
return;
11271125
}
11281126

@@ -1209,7 +1207,7 @@ void LifetimeCheckPass::LexicalScopeContext::dumpLocalValues() {
12091207
llvm::errs() << "}\n";
12101208
}
12111209

1212-
void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS) {
1210+
void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS, int ownedGen) {
12131211
switch (val.getInt()) {
12141212
case Invalid:
12151213
OS << "invalid";
@@ -1224,7 +1222,8 @@ void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS) {
12241222
OS << getVarNameFromValue(val.getPointer());
12251223
break;
12261224
case OwnedBy:
1227-
OS << getVarNameFromValue(val.getPointer()) << "'";
1225+
ownedGen++; // Start from 1.
1226+
OS << getVarNameFromValue(val.getPointer()) << "__" << ownedGen << "'";
12281227
break;
12291228
default:
12301229
llvm_unreachable("Not handled");
@@ -1235,7 +1234,10 @@ void LifetimeCheckPass::printPset(PSetType &pset, llvm::raw_ostream &OS) {
12351234
OS << "{ ";
12361235
auto size = pset.size();
12371236
for (auto s : pset) {
1238-
s.dump(OS);
1237+
int ownerGen = 0;
1238+
if (s.isOwnedBy())
1239+
ownerGen = owners[s.getData()];
1240+
s.dump(OS, ownerGen);
12391241
size--;
12401242
if (size > 0)
12411243
OS << ", ";

clang/test/CIR/Transforms/lifetime-check-owner.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ void yolo() {
2222
{
2323
MyIntOwner o(1);
2424
p = o;
25-
*p = 3; // expected-remark {{pset => { o' }}}
25+
*p = 3; // expected-remark {{pset => { o__1' }}}
2626
} // expected-note {{pointee 'o' invalidated at end of scope}}
2727
*p = 4; // expected-warning {{use of invalid pointer 'p'}}
2828
// expected-remark@-1 {{pset => { invalid }}}
@@ -33,7 +33,13 @@ void yolo2() {
3333
MyIntOwner o(1);
3434
p = o;
3535
(void)o.read();
36+
(void)p.read(); // expected-remark {{pset => { o__1' }}}
3637
o.changeInt(42); // expected-note {{invalidated by non-const use of owner type}}
3738
(void)p.read(); // expected-warning {{use of invalid pointer 'p'}}
3839
// expected-remark@-1 {{pset => { invalid }}}
40+
p = o;
41+
(void)p.read(); // expected-remark {{pset => { o__2' }}}
42+
o.changeInt(33); // expected-note {{invalidated by non-const use of owner type}}
43+
(void)p.read(); // expected-warning {{use of invalid pointer 'p'}}
44+
// expected-remark@-1 {{pset => { invalid }}}
3945
}

0 commit comments

Comments
 (0)