2727#include " SVF-LLVM/LLVMModule.h"
2828#include " SVF-LLVM/SVFIRBuilder.h"
2929#include " SVFIR/SVFIR.h"
30- #include " SVFIR/SVFModule.h"
3130#include " SVFIR/SVFType.h"
3231#include " Util/GeneralType.h"
3332#include " WPA/Andersen.h"
3635#include < memory>
3736#include < optional>
3837
39- namespace psr {
38+ using namespace psr ;
39+
40+ namespace {
41+
4042static constexpr psr::AliasResult
4143translateSVFAliasResult (SVF::AliasResult AR) noexcept {
4244 switch (AR) {
@@ -55,13 +57,14 @@ static psr::AliasResult doAliasImpl(SVF::PointerAnalysis *AA,
5557 const llvm::Value *V,
5658 const llvm::Value *Rep) {
5759 auto *ModSet = SVF::LLVMModuleSet::getLLVMModuleSet ();
58- auto *Nod1 = ModSet->getSVFValue (V);
59- auto *Nod2 = ModSet->getSVFValue (Rep);
6060
61- if (!Nod1 || !Nod2 ) {
61+ if (!ModSet-> hasValueNode (V) || !ModSet-> hasValueNode (Rep) ) {
6262 return AliasResult::MayAlias;
6363 }
6464
65+ auto Nod1 = getNodeId (V, *ModSet);
66+ auto Nod2 = getNodeId (Rep, *ModSet);
67+
6568 return translateSVFAliasResult (AA->alias (Nod1, Nod2));
6669}
6770
@@ -74,13 +77,12 @@ static psr::AliasResult aliasImpl(SVF::PointerAnalysis *AA,
7477// NOLINTNEXTLINE(cppcoreguidelines-special-member-functions)
7578class SVFAliasAnalysisBase : public AliasAnalysisView {
7679public:
77- SVFAliasAnalysisBase (SVF::SVFModule *Mod, AliasAnalysisType PATy)
78- : AliasAnalysisView(PATy), IRBuilder(Mod), PAG(IRBuilder.build()) {}
80+ SVFAliasAnalysisBase (AliasAnalysisType PATy)
81+ : AliasAnalysisView(PATy), PAG(IRBuilder.build()) {}
7982
8083 ~SVFAliasAnalysisBase () override {
8184 SVF::SVFIR::releaseSVFIR ();
8285 SVF::AndersenWaveDiff::releaseAndersenWaveDiff ();
83- SVF::SymbolTableInfo::releaseSymbolInfo ();
8486 SVF::LLVMModuleSet::releaseLLVMModuleSet ();
8587 }
8688
@@ -95,8 +97,8 @@ class SVFAliasAnalysisBase : public AliasAnalysisView {
9597
9698class SVFVFSAnalysis : public SVFAliasAnalysisBase {
9799public:
98- SVFVFSAnalysis (SVF::SVFModule *Mod )
99- : SVFAliasAnalysisBase(Mod, AliasAnalysisType::SVFVFS),
100+ SVFVFSAnalysis ()
101+ : SVFAliasAnalysisBase(AliasAnalysisType::SVFVFS),
100102 // Note: We must use the static createVFSWPA() function, otherwise SVF
101103 // will leak memory
102104 VFS (SVF::VersionedFlowSensitive::createVFSWPA(PAG)) {}
@@ -121,9 +123,8 @@ class SVFVFSAnalysis : public SVFAliasAnalysisBase {
121123
122124class SVFDDAAnalysis : public SVFAliasAnalysisBase {
123125public:
124- SVFDDAAnalysis (SVF::SVFModule *Mod)
125- : SVFAliasAnalysisBase(Mod, AliasAnalysisType::SVFVFS), Client(Mod) {
126- Client.initialise (Mod);
126+ SVFDDAAnalysis () : SVFAliasAnalysisBase(AliasAnalysisType::SVFVFS) {
127+ Client.initialise ();
127128 DDA.emplace (PAG, &Client);
128129 DDA->initialize ();
129130 Client.answerQueries (&*DDA);
@@ -149,28 +150,6 @@ class SVFDDAAnalysis : public SVFAliasAnalysisBase {
149150 mutable std::optional<SVF::ContextDDA> DDA;
150151};
151152
152- } // namespace psr
153-
154- auto psr::createSVFVFSAnalysis (LLVMProjectIRDB &IRDB)
155- -> std::unique_ptr<AliasAnalysisView> {
156-
157- return std::make_unique<SVFVFSAnalysis>(psr::initSVFModule (IRDB));
158- }
159-
160- auto psr::createSVFDDAAnalysis (LLVMProjectIRDB &IRDB)
161- -> std::unique_ptr<AliasAnalysisView> {
162-
163- return std::make_unique<SVFDDAAnalysis>(psr::initSVFModule (IRDB));
164- }
165-
166- namespace psr {
167-
168- class SVFAliasInfoImpl ;
169-
170- template <>
171- struct AliasInfoTraits <SVFAliasInfoImpl>
172- : DefaultAATraits<const llvm::Value *, const llvm::Instruction *> {};
173-
174153class SVFAliasInfoImpl
175154 : public SVFDDAAnalysis,
176155 public AnalysisPropertiesMixin<SVFAliasInfoImpl>,
@@ -217,9 +196,7 @@ class SVFAliasInfoImpl
217196 Ret = Set;
218197
219198 auto *ModSet = SVF::LLVMModuleSet::getLLVMModuleSet ();
220- auto *Nod = ModSet->getSVFValue (Ptr);
221-
222- auto PointerNod = PAG->getValueNode (Nod);
199+ auto PointerNod = getNodeId (Ptr, *ModSet);
223200
224201 createAliasSet (PointerNod, *Set, *ModSet);
225202
@@ -235,7 +212,7 @@ class SVFAliasInfoImpl
235212 }
236213
237214 auto &ModSet = *SVF::LLVMModuleSet::getLLVMModuleSet ();
238- auto Nod = getNodeId (Ptr, ModSet, *PAG );
215+ auto Nod = getNodeId (Ptr, ModSet);
239216 const auto &Pts = getPTA ().getPts (Nod);
240217
241218 const auto *VFun = AliasInfoBaseUtils::retrieveFunction (Ptr);
@@ -267,14 +244,14 @@ class SVFAliasInfoImpl
267244 }
268245
269246 auto &ModSet = *SVF::LLVMModuleSet::getLLVMModuleSet ();
270- auto Nod = getNodeId (Ptr, ModSet, *PAG );
247+ auto Nod = getNodeId (Ptr, ModSet);
271248
272249 if (IntraProcOnly && llvm::isa<llvm::Argument>(AllocSite)) {
273- auto AllocSiteNod = getNodeId (AllocSite, ModSet, *PAG );
250+ auto AllocSiteNod = getNodeId (AllocSite, ModSet);
274251 return getPTA ().alias (Nod, AllocSiteNod) != SVF::NoAlias;
275252 }
276253
277- auto AllocSiteNod = getObjNodeId (AllocSite, ModSet, *PAG );
254+ auto AllocSiteNod = getObjNodeId (AllocSite, ModSet);
278255 const auto &Pts = getPTA ().getPts (Nod);
279256
280257 return Pts.test (AllocSiteNod);
@@ -285,11 +262,7 @@ class SVFAliasInfoImpl
285262
286263 auto &ModSet = *SVF::LLVMModuleSet::getLLVMModuleSet ();
287264 for (const auto &[Nod, Var] : *PAG) {
288- if (!Var->hasValue ()) {
289- continue ;
290- }
291-
292- const auto *PointerVal = ModSet.getLLVMValue (Var->getValue ());
265+ const auto *PointerVal = svfVarToLLVMOrNull (Var, ModSet);
293266 if (!PointerVal) {
294267 continue ;
295268 }
@@ -352,8 +325,27 @@ class SVFAliasInfoImpl
352325 AliasSetOwner<AliasSetTy>::memory_resource_type MRes;
353326 AliasSetOwner<AliasSetTy> Owner{&MRes};
354327};
328+ } // namespace
329+
330+ namespace psr {
331+ template <>
332+ struct AliasInfoTraits <SVFAliasInfoImpl>
333+ : DefaultAATraits<const llvm::Value *, const llvm::Instruction *> {};
355334} // namespace psr
356335
336+ auto psr::createSVFVFSAnalysis (LLVMProjectIRDB &IRDB)
337+ -> std::unique_ptr<AliasAnalysisView> {
338+ psr::initSVFModule (IRDB);
339+ return std::make_unique<SVFVFSAnalysis>();
340+ }
341+
342+ auto psr::createSVFDDAAnalysis (LLVMProjectIRDB &IRDB)
343+ -> std::unique_ptr<AliasAnalysisView> {
344+ psr::initSVFModule (IRDB);
345+ return std::make_unique<SVFDDAAnalysis>();
346+ }
347+
357348auto psr::createLLVMSVFDDAAliasInfo (LLVMProjectIRDB &IRDB) -> LLVMAliasInfo {
358- return std::make_unique<SVFAliasInfoImpl>(psr::initSVFModule (IRDB));
349+ psr::initSVFModule (IRDB);
350+ return std::make_unique<SVFAliasInfoImpl>();
359351}
0 commit comments