@@ -111,13 +111,6 @@ struct State {
111
111
// / for validity. If this is a linear typed value, return true. Return false
112
112
// / otherwise.
113
113
bool checkDataflowEndState (DeadEndBlocks &deBlocks);
114
-
115
- // / Depending on our initialization, either return false or call Func and
116
- // / throw an error.
117
- bool handleError (llvm::function_ref<void ()> &&messagePrinterFunc) {
118
- error.handleError (std::move (messagePrinterFunc));
119
- return false ;
120
- }
121
114
};
122
115
123
116
} // end anonymous namespace
@@ -210,7 +203,7 @@ void State::initializeConsumingUse(BranchPropagatedUser consumingUser,
210
203
if (blocksWithConsumingUses.insert (userBlock).second )
211
204
return ;
212
205
213
- handleError ([&] {
206
+ error. handleOverConsume ([&] {
214
207
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
215
208
<< " Found over consume?!\n "
216
209
<< " Value: " << *value << " User: " << *consumingUser
@@ -235,7 +228,7 @@ void State::checkForSameBlockUseAfterFree(BranchPropagatedUser consumingUser,
235
228
// always consider the non-consuming use to be a use after free since
236
229
// the cond branch user is in a previous block. So just bail early.
237
230
if (consumingUser.isCondBranchUser ()) {
238
- handleError ([&]() {
231
+ error. handleUseAfterFree ([&]() {
239
232
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
240
233
<< " Found use after free?!\n "
241
234
<< " Value: " << *value
@@ -262,7 +255,7 @@ void State::checkForSameBlockUseAfterFree(BranchPropagatedUser consumingUser,
262
255
[&nonConsumingUser](const SILInstruction &i) -> bool {
263
256
return nonConsumingUser == &i;
264
257
}) != userBlock->end ()) {
265
- handleError ([&] {
258
+ error. handleUseAfterFree ([&] {
266
259
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
267
260
<< " Found use after free?!\n "
268
261
<< " Value: " << *value
@@ -283,24 +276,29 @@ bool State::checkPredsForDoubleConsume(BranchPropagatedUser consumingUser,
283
276
if (!blocksWithConsumingUses.count (userBlock))
284
277
return false ;
285
278
286
- return ! handleError ([&] {
279
+ error. handleOverConsume ([&] {
287
280
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
288
281
<< " Found over consume?!\n "
289
282
<< " Value: " << *value << " User: " << *consumingUser
290
283
<< " Block: bb" << userBlock->getDebugID () << " \n\n " ;
291
284
});
285
+
286
+ // If we reached this point, then we did not assert, but we did flag an
287
+ // error. Return true so we continue the walk.
288
+ return true ;
292
289
}
293
290
294
291
bool State::checkPredsForDoubleConsume (SILBasicBlock *userBlock) {
295
292
if (!blocksWithConsumingUses.count (userBlock))
296
293
return false ;
297
294
298
- return ! handleError ([&] {
295
+ error. handleOverConsume ([&] {
299
296
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
300
297
<< " Found over consume?!\n "
301
298
<< " Value: " << *value << " Block: bb"
302
299
<< userBlock->getDebugID () << " \n\n " ;
303
300
});
301
+ return true ;
304
302
}
305
303
306
304
// ===----------------------------------------------------------------------===//
@@ -367,8 +365,11 @@ bool State::performDataflow(DeadEndBlocks &deBlocks) {
367
365
//
368
366
// 2. We add the predecessor to the worklist if we have not visited it yet.
369
367
for (auto *predBlock : block->getPredecessorBlocks ()) {
368
+ // Check if we have an over consume.
370
369
if (checkPredsForDoubleConsume (predBlock)) {
371
- return handleError ([] {});
370
+ // If we were to assert, it is handled inside check preds for double
371
+ // consume. So just return false so that we bail.
372
+ return false ;
372
373
}
373
374
374
375
if (visitedBlocks.count (predBlock)) {
@@ -397,7 +398,7 @@ bool State::checkDataflowEndState(DeadEndBlocks &deBlocks) {
397
398
}
398
399
399
400
// If we are supposed to error on leaks, do so now.
400
- error.handleLeakError ([&] {
401
+ error.handleLeak ([&] {
401
402
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
402
403
<< " Error! Found a leak due to a consuming post-dominance "
403
404
" failure!\n "
@@ -427,7 +428,7 @@ bool State::checkDataflowEndState(DeadEndBlocks &deBlocks) {
427
428
continue ;
428
429
}
429
430
430
- return handleError ([&] {
431
+ error. handleUseAfterFree ([&] {
431
432
llvm::errs () << " Function: '" << value->getFunction ()->getName () << " '\n "
432
433
<< " Found use after free due to unvisited non lifetime "
433
434
" ending uses?!\n "
@@ -438,6 +439,7 @@ bool State::checkDataflowEndState(DeadEndBlocks &deBlocks) {
438
439
}
439
440
llvm::errs () << " \n " ;
440
441
});
442
+ return false ;
441
443
}
442
444
443
445
// If all of our remaining blocks were dead uses, then return true. We are
0 commit comments