From a3ecbcb8a9d26d1a09a724626ce19d6afa1fbbd0 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 14 Apr 2023 14:53:09 +0200 Subject: [PATCH 1/6] Remove deprecated CFLAnders and CFLSteens AliasAnalyses due to https://reviews.llvm.org/D139703 --- include/phasar/PhasarLLVM/HelperAnalyses.h | 3 +- .../phasar/PhasarLLVM/HelperAnalysisConfig.h | 2 - .../PhasarLLVM/Pointer/LLVMAliasGraph.h | 6 +-- .../phasar/PhasarLLVM/Pointer/LLVMAliasSet.h | 20 +++++++--- .../Pointer/LLVMBasedAliasAnalysis.h | 12 +----- include/phasar/Pointer/AliasAnalysisType.h | 23 ------------ include/phasar/Pointer/AliasInfo.h | 9 ----- include/phasar/Pointer/AliasInfoBase.h | 7 ++-- lib/PhasarLLVM/HelperAnalyses.cpp | 13 +++---- lib/PhasarLLVM/Pointer/LLVMAliasGraph.cpp | 9 +---- lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp | 16 ++++++-- .../Pointer/LLVMBasedAliasAnalysis.cpp | 27 ++++++-------- lib/Pointer/AliasAnalysisType.cpp | 37 ------------------- tools/phasar-cli/phasar-cli.cpp | 26 +------------ 14 files changed, 54 insertions(+), 156 deletions(-) delete mode 100644 include/phasar/Pointer/AliasAnalysisType.h delete mode 100644 lib/Pointer/AliasAnalysisType.cpp diff --git a/include/phasar/PhasarLLVM/HelperAnalyses.h b/include/phasar/PhasarLLVM/HelperAnalyses.h index 07b09878d..932206aba 100644 --- a/include/phasar/PhasarLLVM/HelperAnalyses.h +++ b/include/phasar/PhasarLLVM/HelperAnalyses.h @@ -31,7 +31,7 @@ class HelperAnalyses { // NOLINT(cppcoreguidelines-special-member-functions) public: explicit HelperAnalyses(std::string IRFile, std::optional PrecomputedPTS, - AliasAnalysisType PTATy, bool AllowLazyPTS, + bool AllowLazyPTS, std::vector EntryPoints, CallGraphAnalysisType CGTy, Soundness SoundnessLevel, bool AutoGlobalSupport) noexcept; @@ -65,7 +65,6 @@ class HelperAnalyses { // NOLINT(cppcoreguidelines-special-member-functions) // PTS std::optional PrecomputedPTS; - AliasAnalysisType PTATy{}; bool AllowLazyPTS{}; // ICF diff --git a/include/phasar/PhasarLLVM/HelperAnalysisConfig.h b/include/phasar/PhasarLLVM/HelperAnalysisConfig.h index d35195e76..f59c80812 100644 --- a/include/phasar/PhasarLLVM/HelperAnalysisConfig.h +++ b/include/phasar/PhasarLLVM/HelperAnalysisConfig.h @@ -11,7 +11,6 @@ #define PHASAR_PHASARLLVM_ANALYSISSTRATEGY_HELPERANALYSISCONFIG_H #include "phasar/ControlFlow/CallGraphAnalysisType.h" -#include "phasar/Pointer/AliasAnalysisType.h" #include "phasar/Utils/Soundness.h" #include "nlohmann/json.hpp" @@ -21,7 +20,6 @@ namespace psr { struct HelperAnalysisConfig { std::optional PrecomputedPTS = std::nullopt; - AliasAnalysisType PTATy = AliasAnalysisType::CFLAnders; CallGraphAnalysisType CGTy = CallGraphAnalysisType::OTF; Soundness SoundnessLevel = Soundness::Soundy; bool AutoGlobalSupport = true; diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMAliasGraph.h b/include/phasar/PhasarLLVM/Pointer/LLVMAliasGraph.h index c266980b1..4b50f2740 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMAliasGraph.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMAliasGraph.h @@ -126,9 +126,7 @@ class LLVMAliasGraph : public AnalysisPropertiesMixin, * considered. False, if May and Must Aliases should be * considered. */ - explicit LLVMAliasGraph( - LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true, - AliasAnalysisType PATy = AliasAnalysisType::CFLAnders); + explicit LLVMAliasGraph(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true); /** * @brief Returns true if graph contains 0 nodes. @@ -212,8 +210,6 @@ class LLVMAliasGraph : public AnalysisPropertiesMixin, [[nodiscard]] bool isInterProcedural() const noexcept; - [[nodiscard]] AliasAnalysisType getAliasAnalysisType() const noexcept; - AliasResult alias(const llvm::Value *V1, const llvm::Value *V2, const llvm::Instruction *I = nullptr); diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h b/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h index 0775e98d2..4ad8c6212 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h @@ -58,8 +58,7 @@ class LLVMAliasSet : public AnalysisPropertiesMixin, * UseLazyEvaluation is true, computes points-to-sets for functions that do * not use global variables on the fly */ - explicit LLVMAliasSet(LLVMProjectIRDB *IRDB, bool UseLazyEvaluation = true, - AliasAnalysisType PATy = AliasAnalysisType::CFLAnders); + explicit LLVMAliasSet(LLVMProjectIRDB *IRDB, bool UseLazyEvaluation = true); explicit LLVMAliasSet(LLVMProjectIRDB *IRDB, const nlohmann::json &SerializedPTS); @@ -68,10 +67,6 @@ class LLVMAliasSet : public AnalysisPropertiesMixin, return false; }; - [[nodiscard]] inline AliasAnalysisType getAliasAnalysisType() const noexcept { - return PTA.getPointerAnalysisType(); - }; - [[nodiscard]] AliasResult alias(const llvm::Value *V1, const llvm::Value *V2, const llvm::Instruction *I = nullptr); @@ -158,6 +153,19 @@ class LLVMAliasSet : public AnalysisPropertiesMixin, }; static_assert(IsAliasInfo); +using TTTT = decltype(detail::testAliasInfo( + std::declval(), std::declval())); + +using TTTT2 = std::void_t< + decltype(std::declval().print(llvm::outs())), + decltype(std::declval().printAsJson(llvm::outs())), + decltype(std::declval().mergeWith( + std::declval())), + decltype(std::declval().introduceAlias( + std::declval::v_t>(), + std::declval::v_t>(), + std::declval::n_t>(), + AliasResult{}))>; } // namespace psr diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h index e724a0c4d..87da4d71f 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h @@ -10,8 +10,6 @@ #ifndef PHASAR_PHASARLLVM_POINTER_LLVMBASEDALIASANALYSIS_H_ #define PHASAR_PHASARLLVM_POINTER_LLVMBASEDALIASANALYSIS_H_ -#include "phasar/Pointer/AliasAnalysisType.h" - #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/IR/PassManager.h" #include "llvm/Passes/PassBuilder.h" @@ -29,19 +27,17 @@ class LLVMProjectIRDB; class LLVMBasedAliasAnalysis { private: llvm::PassBuilder PB; - llvm::AAManager AA; + llvm::FunctionAnalysisManager FAM; llvm::FunctionPassManager FPM; llvm::DenseMap AAInfos; - AliasAnalysisType PATy; [[nodiscard]] bool hasAliasInfo(const llvm::Function &Fun) const; void computeAliasInfo(llvm::Function &Fun); public: - LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true, - AliasAnalysisType PATy = AliasAnalysisType::CFLAnders); + LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true); ~LLVMBasedAliasAnalysis() = default; @@ -57,10 +53,6 @@ class LLVMBasedAliasAnalysis { void erase(llvm::Function *F); void clear(); - - [[nodiscard]] inline AliasAnalysisType getPointerAnalysisType() const { - return PATy; - }; }; } // namespace psr diff --git a/include/phasar/Pointer/AliasAnalysisType.h b/include/phasar/Pointer/AliasAnalysisType.h deleted file mode 100644 index c05177920..000000000 --- a/include/phasar/Pointer/AliasAnalysisType.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef PHASAR_PHASARLLVM_POINTER_ALIASANALYSISTYPE_H_ -#define PHASAR_PHASARLLVM_POINTER_ALIASANALYSISTYPE_H_ - -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/raw_ostream.h" - -#include - -namespace psr { -enum class AliasAnalysisType { -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, TYPE) NAME, -#include "phasar/Pointer/AliasAnalysisType.def" - Invalid -}; - -std::string toString(AliasAnalysisType PA); - -AliasAnalysisType toAliasAnalysisType(llvm::StringRef S); - -llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, AliasAnalysisType PA); -} // namespace psr - -#endif // PHASAR_PHASARLLVM_POINTER_ALIASANALYSISTYPE_H_ diff --git a/include/phasar/Pointer/AliasInfo.h b/include/phasar/Pointer/AliasInfo.h index eee1eca61..4babc6c7f 100644 --- a/include/phasar/Pointer/AliasInfo.h +++ b/include/phasar/Pointer/AliasInfo.h @@ -32,7 +32,6 @@ class Instruction; } // namespace llvm namespace psr { -enum class AliasAnalysisType; template class AliasInfoRef; template class AliasInfo; @@ -97,10 +96,6 @@ class AliasInfoRef : public AnalysisPropertiesMixin> { assert(VT != nullptr); return VT->IsInterProcedural(AA); } - [[nodiscard]] AliasAnalysisType getAliasAnalysisType() const noexcept { - assert(VT != nullptr); - return VT->GetAliasAnalysisType(AA); - } [[nodiscard]] AliasResult alias(ByConstRef Pointer1, ByConstRef Pointer2, @@ -189,7 +184,6 @@ class AliasInfoRef : public AnalysisPropertiesMixin> { private: struct VTable { bool (*IsInterProcedural)(const void *) noexcept; - AliasAnalysisType (*GetAliasAnalysisType)(const void *) noexcept; AliasResult (*Alias)(void *, ByConstRef, ByConstRef, ByConstRef); AliasSetPtrTy (*GetAliasSet)(void *, ByConstRef, ByConstRef); @@ -215,9 +209,6 @@ class AliasInfoRef : public AnalysisPropertiesMixin> { [](const void *AA) noexcept { return static_cast(AA)->isInterProcedural(); }, - [](const void *AA) noexcept { - return static_cast(AA)->getAliasAnalysisType(); - }, [](void *AA, ByConstRef Pointer1, ByConstRef Pointer2, ByConstRef AtInstruction) { return static_cast(AA)->alias(Pointer1, Pointer2, diff --git a/include/phasar/Pointer/AliasInfoBase.h b/include/phasar/Pointer/AliasInfoBase.h index ae0488651..3ca12f0aa 100644 --- a/include/phasar/Pointer/AliasInfoBase.h +++ b/include/phasar/Pointer/AliasInfoBase.h @@ -28,7 +28,6 @@ class Value; namespace psr { -enum class AliasAnalysisType; enum class AnalysisProperties; enum class AliasResult; @@ -45,8 +44,8 @@ auto testAliasInfo( const std::optional::n_t> &NT = {}, const std::optional::v_t> &VT = {}) -> decltype(std::make_tuple( - CAI.isInterProcedural(), CAI.getAliasAnalysisType(), - AI.alias(*VT, *VT, *NT), AI.getAliasSet(*VT, *NT), + CAI.isInterProcedural(), AI.alias(*VT, *VT, *NT), + AI.getAliasSet(*VT, *NT), AI.getReachableAllocationSites(*VT, true, *NT), AI.isInReachableAllocationSites(*VT, *VT, true, *NT), CAI.getAsJson(), CAI.getAnalysisProperties(), CAI.isContextSensitive(), @@ -65,7 +64,7 @@ struct IsAliasInfo< std::declval::n_t>(), AliasResult{}))>, std::enable_if_t::AliasSetPtrTy, typename AliasInfoTraits::AllocationSiteSetPtrTy, bool, nlohmann::json, AnalysisProperties, bool, bool, bool>, diff --git a/lib/PhasarLLVM/HelperAnalyses.cpp b/lib/PhasarLLVM/HelperAnalyses.cpp index 42700df9d..19b9d97e7 100644 --- a/lib/PhasarLLVM/HelperAnalyses.cpp +++ b/lib/PhasarLLVM/HelperAnalyses.cpp @@ -11,21 +11,21 @@ namespace psr { HelperAnalyses::HelperAnalyses(std::string IRFile, std::optional PrecomputedPTS, - AliasAnalysisType PTATy, bool AllowLazyPTS, + bool AllowLazyPTS, std::vector EntryPoints, CallGraphAnalysisType CGTy, Soundness SoundnessLevel, bool AutoGlobalSupport) noexcept : IRFile(std::move(IRFile)), PrecomputedPTS(std::move(PrecomputedPTS)), - PTATy(PTATy), AllowLazyPTS(AllowLazyPTS), - EntryPoints(std::move(EntryPoints)), CGTy(CGTy), - SoundnessLevel(SoundnessLevel), AutoGlobalSupport(AutoGlobalSupport) {} + AllowLazyPTS(AllowLazyPTS), EntryPoints(std::move(EntryPoints)), + CGTy(CGTy), SoundnessLevel(SoundnessLevel), + AutoGlobalSupport(AutoGlobalSupport) {} HelperAnalyses::HelperAnalyses(std::string IRFile, std::vector EntryPoints, HelperAnalysisConfig Config) noexcept : IRFile(std::move(IRFile)), - PrecomputedPTS(std::move(Config.PrecomputedPTS)), PTATy(Config.PTATy), + PrecomputedPTS(std::move(Config.PrecomputedPTS)), AllowLazyPTS(Config.AllowLazyPTS), EntryPoints(std::move(EntryPoints)), CGTy(Config.CGTy), SoundnessLevel(Config.SoundnessLevel), AutoGlobalSupport(Config.AutoGlobalSupport) {} @@ -54,8 +54,7 @@ LLVMAliasSet &HelperAnalyses::getAliasInfo() { if (PrecomputedPTS.has_value()) { PT = std::make_unique(&getProjectIRDB(), *PrecomputedPTS); } else { - PT = std::make_unique(&getProjectIRDB(), AllowLazyPTS, - PTATy); + PT = std::make_unique(&getProjectIRDB(), AllowLazyPTS); } } return *PT; diff --git a/lib/PhasarLLVM/Pointer/LLVMAliasGraph.cpp b/lib/PhasarLLVM/Pointer/LLVMAliasGraph.cpp index 7eb255bce..5c39e0f0d 100644 --- a/lib/PhasarLLVM/Pointer/LLVMAliasGraph.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMAliasGraph.cpp @@ -134,9 +134,8 @@ std::string LLVMAliasGraph::EdgeProperties::getValueAsString() const { // points-to graph stuff -LLVMAliasGraph::LLVMAliasGraph(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation, - AliasAnalysisType PATy) - : PTA(IRDB, UseLazyEvaluation, PATy) {} +LLVMAliasGraph::LLVMAliasGraph(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation) + : PTA(IRDB, UseLazyEvaluation) {} void LLVMAliasGraph::computeAliasGraph(const llvm::Value *V) { // FIXME when fixed in LLVM @@ -244,10 +243,6 @@ void LLVMAliasGraph::computeAliasGraph(llvm::Function *F) { bool LLVMAliasGraph::isInterProcedural() const noexcept { return false; } -AliasAnalysisType LLVMAliasGraph::getAliasAnalysisType() const noexcept { - return PTA.getPointerAnalysisType(); -} - AliasResult LLVMAliasGraph::alias(const llvm::Value *V1, const llvm::Value *V2, const llvm::Instruction * /*I*/) { computeAliasGraph(V1); diff --git a/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp b/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp index 2e7badc4d..644805005 100644 --- a/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp @@ -54,9 +54,8 @@ template class BoxedPtr; template class BoxedConstPtr; template class AliasSetOwner; -LLVMAliasSet::LLVMAliasSet(LLVMProjectIRDB *IRDB, bool UseLazyEvaluation, - AliasAnalysisType PATy) - : PTA(*IRDB, UseLazyEvaluation, PATy) { +LLVMAliasSet::LLVMAliasSet(LLVMProjectIRDB *IRDB, bool UseLazyEvaluation) + : PTA(*IRDB, UseLazyEvaluation) { assert(IRDB != nullptr); auto NumGlobals = IRDB->getNumGlobals(); @@ -447,7 +446,10 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { PHASAR_LOG_LEVEL_CAT(DEBUG, "LLVMAliasSet", "Analyzing function: " << F->getName()); + llvm::errs() << "> computeFunctionsAliasSet\n"; + llvm::AAResults &AA = *PTA.getAAResults(F); + llvm::errs() << "> after getAAResults()\n"; bool EvalAAMD = true; const llvm::DataLayout &DL = F->getParent()->getDataLayout(); @@ -461,6 +463,8 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { llvm::DenseSet UsedGlobals; for (auto &Inst : llvm::instructions(F)) { + llvm::errs() << "> Inst: " << Inst << '\n'; + if (Inst.getType()->isPointerTy()) { // Add all pointer instructions. addPointer(&Inst, Pointers); @@ -525,6 +529,8 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { } } + llvm::errs() << "Args\n"; + for (auto &I : F->args()) { if (I.getType()->isPointerTy()) { // Add all pointer arguments. @@ -534,13 +540,17 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { auto NumGlobals = UsedGlobals.size(); + llvm::errs() << "Globals\n"; Pointers.reserve(Pointers.size() + NumGlobals); for (const auto *Glob : UsedGlobals) { + llvm::errs() << "> " << *Glob << '\n'; addPointer(Glob, Pointers); } + llvm::errs() << "> erase()\n"; // we no longer need the LLVM representation PTA.erase(F); + llvm::errs() << "> done\n"; } AliasResult LLVMAliasSet::alias(const llvm::Value *V1, const llvm::Value *V2, diff --git a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp index 116fc022c..0e201f281 100644 --- a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp @@ -19,6 +19,7 @@ #include "llvm/Analysis/BasicAliasAnalysis.h" #include "llvm/Analysis/CFLAndersAliasAnalysis.h" #include "llvm/Analysis/CFLSteensAliasAnalysis.h" +#include "llvm/Analysis/ScopedNoAliasAA.h" #include "llvm/Analysis/TypeBasedAliasAnalysis.h" #include "llvm/IR/Argument.h" #include "llvm/IR/BasicBlock.h" @@ -106,22 +107,16 @@ void LLVMBasedAliasAnalysis::clear() { } LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, - bool UseLazyEvaluation, - AliasAnalysisType PATy) - : PATy(PATy) { - AA.registerFunctionAnalysis(); - switch (PATy) { - case AliasAnalysisType::CFLAnders: - AA.registerFunctionAnalysis(); - break; - case AliasAnalysisType::CFLSteens: - AA.registerFunctionAnalysis(); - break; - default: - break; - } - AA.registerFunctionAnalysis(); - FAM.registerPass([&] { return std::move(AA); }); + bool UseLazyEvaluation) { + + FAM.registerPass([&] { + llvm::AAManager AA; + // Note: The order of the alias analyses is important + AA.registerFunctionAnalysis(); + AA.registerFunctionAnalysis(); + AA.registerFunctionAnalysis(); + return AA; + }); PB.registerFunctionAnalyses(FAM); llvm::FunctionPassManager FPM; // Always verify the input. diff --git a/lib/Pointer/AliasAnalysisType.cpp b/lib/Pointer/AliasAnalysisType.cpp deleted file mode 100644 index d958fae7b..000000000 --- a/lib/Pointer/AliasAnalysisType.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "phasar/Pointer/AliasAnalysisType.h" - -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" - -std::string psr::toString(AliasAnalysisType PA) { - switch (PA) { - default: -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, DESC) \ - case AliasAnalysisType::NAME: \ - return #NAME; -#include "phasar/Pointer/AliasAnalysisType.def" - case AliasAnalysisType::Invalid: - return "Invalid"; - } -} - -psr::AliasAnalysisType psr::toAliasAnalysisType(llvm::StringRef S) { - AliasAnalysisType Type = llvm::StringSwitch(S) -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, TYPE) \ - .Case(#NAME, AliasAnalysisType::NAME) -#include "phasar/Pointer/AliasAnalysisType.def" - .Default(AliasAnalysisType::Invalid); - if (Type == AliasAnalysisType::Invalid) { - Type = llvm::StringSwitch(S) -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, TYPE) \ - .Case(CMDFLAG, AliasAnalysisType::NAME) -#include "phasar/Pointer/AliasAnalysisType.def" - .Default(AliasAnalysisType::Invalid); - } - return Type; -} - -llvm::raw_ostream &psr::operator<<(llvm::raw_ostream &OS, - AliasAnalysisType PA) { - return OS << toString(PA); -} diff --git a/tools/phasar-cli/phasar-cli.cpp b/tools/phasar-cli/phasar-cli.cpp index 1ac2672d7..2ffa16692 100644 --- a/tools/phasar-cli/phasar-cli.cpp +++ b/tools/phasar-cli/phasar-cli.cpp @@ -16,7 +16,6 @@ #include "phasar/PhasarLLVM/HelperAnalyses.h" #include "phasar/PhasarLLVM/Passes/GeneralStatisticsAnalysis.h" #include "phasar/PhasarLLVM/Utils/DataFlowAnalysisType.h" -#include "phasar/Pointer/AliasAnalysisType.h" #include "phasar/Utils/IO.h" #include "phasar/Utils/Logger.h" #include "phasar/Utils/Soundness.h" @@ -97,21 +96,6 @@ cl::opt AnalysisConfigOpt( cl::desc("Set the analysis's configuration (if required)"), cl::cat(PsrCat)); -cl::opt AliasTypeOpt( - "alias-analysis", - cl::desc("Set the alias analysis to be used (CFLSteens, " - "CFLAnders). CFLSteens is ~O(N) but inaccurate while " - "CFLAnders O(N^3) but more accurate."), - cl::values( -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, DESC) \ - clEnumValN(AliasAnalysisType::NAME, CMDFLAG, DESC), -#include "phasar/Pointer/AliasAnalysisType.def" - clEnumValN(AliasAnalysisType::Invalid, "invalid", "invalid")), - cl::init(AliasAnalysisType::CFLAnders), cl::cat(PsrCat)); -cl::alias AliasTypeAlias("P", cl::aliasopt(AliasTypeOpt), - cl::desc("Alias for --alias-analysis"), - cl::cat(PsrCat)); - cl::opt CGTypeOpt( "call-graph-analysis", cl::desc("Set the call-graph algorithm to be used"), cl::values( @@ -270,13 +254,6 @@ void validateParamOutput() { } } -void validateParamPointerAnalysis() { - if (AliasTypeOpt == AliasAnalysisType::Invalid) { - llvm::errs() << "'Invalid' is not a valid pointer analysis!\n"; - exit(1); - } -} - void validateParamCallGraphAnalysis() { if (CGTypeOpt == CallGraphAnalysisType::Invalid) { llvm::errs() << "'Invalid' is not a valid call-graph analysis!\n"; @@ -346,7 +323,6 @@ int main(int Argc, const char **Argv) { validateParamModule(); validateParamOutput(); - validateParamPointerAnalysis(); validateParamCallGraphAnalysis(); validateSoundnessFlag(); validateParamAnalysisConfig(); @@ -419,7 +395,7 @@ int main(int Argc, const char **Argv) { // setup IRDB as source code manager HelperAnalyses HA(std::move(ModuleOpt.getValue()), - std::move(PrecomputedAliasSet), AliasTypeOpt, + std::move(PrecomputedAliasSet), !AnalysisController::needsToEmitPTA(EmitterOptions), EntryOpt, CGTypeOpt, SoundnessOpt, AutoGlobalsOpt); From 8915ac14091834527f4a1f2fa1a0756232320a98 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 14 Apr 2023 15:08:00 +0200 Subject: [PATCH 2/6] Add entry to BreakingChanges.md --- BreakingChanges.md | 4 ++++ lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp | 10 ---------- .../IfdsIde/Problems/IFDSConstAnalysisTest.cpp | 2 ++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/BreakingChanges.md b/BreakingChanges.md index 2d73d94c6..11a32dcbb 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -1,5 +1,9 @@ # Breaking Changes +## development HEAD + +- Removed the CLI options `--alias-analysis` and `-P`. PhASAR now only supports the default alias analysis pipeline from LLVM consisting of TBAA, ScopedNoAliasAA and BasicAA. + ## v0323 - `EdgeFunctionPtrType` is no longer a `std::shared_ptr`. Instead `EdgeFunction` should be used directly. `EdgeFunction` is now a *value-type* that encapsulates its memory management by itself. diff --git a/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp b/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp index 644805005..b5ed94a4f 100644 --- a/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp @@ -446,10 +446,7 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { PHASAR_LOG_LEVEL_CAT(DEBUG, "LLVMAliasSet", "Analyzing function: " << F->getName()); - llvm::errs() << "> computeFunctionsAliasSet\n"; - llvm::AAResults &AA = *PTA.getAAResults(F); - llvm::errs() << "> after getAAResults()\n"; bool EvalAAMD = true; const llvm::DataLayout &DL = F->getParent()->getDataLayout(); @@ -463,7 +460,6 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { llvm::DenseSet UsedGlobals; for (auto &Inst : llvm::instructions(F)) { - llvm::errs() << "> Inst: " << Inst << '\n'; if (Inst.getType()->isPointerTy()) { // Add all pointer instructions. @@ -529,8 +525,6 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { } } - llvm::errs() << "Args\n"; - for (auto &I : F->args()) { if (I.getType()->isPointerTy()) { // Add all pointer arguments. @@ -540,17 +534,13 @@ void LLVMAliasSet::computeFunctionsAliasSet(llvm::Function *F) { auto NumGlobals = UsedGlobals.size(); - llvm::errs() << "Globals\n"; Pointers.reserve(Pointers.size() + NumGlobals); for (const auto *Glob : UsedGlobals) { - llvm::errs() << "> " << *Glob << '\n'; addPointer(Glob, Pointers); } - llvm::errs() << "> erase()\n"; // we no longer need the LLVM representation PTA.erase(F); - llvm::errs() << "> done\n"; } AliasResult LLVMAliasSet::alias(const llvm::Value *V1, const llvm::Value *V2, diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IFDSConstAnalysisTest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IFDSConstAnalysisTest.cpp index 77f858c30..56d86f08f 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IFDSConstAnalysisTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IFDSConstAnalysisTest.cpp @@ -156,6 +156,8 @@ TEST_F(IFDSConstAnalysisTest, HandlePointerTest_01) { } TEST_F(IFDSConstAnalysisTest, HandlePointerTest_02) { + GTEST_SKIP() << "The Alias Analysis does not know anymore that i and p do " + "not alias..."; initialize({PathToLlFiles + "pointer/pointer_02_cpp_dbg.ll"}); IFDSSolver Llvmconstsolver(*Constproblem, &HA->getICFG()); Llvmconstsolver.solve(); From 04692ed9d9887cfd4b4527de3637158df8b6af16 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 14 Apr 2023 15:56:52 +0200 Subject: [PATCH 3/6] minor restructure of LLVMBasedAliasAnalysis --- .../phasar/PhasarLLVM/Pointer/LLVMAliasSet.h | 2 + .../Pointer/LLVMBasedAliasAnalysis.h | 37 +++++++++++-------- .../PhasarLLVM/Utils/BasicBlockOrdering.h | 9 +++-- .../Pointer/LLVMBasedAliasAnalysis.cpp | 26 ++++++++----- lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp | 1 - 5 files changed, 46 insertions(+), 29 deletions(-) diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h b/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h index 4ad8c6212..713b92dfc 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMAliasSet.h @@ -30,6 +30,8 @@ class Value; class Instruction; class GlobalVariable; class Function; +class GlobalObject; +class DataLayout; } // namespace llvm namespace psr { diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h index 87da4d71f..698b7bcd2 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h @@ -10,14 +10,16 @@ #ifndef PHASAR_PHASARLLVM_POINTER_LLVMBASEDALIASANALYSIS_H_ #define PHASAR_PHASARLLVM_POINTER_LLVMBASEDALIASANALYSIS_H_ -#include "llvm/Analysis/AliasAnalysis.h" -#include "llvm/IR/PassManager.h" -#include "llvm/Passes/PassBuilder.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/Support/raw_ostream.h" + +#include namespace llvm { class Value; class Function; class Instruction; +class AAResults; } // namespace llvm namespace psr { @@ -25,21 +27,17 @@ namespace psr { class LLVMProjectIRDB; class LLVMBasedAliasAnalysis { -private: - llvm::PassBuilder PB; - - llvm::FunctionAnalysisManager FAM; - llvm::FunctionPassManager FPM; - llvm::DenseMap AAInfos; - - [[nodiscard]] bool hasAliasInfo(const llvm::Function &Fun) const; - - void computeAliasInfo(llvm::Function &Fun); - public: LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true); - ~LLVMBasedAliasAnalysis() = default; + LLVMBasedAliasAnalysis(LLVMBasedAliasAnalysis &&) noexcept = default; + LLVMBasedAliasAnalysis & + operator=(LLVMBasedAliasAnalysis &&) noexcept = default; + + LLVMBasedAliasAnalysis(const LLVMBasedAliasAnalysis &) = delete; + LLVMBasedAliasAnalysis &operator=(const LLVMBasedAliasAnalysis &) = delete; + + ~LLVMBasedAliasAnalysis(); void print(llvm::raw_ostream &OS = llvm::outs()) const; @@ -53,6 +51,15 @@ class LLVMBasedAliasAnalysis { void erase(llvm::Function *F); void clear(); + +private: + struct Impl; + std::unique_ptr PImpl; + llvm::DenseMap AAInfos; + + [[nodiscard]] bool hasAliasInfo(const llvm::Function &Fun) const; + + void computeAliasInfo(llvm::Function &Fun); }; } // namespace psr diff --git a/include/phasar/PhasarLLVM/Utils/BasicBlockOrdering.h b/include/phasar/PhasarLLVM/Utils/BasicBlockOrdering.h index 664f28304..18c3c962f 100644 --- a/include/phasar/PhasarLLVM/Utils/BasicBlockOrdering.h +++ b/include/phasar/PhasarLLVM/Utils/BasicBlockOrdering.h @@ -12,6 +12,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FunctionExtras.h" +#include "llvm/IR/Dominators.h" #include #include @@ -20,17 +21,17 @@ namespace llvm { class Function; class BasicBlock; class Instruction; -class DominatorTree; } // namespace llvm namespace psr { class DefaultDominatorTreeAnalysis { - llvm::DenseMap> - Dom; - public: llvm::DominatorTree &operator()(const llvm::Function *F); + +private: + llvm::DenseMap> + Dom{}; }; /// Provides a simple partial ordering of BasicBlocks based on LLVM's diff --git a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp index 0e201f281..d0cb97e1d 100644 --- a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp @@ -17,8 +17,6 @@ #include "llvm/ADT/StringSwitch.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/BasicAliasAnalysis.h" -#include "llvm/Analysis/CFLAndersAliasAnalysis.h" -#include "llvm/Analysis/CFLSteensAliasAnalysis.h" #include "llvm/Analysis/ScopedNoAliasAA.h" #include "llvm/Analysis/TypeBasedAliasAnalysis.h" #include "llvm/IR/Argument.h" @@ -29,6 +27,7 @@ #include "llvm/IR/PassManager.h" #include "llvm/IR/Value.h" #include "llvm/IR/Verifier.h" +#include "llvm/Passes/PassBuilder.h" using namespace psr; @@ -84,13 +83,19 @@ static inline void printLoadStoreResults(llvm::AliasResult AR, bool P, } } +struct LLVMBasedAliasAnalysis::Impl { + llvm::PassBuilder PB{}; + llvm::FunctionAnalysisManager FAM{}; + llvm::FunctionPassManager FPM{}; +}; + bool LLVMBasedAliasAnalysis::hasAliasInfo(const llvm::Function &Fun) const { return AAInfos.find(&Fun) != AAInfos.end(); } void LLVMBasedAliasAnalysis::computeAliasInfo(llvm::Function &Fun) { - llvm::PreservedAnalyses PA = FPM.run(Fun, FAM); - llvm::AAResults &AAR = FAM.getResult(Fun); + llvm::PreservedAnalyses PA = PImpl->FPM.run(Fun, PImpl->FAM); + llvm::AAResults &AAR = PImpl->FAM.getResult(Fun); AAInfos.insert(std::make_pair(&Fun, &AAR)); } @@ -98,18 +103,19 @@ void LLVMBasedAliasAnalysis::erase(llvm::Function *F) { // after we clear all stuff, we need to set it up for the next function-wise // analysis AAInfos.erase(F); - FAM.clear(*F, F->getName()); + PImpl->FAM.clear(*F, F->getName()); } void LLVMBasedAliasAnalysis::clear() { AAInfos.clear(); - FAM.clear(); + PImpl->FAM.clear(); } LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, - bool UseLazyEvaluation) { + bool UseLazyEvaluation) + : PImpl(new Impl{}) { - FAM.registerPass([&] { + PImpl->FAM.registerPass([&] { llvm::AAManager AA; // Note: The order of the alias analyses is important AA.registerFunctionAnalysis(); @@ -117,7 +123,7 @@ LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, AA.registerFunctionAnalysis(); return AA; }); - PB.registerFunctionAnalyses(FAM); + PImpl->PB.registerFunctionAnalyses(PImpl->FAM); llvm::FunctionPassManager FPM; // Always verify the input. FPM.addPass(llvm::VerifierPass()); @@ -130,6 +136,8 @@ LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, } } +LLVMBasedAliasAnalysis::~LLVMBasedAliasAnalysis() = default; + void LLVMBasedAliasAnalysis::print(llvm::raw_ostream &OS) const { OS << "Points-to Info:\n"; for (const auto &[Fn, AA] : AAInfos) { diff --git a/lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp b/lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp index 89a5f386a..ee642b6e1 100644 --- a/lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp +++ b/lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp @@ -2,7 +2,6 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/IR/BasicBlock.h" -#include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instruction.h" From 3219844c8d4761d102c2a60788e352efed05df8c Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 14 Apr 2023 16:42:09 +0200 Subject: [PATCH 4/6] cleanup LLVMBasedAliasAnalysis --- .../Pointer/LLVMBasedAliasAnalysis.h | 2 - .../Pointer/LLVMBasedAliasAnalysis.cpp | 311 +----------------- 2 files changed, 1 insertion(+), 312 deletions(-) diff --git a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h index 698b7bcd2..46c9612fe 100644 --- a/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h +++ b/include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h @@ -39,8 +39,6 @@ class LLVMBasedAliasAnalysis { ~LLVMBasedAliasAnalysis(); - void print(llvm::raw_ostream &OS = llvm::outs()) const; - [[nodiscard]] inline llvm::AAResults *getAAResults(llvm::Function *F) { if (!hasAliasInfo(*F)) { computeAliasInfo(*F); diff --git a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp index d0cb97e1d..2eb3df871 100644 --- a/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp +++ b/lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp @@ -26,63 +26,10 @@ #include "llvm/IR/Instruction.h" #include "llvm/IR/PassManager.h" #include "llvm/IR/Value.h" -#include "llvm/IR/Verifier.h" #include "llvm/Passes/PassBuilder.h" -using namespace psr; - namespace psr { -static void printResults(llvm::AliasResult AR, bool P, const llvm::Value *V1, - const llvm::Value *V2, const llvm::Module *M) { - if (P) { - std::string O1; - - std::string O2; - { - llvm::raw_string_ostream OS1(O1); - - llvm::raw_string_ostream OS2(O2); - V1->printAsOperand(OS1, true, M); - V2->printAsOperand(OS2, true, M); - } - - if (O2 < O1) { - std::swap(O1, O2); - } - llvm::errs() << " " << AR << ":\t" << O1 << ", " << O2 << "\n"; - } -} - -static inline void printModRefResults(const char *Msg, bool P, - const llvm::Instruction *I, - const llvm::Value *Ptr, - const llvm::Module *M) { - if (P) { - llvm::errs() << " " << Msg << ": Ptr: "; - Ptr->printAsOperand(llvm::errs(), true, M); - llvm::errs() << "\t<->" << *I << '\n'; - } -} - -static inline void printModRefResults(const char *Msg, bool P, - const llvm::CallBase *CallA, - const llvm::CallBase *CallB, - const llvm::Module * /*M*/) { - if (P) { - llvm::errs() << " " << Msg << ": " << *CallA << " <-> " << *CallB << '\n'; - } -} - -static inline void printLoadStoreResults(llvm::AliasResult AR, bool P, - const llvm::Value *V1, - const llvm::Value *V2, - const llvm::Module * /*M*/) { - if (P) { - llvm::errs() << " " << AR << ": " << *V1 << " <-> " << *V2 << '\n'; - } -} - struct LLVMBasedAliasAnalysis::Impl { llvm::PassBuilder PB{}; llvm::FunctionAnalysisManager FAM{}; @@ -124,9 +71,7 @@ LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, return AA; }); PImpl->PB.registerFunctionAnalyses(PImpl->FAM); - llvm::FunctionPassManager FPM; - // Always verify the input. - FPM.addPass(llvm::VerifierPass()); + if (!UseLazyEvaluation) { for (auto &F : *IRDB.getModule()) { if (!F.isDeclaration()) { @@ -138,258 +83,4 @@ LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, LLVMBasedAliasAnalysis::~LLVMBasedAliasAnalysis() = default; -void LLVMBasedAliasAnalysis::print(llvm::raw_ostream &OS) const { - OS << "Points-to Info:\n"; - for (const auto &[Fn, AA] : AAInfos) { - bool PrintAll = true; - bool PrintNoAlias = true; - bool PrintMayAlias = true; - bool PrintPartialAlias = true; - bool PrintMustAlias = true; - bool EvalAAMD = true; - bool PrintNoModRef = true; - bool PrintMod = true; - bool PrintRef = true; - bool PrintModRef = true; - bool PrintMust = true; - bool PrintMustMod = true; - bool PrintMustRef = true; - bool PrintMustModRef = true; - - // taken from llvm/Analysis/AliasAnalysisEvaluator.cpp - const llvm::DataLayout &DL = Fn->getParent()->getDataLayout(); - - llvm::SetVector Pointers; - llvm::SmallSetVector Calls; - llvm::SetVector Loads; - llvm::SetVector Stores; - - for (const auto &I : Fn->args()) { - if (I.getType()->isPointerTy()) { // Add all pointer arguments. - Pointers.insert(&I); - } - } - - for (llvm::const_inst_iterator I = inst_begin(*Fn), E = inst_end(*Fn); - I != E; ++I) { - if (I->getType()->isPointerTy()) { // Add all pointer instructions. - Pointers.insert(&*I); - } - if (EvalAAMD && llvm::isa(&*I)) { - Loads.insert(&*I); - } - if (EvalAAMD && llvm::isa(&*I)) { - Stores.insert(&*I); - } - const llvm::Instruction &Inst = *I; - if (const auto *Call = llvm::dyn_cast(&Inst)) { - llvm::Value *Callee = Call->getCalledOperand(); - // Skip actual functions for direct function calls. - if (!llvm::isa(Callee) && - isInterestingPointer(Callee)) { - Pointers.insert(Callee); - } - // Consider formals. - for (const llvm::Use &DataOp : Call->data_ops()) { - if (isInterestingPointer(DataOp)) { - Pointers.insert(DataOp); - } - } - Calls.insert(Call); - } else { - // Consider all operands. - for (llvm::Instruction::const_op_iterator OI = Inst.op_begin(), - OE = Inst.op_end(); - OI != OE; ++OI) { - if (isInterestingPointer(*OI)) { - Pointers.insert(*OI); - } - } - } - } - - if (PrintAll || PrintNoAlias || PrintMayAlias || PrintPartialAlias || - PrintMustAlias || PrintNoModRef || PrintMod || PrintRef || - PrintModRef) { - OS << "Function: " << Fn->getName() << ": " << Pointers.size() - << " pointers, " << Calls.size() << " call sites\n"; - } - - // iterate over the worklist, and run the full (n^2)/2 disambiguations - for (auto I1 = Pointers.begin(), E = Pointers.end(); I1 != E; ++I1) { - auto I1Size = llvm::LocationSize::beforeOrAfterPointer(); - llvm::Type *I1ElTy = - llvm::cast((*I1)->getType())->getElementType(); - if (I1ElTy->isSized()) { - I1Size = llvm::LocationSize::precise(DL.getTypeStoreSize(I1ElTy)); - } - for (auto I2 = Pointers.begin(); I2 != I1; ++I2) { - auto I2Size = llvm::LocationSize::beforeOrAfterPointer(); - llvm::Type *I2ElTy = - llvm::cast((*I2)->getType())->getElementType(); - if (I2ElTy->isSized()) { - I2Size = llvm::LocationSize::precise(DL.getTypeStoreSize(I2ElTy)); - } - llvm::AliasResult AR = AA->alias(*I1, I1Size, *I2, I2Size); - switch (AR) { - case llvm::AliasResult::NoAlias: - printResults(AR, PrintNoAlias, *I1, *I2, Fn->getParent()); - break; - case llvm::AliasResult::MayAlias: - printResults(AR, PrintMayAlias, *I1, *I2, Fn->getParent()); - break; - case llvm::AliasResult::PartialAlias: - printResults(AR, PrintPartialAlias, *I1, *I2, Fn->getParent()); - break; - case llvm::AliasResult::MustAlias: - printResults(AR, PrintMustAlias, *I1, *I2, Fn->getParent()); - break; - } - } - } - - if (EvalAAMD) { - // iterate over all pairs of load, store - for (const llvm::Value *Load : Loads) { - for (const llvm::Value *Store : Stores) { - llvm::AliasResult AR = AA->alias( - llvm::MemoryLocation::get(llvm::cast(Load)), - llvm::MemoryLocation::get(llvm::cast(Store))); - switch (AR) { - case llvm::AliasResult::NoAlias: - printLoadStoreResults(AR, PrintNoAlias, Load, Store, - Fn->getParent()); - break; - case llvm::AliasResult::MayAlias: - printLoadStoreResults(AR, PrintMayAlias, Load, Store, - Fn->getParent()); - break; - case llvm::AliasResult::PartialAlias: - printLoadStoreResults(AR, PrintPartialAlias, Load, Store, - Fn->getParent()); - break; - case llvm::AliasResult::MustAlias: - printLoadStoreResults(AR, PrintMustAlias, Load, Store, - Fn->getParent()); - break; - } - } - } - - // iterate over all pairs of store, store - for (auto I1 = Stores.begin(), E = Stores.end(); I1 != E; ++I1) { - for (auto I2 = Stores.begin(); I2 != I1; ++I2) { - llvm::AliasResult AR = AA->alias( - llvm::MemoryLocation::get(llvm::cast(*I1)), - llvm::MemoryLocation::get(llvm::cast(*I2))); - switch (AR) { - case llvm::AliasResult::NoAlias: - printLoadStoreResults(AR, PrintNoAlias, *I1, *I2, Fn->getParent()); - break; - case llvm::AliasResult::MayAlias: - printLoadStoreResults(AR, PrintMayAlias, *I1, *I2, Fn->getParent()); - break; - case llvm::AliasResult::PartialAlias: - printLoadStoreResults(AR, PrintPartialAlias, *I1, *I2, - Fn->getParent()); - break; - case llvm::AliasResult::MustAlias: - printLoadStoreResults(AR, PrintMustAlias, *I1, *I2, - Fn->getParent()); - break; - } - } - } - } - - // Mod/ref alias analysis: compare all pairs of calls and values - for (const llvm::CallBase *Call : Calls) { - for (const auto *Pointer : Pointers) { - auto Size = llvm::LocationSize::beforeOrAfterPointer(); - llvm::Type *ElTy = - llvm::cast(Pointer->getType())->getElementType(); - if (ElTy->isSized()) { - Size = llvm::LocationSize::precise(DL.getTypeStoreSize(ElTy)); - } - - switch (AA->getModRefInfo(Call, Pointer, Size)) { - case llvm::ModRefInfo::NoModRef: - printModRefResults("NoModRef", PrintNoModRef, Call, Pointer, - Fn->getParent()); - break; - case llvm::ModRefInfo::Mod: - printModRefResults("Just Mod", PrintMod, Call, Pointer, - Fn->getParent()); - break; - case llvm::ModRefInfo::Ref: - printModRefResults("Just Ref", PrintRef, Call, Pointer, - Fn->getParent()); - break; - case llvm::ModRefInfo::ModRef: - printModRefResults("Both ModRef", PrintModRef, Call, Pointer, - Fn->getParent()); - break; - case llvm::ModRefInfo::Must: - printModRefResults("Must", PrintMust, Call, Pointer, Fn->getParent()); - break; - case llvm::ModRefInfo::MustMod: - printModRefResults("Just Mod (MustAlias)", PrintMustMod, Call, - Pointer, Fn->getParent()); - break; - case llvm::ModRefInfo::MustRef: - printModRefResults("Just Ref (MustAlias)", PrintMustRef, Call, - Pointer, Fn->getParent()); - break; - case llvm::ModRefInfo::MustModRef: - printModRefResults("Both ModRef (MustAlias)", PrintMustModRef, Call, - Pointer, Fn->getParent()); - break; - } - } - } - - // Mod/ref alias analysis: compare all pairs of calls - for (const llvm::CallBase *CallA : Calls) { - for (const llvm::CallBase *CallB : Calls) { - if (CallA == CallB) { - continue; - } - switch (AA->getModRefInfo(CallA, CallB)) { - case llvm::ModRefInfo::NoModRef: - printModRefResults("NoModRef", PrintNoModRef, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::Mod: - printModRefResults("Just Mod", PrintMod, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::Ref: - printModRefResults("Just Ref", PrintRef, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::ModRef: - printModRefResults("Both ModRef", PrintModRef, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::Must: - printModRefResults("Must", PrintMust, CallA, CallB, Fn->getParent()); - break; - case llvm::ModRefInfo::MustMod: - printModRefResults("Just Mod (MustAlias)", PrintMustMod, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::MustRef: - printModRefResults("Just Ref (MustAlias)", PrintMustRef, CallA, CallB, - Fn->getParent()); - break; - case llvm::ModRefInfo::MustModRef: - printModRefResults("Both ModRef (MustAlias)", PrintMustModRef, CallA, - CallB, Fn->getParent()); - break; - } - } - } - } -} - } // namespace psr From 839f713e78addbaecf6c96386d33fa5135414eb6 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel Date: Fri, 14 Apr 2023 17:52:13 +0200 Subject: [PATCH 5/6] skip rvo test --- .../IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp index a121fe138..e7600bd62 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEInstInteractionAnalysisTest.cpp @@ -855,6 +855,10 @@ TEST_F(IDEInstInteractionAnalysisTest, HandleHeapTest_01) { } PHASAR_SKIP_TEST(TEST_F(IDEInstInteractionAnalysisTest, HandleRVOTest_01) { + GTEST_SKIP() + << "This test heavily relies on the used stdlib(even between different " + "versions of the same stdlib), so we cannot have portable tests here"; + // If we use libcxx this won't work since internal implementation is different LIBCPP_GTEST_SKIP; From 47200120270ce592ffb65ac57a401d993716db79 Mon Sep 17 00:00:00 2001 From: Fabian Schiebel <52407375+fabianbs96@users.noreply.github.com> Date: Fri, 14 Apr 2023 18:41:21 +0200 Subject: [PATCH 6/6] Delete AliasAnalysisType.def --- include/phasar/Pointer/AliasAnalysisType.def | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 include/phasar/Pointer/AliasAnalysisType.def diff --git a/include/phasar/Pointer/AliasAnalysisType.def b/include/phasar/Pointer/AliasAnalysisType.def deleted file mode 100644 index 23fbe08c7..000000000 --- a/include/phasar/Pointer/AliasAnalysisType.def +++ /dev/null @@ -1,18 +0,0 @@ -/****************************************************************************** - * Copyright (c) 2022 Philipp Schubert. - * All rights reserved. This program and the accompanying materials are made - * available under the terms of LICENSE.txt. - * - * Contributors: - * Philipp Schubert and others - *****************************************************************************/ - -#ifndef ALIAS_ANALYSIS_TYPE -#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, DESC) -#endif - -ALIAS_ANALYSIS_TYPE(CFLSteens, "cflsteens", "Steensgaard-style alias analysis (equality-based)") -ALIAS_ANALYSIS_TYPE(CFLAnders, "cflanders", "Andersen-style alias analysis (subset-based)") -ALIAS_ANALYSIS_TYPE(PointsTo, "points-to", "Alias-information based on (external) points-to information") - -#undef ALIAS_ANALYSIS_TYPE