================
@@ -202,53 +203,93 @@ class AnalysisImpl
return getLoans(getState(P), OID);
}
- llvm::SmallVector<OriginID>
- buildOriginFlowChain(ProgramPoint StartPoint, const OriginID StartOID,
- const LoanID TargetLoan) const {
+ llvm::SmallVector<OriginID> buildOriginFlowChain(ProgramPoint StartPoint,
+ const OriginID StartOID,
+ const LoanID TargetLoan,
+ const CFG *Cfg) const {
assert(getLoans(StartOID, StartPoint).contains(TargetLoan) &&
"TargetLoan must be present in the StartOID at the StartPoint");
- OriginID CurrOID = StartOID;
- llvm::SmallVector<OriginID> OriginFlowChain;
- llvm::ArrayRef<const Fact *> Facts =
FactMgr.getBlockContaining(StartPoint);
- const auto *StartIt = llvm::find(Facts, StartPoint);
- assert(StartIt != Facts.end());
-
- for (const Fact *F :
- llvm::reverse(llvm::make_range(Facts.begin(), StartIt))) {
- if (const auto *IF = F->getAs<IssueFact>())
- if (IF->getLoanID() == TargetLoan) {
- assert(IF->getOriginID() == CurrOID);
- return OriginFlowChain;
+ const auto ShouldTrack = [&](const CFGBlock *Block, OriginID StartOID) {
+ for (const Fact *F : llvm::reverse(FactMgr.getFacts(Block))) {
+ const auto *OFF = llvm::dyn_cast<OriginFlowFact>(F);
+ if (!OFF)
+ continue;
+ if (OFF->getDestOriginID() == StartOID) {
+ if (getLoans(StartOID, OFF).contains(TargetLoan))
+ return true;
+ return false;
}
+ }
+ return true;
+ };
----------------
usx95 wrote:
this can be replaced by checking `getLoans` at the last program point of the
block.
`getLoans(getOutState(Block), StartOID).contains(TargetLoan);`
Also inline this at callsite.
https://github.com/llvm/llvm-project/pull/204592
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits