================
@@ -0,0 +1,49 @@
+//===- OriginFlowChain.cpp - C++ Lifetime Safety Checker --------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements buildOriginFlowChain.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Analysis/Analyses/LifetimeSafety/OriginFlowChain.h"
+
+namespace clang::lifetimes::internal {
+llvm::SmallVector<OriginID> buildOriginFlowChain(
+    const FactManager &FactMgr, const LoanPropagationAnalysis &LoanPropagation,
+    ProgramPoint StartPoint, const OriginID StartOID, const LoanID TargetLoan) 
{
+
+  const auto hasLoanAtOrigin = [&LoanPropagation](OriginID OID, LoanID LID,
+                                                  ProgramPoint CurrPoint) {
+    return LoanPropagation.getLoans(OID, CurrPoint).contains(LID);
+  };
+
+  assert(hasLoanAtOrigin(StartOID, TargetLoan, StartPoint) &&
+         "TargetLoan must be present in the initial propagation point");
+
+  OriginID CurrOID = StartOID;
+  llvm::SmallVector<OriginID> AssignmentList;
+  llvm::ArrayRef<const Fact *> Facts = FactMgr.getBlockContaining(StartPoint);
+
+  for (const Fact *F : llvm::reverse(Facts)) {
+    if (const auto *OFF = F->getAs<OriginFlowFact>()) {
+      const OriginID SrcOriginID = OFF->getSrcOriginID();
+      if (OFF->getDestOriginID() != CurrOID)
+        continue;
+      if (!hasLoanAtOrigin(SrcOriginID, TargetLoan, OFF))
+        continue;
+      AssignmentList.push_back(SrcOriginID);
+      CurrOID = SrcOriginID;
+    } else if (const auto *IF = F->getAs<IssueFact>()) {
+      if (IF->getLoanID() == TargetLoan)
+        return AssignmentList;
+    }
+  }
+
+  return AssignmentList;
----------------
NeKon69 wrote:

Yeah, that's what I was talking about. I think an assert would be better here 
since this should never happen.

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