@@ -406,8 +406,9 @@ class SrcSafetyAnalysis {
406
406
const MCInst *FirstCheckerInst;
407
407
std::tie (CheckedReg, FirstCheckerInst) = CheckerSequenceInfo.at (&Point);
408
408
409
- // FirstCheckerInst should belong to the same basic block, meaning
410
- // it was deterministically processed a few steps before this instruction.
409
+ // FirstCheckerInst should belong to the same basic block (see the
410
+ // assertion in DataflowSrcSafetyAnalysis::run()), meaning it was
411
+ // deterministically processed a few steps before this instruction.
411
412
const SrcState &StateBeforeChecker =
412
413
getStateBefore (*FirstCheckerInst).get ();
413
414
if (StateBeforeChecker.SafeToDerefRegs [CheckedReg])
@@ -566,15 +567,19 @@ class DataflowSrcSafetyAnalysis
566
567
void run () override {
567
568
for (BinaryBasicBlock &BB : Func) {
568
569
if (auto CheckerInfo = BC.MIB ->getAuthCheckedReg (BB)) {
569
- MCInst *LastInstOfChecker = BB.getLastNonPseudoInstr ();
570
+ MCPhysReg CheckedReg = CheckerInfo->first ;
571
+ MCInst &FirstInst = *CheckerInfo->second ;
572
+ MCInst &LastInst = *BB.getLastNonPseudoInstr ();
570
573
LLVM_DEBUG ({
571
574
dbgs () << " Found pointer checking sequence in " << BB.getName ()
572
575
<< " :\n " ;
573
- traceReg (BC, " Checked register" , CheckerInfo-> first );
574
- traceInst (BC, " First instruction" , *CheckerInfo-> second );
575
- traceInst (BC, " Last instruction" , *LastInstOfChecker );
576
+ traceReg (BC, " Checked register" , CheckedReg );
577
+ traceInst (BC, " First instruction" , FirstInst );
578
+ traceInst (BC, " Last instruction" , LastInst );
576
579
});
577
- CheckerSequenceInfo[LastInstOfChecker] = *CheckerInfo;
580
+ assert (llvm::any_of (BB, [&](MCInst &I) { return &I == &FirstInst; }) &&
581
+ " Data-flow analysis expects the checker not to cross BBs" );
582
+ CheckerSequenceInfo[&LastInst] = *CheckerInfo;
578
583
}
579
584
}
580
585
DFParent::run ();
0 commit comments