================
@@ -247,4 +247,40 @@ LoanPropagationAnalysis::~LoanPropagationAnalysis() = 
default;
 LoanSet LoanPropagationAnalysis::getLoans(OriginID OID, ProgramPoint P) const {
   return PImpl->getLoans(OID, P);
 }
+
+llvm::SmallVector<OriginID> LoanPropagationAnalysis::buildOriginFlowChain(
+    const FactManager &FactMgr, ProgramPoint StartPoint,
+    const OriginID StartOID, const LoanID TargetLoan) 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);
+
+  for (const Fact *F : llvm::reverse(Facts)) {
+    if (const auto *IF = F->getAs<IssueFact>())
+      if (IF->getLoanID() == TargetLoan && IF->getOriginID() == CurrOID)
+        return OriginFlowChain;
+
+    const auto *OFF = F->getAs<OriginFlowFact>();
+    if (!OFF)
+      continue;
+    if (OFF->getDestOriginID() != CurrOID)
+      continue;
+
+    const OriginID SrcOriginID = OFF->getSrcOriginID();
+    if (!getLoans(SrcOriginID, OFF).contains(TargetLoan))
+      continue;
+    OriginFlowChain.push_back(SrcOriginID);
+    CurrOID = SrcOriginID;
+  }
+
+  // FIXME: Ideally, this return is unreachable and should be an assert because
+  // we expect to return via IssueFact. But since current traversal is limited
+  // to a single CFG block, multi-block OriginFlowChain construction might miss
+  // the IssueFact.
+  // We should add llvm_unreachable here once multi-block support is 
implemented
----------------
usx95 wrote:

nit: end comment with a full stop.

https://github.com/llvm/llvm-project/pull/196075
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to