Skip to content

Commit

Permalink
moving phasar to DIBasedTypeHierarchy
Browse files Browse the repository at this point in the history
  • Loading branch information
mxHuber committed Jun 19, 2024
1 parent d581987 commit 9eb9929
Show file tree
Hide file tree
Showing 33 changed files with 204 additions and 282 deletions.
8 changes: 5 additions & 3 deletions include/phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "phasar/PhasarLLVM/ControlFlow/LLVMBasedCFG.h"
#include "phasar/PhasarLLVM/ControlFlow/LLVMVFTableProvider.h"
#include "phasar/PhasarLLVM/Pointer/LLVMAliasInfo.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"
#include "phasar/PhasarLLVM/Utils/LLVMBasedContainerConfig.h"
#include "phasar/Utils/Soundness.h"

Expand All @@ -38,7 +39,7 @@
#include <memory>

namespace psr {
class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;
class LLVMProjectIRDB;
class Resolver;

Expand Down Expand Up @@ -82,7 +83,7 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
/// IRDB. True by default
explicit LLVMBasedICFG(LLVMProjectIRDB *IRDB, CallGraphAnalysisType CGType,
llvm::ArrayRef<std::string> EntryPoints = {},
LLVMTypeHierarchy *TH = nullptr,
DIBasedTypeHierarchy *TH = nullptr,
LLVMAliasInfoRef PT = nullptr,
Soundness S = Soundness::Soundy,
bool IncludeGlobals = true);
Expand All @@ -102,7 +103,7 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
explicit LLVMBasedICFG(LLVMProjectIRDB *IRDB,
const nlohmann::json &SerializedCG);

// Deleter of LLVMTypeHierarchy may be unknown here...
// Deleter of DIBasedTypeHierarchy may be unknown here...
~LLVMBasedICFG();

LLVMBasedICFG(const LLVMBasedICFG &) = delete;
Expand Down Expand Up @@ -173,6 +174,7 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
CallGraph<const llvm::Instruction *, const llvm::Function *> CG;
LLVMProjectIRDB *IRDB = nullptr;
LLVMVFTableProvider VTP;
std::map<const llvm::DIType *, const llvm::StructType *> DITypeToValueType;
};

extern template class ICFGBase<LLVMBasedICFG>;
Expand Down
4 changes: 4 additions & 0 deletions include/phasar/PhasarLLVM/ControlFlow/LLVMVFTableProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include "phasar/PhasarLLVM/TypeHierarchy/LLVMVFTable.h"

#include "llvm/IR/DebugInfoMetadata.h"

#include <unordered_map>

namespace llvm {
Expand All @@ -29,11 +31,13 @@ class LLVMVFTableProvider {
explicit LLVMVFTableProvider(const LLVMProjectIRDB &IRDB);

[[nodiscard]] bool hasVFTable(const llvm::StructType *Type) const;
[[nodiscard]] bool hasVFTable(const llvm::DIType *Type) const;
[[nodiscard]] const LLVMVFTable *
getVFTableOrNull(const llvm::StructType *Type) const;

private:
std::unordered_map<const llvm::StructType *, LLVMVFTable> TypeVFTMap;
std::map<const llvm::DIType *, const llvm::StructType *> DITypeToStructType;
};
} // namespace psr

Expand Down
7 changes: 4 additions & 3 deletions include/phasar/PhasarLLVM/ControlFlow/Resolver/CHAResolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#define PHASAR_PHASARLLVM_CONTROLFLOW_RESOLVER_CHARESOLVER_H_

#include "phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"
#include "phasar/Utils/MaybeUniquePtr.h"

namespace llvm {
Expand All @@ -26,11 +27,11 @@ class Function;
} // namespace llvm

namespace psr {
class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;
class CHAResolver : public Resolver {
public:
CHAResolver(const LLVMProjectIRDB *IRDB, const LLVMVFTableProvider *VTP,
const LLVMTypeHierarchy *TH);
const DIBasedTypeHierarchy *TH);

~CHAResolver() override = default;

Expand All @@ -39,7 +40,7 @@ class CHAResolver : public Resolver {
[[nodiscard]] std::string str() const override;

protected:
MaybeUniquePtr<const LLVMTypeHierarchy, true> TH;
MaybeUniquePtr<const DIBasedTypeHierarchy, true> TH;
};
} // namespace psr

Expand Down
3 changes: 2 additions & 1 deletion include/phasar/PhasarLLVM/ControlFlow/Resolver/DTAResolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include "phasar/PhasarLLVM/ControlFlow/Resolver/CHAResolver.h"
#include "phasar/PhasarLLVM/Pointer/TypeGraphs/CachedTypeGraph.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"
// To switch the TypeGraph
// #include "phasar/PhasarLLVM/Pointer/TypeGraphs/LazyTypeGraph.h"

Expand Down Expand Up @@ -56,7 +57,7 @@ class DTAResolver : public CHAResolver {

public:
DTAResolver(const LLVMProjectIRDB *IRDB, const LLVMVFTableProvider *VTP,
const LLVMTypeHierarchy *TH);
const DIBasedTypeHierarchy *TH);

~DTAResolver() override = default;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace psr {
class RTAResolver : public CHAResolver {
public:
RTAResolver(const LLVMProjectIRDB *IRDB, const LLVMVFTableProvider *VTP,
const LLVMTypeHierarchy *TH);
const DIBasedTypeHierarchy *TH);

~RTAResolver() override = default;

Expand Down
20 changes: 10 additions & 10 deletions include/phasar/PhasarLLVM/ControlFlow/Resolver/Resolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#define PHASAR_PHASARLLVM_CONTROLFLOW_RESOLVER_RESOLVER_H_

#include "phasar/PhasarLLVM/Pointer/LLVMAliasInfo.h"
#include "phasar/Utils/IRDBOpaquePtrTypes.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"

#include "llvm/ADT/DenseSet.h"

Expand All @@ -30,23 +30,22 @@ namespace llvm {
class Instruction;
class CallBase;
class Function;
class StructType;
class DIType;
} // namespace llvm

namespace psr {
class LLVMProjectIRDB;
class LLVMVFTableProvider;
class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;
enum class CallGraphAnalysisType;

[[nodiscard]] std::optional<unsigned>
getVFTIndex(const llvm::CallBase *CallSite);

[[nodiscard]] const llvm::StructType *
getReceiverType(const llvm::CallBase *CallSite, const LLVMProjectIRDB *IRDB);
[[nodiscard]] const llvm::DIType *
getReceiverType(const llvm::CallBase *CallSite);

[[nodiscard]] std::string getReceiverTypeName(const llvm::CallBase *CallSite,
const LLVMProjectIRDB *IRDB);
[[nodiscard]] std::string getReceiverTypeName(const llvm::CallBase *CallSite);

[[nodiscard]] bool isConsistentCall(const llvm::CallBase *CallSite,
const llvm::Function *DestFun);
Expand All @@ -55,12 +54,13 @@ class Resolver {
protected:
const LLVMProjectIRDB *IRDB;
const LLVMVFTableProvider *VTP;
IRDBOpaquePtrTypes OpaquePtrTypes;
std::map<const llvm::DIType *, const llvm::StructType *> DITypeToStructType;

Resolver(const LLVMProjectIRDB *IRDB);
void initializeTypeMap();

const llvm::Function *
getNonPureVirtualVFTEntry(const llvm::StructType *T, unsigned Idx,
getNonPureVirtualVFTEntry(const llvm::DIType *T, unsigned Idx,
const llvm::CallBase *CallSite);

public:
Expand Down Expand Up @@ -88,7 +88,7 @@ class Resolver {
static std::unique_ptr<Resolver> create(CallGraphAnalysisType Ty,
const LLVMProjectIRDB *IRDB,
const LLVMVFTableProvider *VTP,
const LLVMTypeHierarchy *TH,
const DIBasedTypeHierarchy *TH,
LLVMAliasInfoRef PT = nullptr);
};
} // namespace psr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class StructType;

namespace psr {

class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;

struct InterMonoSolverTestDomain : LLVMAnalysisDomainDefault {
using mono_container_t = BitVectorSet<LLVMAnalysisDomainDefault::d_t>;
Expand All @@ -52,8 +52,9 @@ class InterMonoSolverTest : public InterMonoProblem<InterMonoSolverTestDomain> {
using i_t = InterMonoSolverTestDomain::i_t;
using mono_container_t = InterMonoSolverTestDomain::mono_container_t;

InterMonoSolverTest(const LLVMProjectIRDB *IRDB, const LLVMTypeHierarchy *TH,
const LLVMBasedICFG *ICF, LLVMAliasInfoRef PT,
InterMonoSolverTest(const LLVMProjectIRDB *IRDB,
const DIBasedTypeHierarchy *TH, const LLVMBasedICFG *ICF,
LLVMAliasInfoRef PT,
std::vector<std::string> EntryPoints = {});

~InterMonoSolverTest() override = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ namespace psr {

class LLVMBasedCFG;
class LLVMBasedICFG;
class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;

struct IntraMonoSolverTestAnalysisDomain : public LLVMAnalysisDomainDefault {
using mono_container_t = BitVectorSet<LLVMAnalysisDomainDefault::d_t>;
Expand All @@ -54,8 +54,9 @@ class IntraMonoSolverTest
using i_t = IntraMonoSolverTestAnalysisDomain::i_t;
using mono_container_t = IntraMonoSolverTestAnalysisDomain::mono_container_t;

IntraMonoSolverTest(const LLVMProjectIRDB *IRDB, const LLVMTypeHierarchy *TH,
const LLVMBasedCFG *CF, LLVMAliasInfoRef PT,
IntraMonoSolverTest(const LLVMProjectIRDB *IRDB,
const DIBasedTypeHierarchy *TH, const LLVMBasedCFG *CF,
LLVMAliasInfoRef PT,
std::vector<std::string> EntryPoints = {});

~IntraMonoSolverTest() override = default;
Expand Down
6 changes: 3 additions & 3 deletions include/phasar/PhasarLLVM/HelperAnalyses.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Module;

namespace psr {
class LLVMProjectIRDB;
class LLVMTypeHierarchy;
class DIBasedTypeHierarchy;
class LLVMBasedICFG;
class LLVMBasedCFG;
class LLVMAliasSet;
Expand Down Expand Up @@ -60,14 +60,14 @@ class HelperAnalyses { // NOLINT(cppcoreguidelines-special-member-functions)

[[nodiscard]] LLVMProjectIRDB &getProjectIRDB();
[[nodiscard]] LLVMAliasSet &getAliasInfo();
[[nodiscard]] LLVMTypeHierarchy &getTypeHierarchy();
[[nodiscard]] DIBasedTypeHierarchy &getTypeHierarchy();
[[nodiscard]] LLVMBasedICFG &getICFG();
[[nodiscard]] LLVMBasedCFG &getCFG();

private:
std::unique_ptr<LLVMProjectIRDB> IRDB;
std::unique_ptr<LLVMAliasSet> PT;
std::unique_ptr<LLVMTypeHierarchy> TH;
std::unique_ptr<DIBasedTypeHierarchy> TH;
std::unique_ptr<LLVMBasedICFG> ICF;
std::unique_ptr<LLVMBasedCFG> CFG;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class DIBasedTypeHierarchy
using ClassType = const llvm::DIType *;
using f_t = const llvm::Function *;

static inline constexpr llvm::StringLiteral PureVirtualCallName =
"__cxa_pure_virtual";

explicit DIBasedTypeHierarchy(const LLVMProjectIRDB &IRDB);
~DIBasedTypeHierarchy() override = default;

Expand Down Expand Up @@ -83,6 +86,7 @@ class DIBasedTypeHierarchy
void printAsDot(llvm::raw_ostream &OS = llvm::outs()) const;

[[nodiscard]] nlohmann::json getAsJson() const override;
void printAsJson(llvm::raw_ostream &OS = llvm::outs()) const;

private:
[[nodiscard]] llvm::iterator_range<const ClassType *>
Expand Down
4 changes: 4 additions & 0 deletions include/phasar/PhasarLLVM/Utils/LLVMIRToSrc.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#ifndef PHASAR_PHASARLLVM_UTILS_LLVMIRTOSRC_H
#define PHASAR_PHASARLLVM_UTILS_LLVMIRTOSRC_H

#include "llvm/IR/DebugInfoMetadata.h"

#include "nlohmann/json.hpp"

#include <optional>
Expand Down Expand Up @@ -58,6 +60,8 @@ getLineAndColFromIR(const llvm::Value *V);

[[nodiscard]] std::string getModuleIDFromIR(const llvm::Value *V);

[[nodiscard]] llvm::DILocalVariable *getDILocalVariable(const llvm::Value *V);

struct SourceCodeInfo {
std::string SourceCodeLine;
std::string SourceCodeFilename;
Expand Down
29 changes: 0 additions & 29 deletions include/phasar/Utils/IRDBOpaquePtrTypes.h

This file was deleted.

2 changes: 1 addition & 1 deletion lib/Controller/AnalysisController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include "phasar/Controller/AnalysisController.h"

#include "phasar/PhasarLLVM/Passes/GeneralStatisticsAnalysis.h"
#include "phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"
#include "phasar/Utils/NlohmannLogging.h"

#include "AnalysisControllerInternal.h"
Expand Down
12 changes: 5 additions & 7 deletions lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "phasar/PhasarLLVM/DB/LLVMProjectIRDB.h"
#include "phasar/PhasarLLVM/Pointer/LLVMAliasInfo.h"
#include "phasar/PhasarLLVM/Pointer/LLVMAliasSet.h"
#include "phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h"
#include "phasar/PhasarLLVM/Utils/LLVMBasedContainerConfig.h"
#include "phasar/PhasarLLVM/Utils/LLVMShorthands.h"
#include "phasar/Utils/Logger.h"
Expand Down Expand Up @@ -234,15 +233,14 @@ bool LLVMBasedICFG::Builder::processFunction(const llvm::Function *F) {
}

static bool internalIsVirtualFunctionCall(const llvm::Instruction *Inst,
const LLVMVFTableProvider &VTP,
const LLVMProjectIRDB *IRDB) {
const LLVMVFTableProvider &VTP) {
assert(Inst != nullptr);
const auto *CallSite = llvm::dyn_cast<llvm::CallBase>(Inst);
if (!CallSite) {
return false;
}
// check potential receiver type
const auto *RecType = getReceiverType(CallSite, IRDB);
const auto *RecType = getReceiverType(CallSite);
if (!RecType) {
return false;
}
Expand Down Expand Up @@ -274,7 +272,7 @@ bool LLVMBasedICFG::Builder::constructDynamicCall(const llvm::Instruction *CS) {
// call the resolve routine

assert(VTP != nullptr);
auto PossibleTargets = internalIsVirtualFunctionCall(CallSite, *VTP, IRDB)
auto PossibleTargets = internalIsVirtualFunctionCall(CallSite, *VTP)
? Res->resolveVirtualCall(CallSite)
: Res->resolveFunctionPointer(CallSite);

Expand Down Expand Up @@ -339,7 +337,7 @@ void LLVMBasedICFG::initialize(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
LLVMBasedICFG::LLVMBasedICFG(LLVMProjectIRDB *IRDB,
CallGraphAnalysisType CGType,
llvm::ArrayRef<std::string> EntryPoints,
LLVMTypeHierarchy *TH, LLVMAliasInfoRef PT,
DIBasedTypeHierarchy *TH, LLVMAliasInfoRef PT,
Soundness S, bool IncludeGlobals)
: IRDB(IRDB), VTP(*IRDB) {
assert(IRDB != nullptr);
Expand Down Expand Up @@ -413,7 +411,7 @@ bool LLVMBasedICFG::isPhasarGenerated(const llvm::Function &F) noexcept {
}

[[nodiscard]] bool LLVMBasedICFG::isVirtualFunctionCallImpl(n_t Inst) const {
return internalIsVirtualFunctionCall(Inst, VTP, IRDB);
return internalIsVirtualFunctionCall(Inst, VTP);
}

[[nodiscard]] auto LLVMBasedICFG::allNonCallStartNodesImpl() const
Expand Down
Loading

0 comments on commit 9eb9929

Please sign in to comment.