diff --git a/include/phasar/PhasarLLVM/ControlFlow/Resolver/OTFResolver.h b/include/phasar/PhasarLLVM/ControlFlow/Resolver/OTFResolver.h index 5755c5207..13c75d8f3 100644 --- a/include/phasar/PhasarLLVM/ControlFlow/Resolver/OTFResolver.h +++ b/include/phasar/PhasarLLVM/ControlFlow/Resolver/OTFResolver.h @@ -35,16 +35,14 @@ class Value; namespace psr { -class LLVMBasedICFG; class LLVMTypeHierarchy; class OTFResolver : public Resolver { protected: - LLVMBasedICFG &ICF; LLVMAliasInfoRef PT; public: - OTFResolver(LLVMProjectIRDB &IRDB, LLVMTypeHierarchy &TH, LLVMBasedICFG &ICF, + OTFResolver(LLVMProjectIRDB &IRDB, LLVMTypeHierarchy &TH, LLVMAliasInfoRef PT); ~OTFResolver() override = default; diff --git a/include/phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h b/include/phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h index 58671342f..73adbd37e 100644 --- a/include/phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h +++ b/include/phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h @@ -36,7 +36,6 @@ namespace psr { class LLVMProjectIRDB; class LLVMTypeHierarchy; enum class CallGraphAnalysisType; -class LLVMBasedICFG; class LLVMPointsToInfo; [[nodiscard]] std::optional @@ -83,9 +82,10 @@ class Resolver { [[nodiscard]] virtual std::string str() const = 0; - static std::unique_ptr - create(CallGraphAnalysisType Ty, LLVMProjectIRDB *IRDB, LLVMTypeHierarchy *TH, - LLVMBasedICFG *ICF = nullptr, LLVMAliasInfoRef PT = nullptr); + static std::unique_ptr create(CallGraphAnalysisType Ty, + LLVMProjectIRDB *IRDB, + LLVMTypeHierarchy *TH, + LLVMAliasInfoRef PT = nullptr); }; } // namespace psr diff --git a/lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp b/lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp index eb7e8a0f6..c9c6cbfae 100644 --- a/lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp +++ b/lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp @@ -362,7 +362,7 @@ LLVMBasedICFG::LLVMBasedICFG(LLVMProjectIRDB *IRDB, PT = PTOwn.asRef(); } - auto CGRes = Resolver::create(CGType, IRDB, this->TH.get(), this, PT); + auto CGRes = Resolver::create(CGType, IRDB, this->TH.get(), PT); initialize(IRDB, *CGRes, EntryPoints, TH, S, IncludeGlobals); } diff --git a/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp b/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp index 347399716..3e9112add 100644 --- a/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp +++ b/lib/PhasarLLVM/ControlFlow/Resolver/OTFResolver.cpp @@ -36,8 +36,8 @@ using namespace psr; OTFResolver::OTFResolver(LLVMProjectIRDB &IRDB, LLVMTypeHierarchy &TH, - LLVMBasedICFG &ICF, LLVMAliasInfoRef PT) - : Resolver(IRDB, TH), ICF(ICF), PT(PT) {} + LLVMAliasInfoRef PT) + : Resolver(IRDB, TH), PT(PT) {} void OTFResolver::preCall(const llvm::Instruction *Inst) {} @@ -60,7 +60,7 @@ void OTFResolver::handlePossibleTargets(const llvm::CallBase *CallSite, } // handle return value if (CalleeTarget->getReturnType()->isPointerTy()) { - for (const auto &ExitPoint : ICF.getExitPointsOf(CalleeTarget)) { + for (const auto &ExitPoint : psr::getAllExitPoints(CalleeTarget)) { // get the function's return value if (const auto *Ret = llvm::dyn_cast(ExitPoint)) { // introduce alias to the returned value diff --git a/lib/PhasarLLVM/ControlFlow/Resolver/RTAResolver.cpp b/lib/PhasarLLVM/ControlFlow/Resolver/RTAResolver.cpp index 2f0b883e1..817f9a209 100644 --- a/lib/PhasarLLVM/ControlFlow/Resolver/RTAResolver.cpp +++ b/lib/PhasarLLVM/ControlFlow/Resolver/RTAResolver.cpp @@ -99,8 +99,6 @@ void RTAResolver::resolveAllocatedStructTypes() { } llvm::DenseSet AllocatedStructTypes; - const llvm::StringSet<> MemAllocatingFunctions = {"_Znwm", "_Znam", "malloc", - "calloc", "realloc"}; for (const auto *Fun : IRDB.getAllFunctions()) { for (const auto &Inst : llvm::instructions(Fun)) { @@ -114,8 +112,7 @@ void RTAResolver::resolveAllocatedStructTypes() { // check if an instance of a user-defined type is allocated on the // heap - if (!MemAllocatingFunctions.contains( - CallSite->getCalledFunction()->getName())) { + if (!isHeapAllocatingFunction(CallSite->getCalledFunction())) { continue; } /// TODO: Does this iteration over the users make sense? diff --git a/lib/PhasarLLVM/ControlFlow/Resolver/Resolver.cpp b/lib/PhasarLLVM/ControlFlow/Resolver/Resolver.cpp index fbb08a957..0beb6d174 100644 --- a/lib/PhasarLLVM/ControlFlow/Resolver/Resolver.cpp +++ b/lib/PhasarLLVM/ControlFlow/Resolver/Resolver.cpp @@ -145,7 +145,7 @@ auto Resolver::resolveFunctionPointer(const llvm::CallBase *CallSite) FunctionSetTy CalleeTargets; for (const auto *F : IRDB.getAllFunctions()) { - if (isConsistentCall(CallSite, F)) { + if (F->hasAddressTaken() && isConsistentCall(CallSite, F)) { CalleeTargets.insert(F); } } @@ -158,7 +158,6 @@ void Resolver::otherInst(const llvm::Instruction *Inst) {} std::unique_ptr Resolver::create(CallGraphAnalysisType Ty, LLVMProjectIRDB *IRDB, LLVMTypeHierarchy *TH, - LLVMBasedICFG *ICF, LLVMAliasInfoRef PT) { assert(IRDB != nullptr); @@ -179,9 +178,8 @@ std::unique_ptr Resolver::create(CallGraphAnalysisType Ty, "The VTA callgraph algorithm is not implemented yet"); case CallGraphAnalysisType::OTF: assert(TH != nullptr); - assert(ICF != nullptr); assert(PT); - return std::make_unique(*IRDB, *TH, *ICF, PT); + return std::make_unique(*IRDB, *TH, PT); case CallGraphAnalysisType::Invalid: llvm::report_fatal_error("Invalid callgraph algorithm specified"); }