Skip to content

Commit f442472

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

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
@@ -160,7 +160,7 @@ struct LifetimeCheckPass : public LifetimeCheckBase<LifetimeCheckPass> {
160160
return val.getPointer();
161161
}
162162

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

165165
static State getInvalid() { return {Invalid}; }
166166
static State getNullPtr() { return {NullPtr}; }
@@ -1119,8 +1119,6 @@ void LifetimeCheckPass::checkCall(CallOp callOp) {
11191119
// o’s first non-const use pset(o) becomes {o__2'}, on o’s second non-const
11201120
// use pset(o) becomes {o__3'}, and so on.
11211121
incOwner(ownerAddr);
1122-
// markPsetInvalid(addr, InvalidStyle::NonConstUseOfOwner,
1123-
// callOp.getLoc());
11241122
return;
11251123
}
11261124

@@ -1207,7 +1205,7 @@ void LifetimeCheckPass::LexicalScopeContext::dumpLocalValues() {
12071205
llvm::errs() << "}\n";
12081206
}
12091207

1210-
void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS) {
1208+
void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS, int ownedGen) {
12111209
switch (val.getInt()) {
12121210
case Invalid:
12131211
OS << "invalid";
@@ -1222,7 +1220,8 @@ void LifetimeCheckPass::State::dump(llvm::raw_ostream &OS) {
12221220
OS << getVarNameFromValue(val.getPointer());
12231221
break;
12241222
case OwnedBy:
1225-
OS << getVarNameFromValue(val.getPointer()) << "'";
1223+
ownedGen++; // Start from 1.
1224+
OS << getVarNameFromValue(val.getPointer()) << "__" << ownedGen << "'";
12261225
break;
12271226
default:
12281227
llvm_unreachable("Not handled");
@@ -1233,7 +1232,10 @@ void LifetimeCheckPass::printPset(PSetType &pset, llvm::raw_ostream &OS) {
12331232
OS << "{ ";
12341233
auto size = pset.size();
12351234
for (auto s : pset) {
1236-
s.dump(OS);
1235+
int ownerGen = 0;
1236+
if (s.isOwnedBy())
1237+
ownerGen = owners[s.getData()];
1238+
s.dump(OS, ownerGen);
12371239
size--;
12381240
if (size > 0)
12391241
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)