Skip to content

Commit

Permalink
Add ctor to LLVMBasedICFG that allows injecting a CG resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
fabianbs96 committed Apr 11, 2024
1 parent 8bdd67c commit 355af01
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 16 deletions.
10 changes: 10 additions & 0 deletions include/phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
namespace psr {
class LLVMTypeHierarchy;
class LLVMProjectIRDB;
class Resolver;

class LLVMBasedICFG;
template <> struct CFGTraits<LLVMBasedICFG> : CFGTraits<LLVMBasedCFG> {};
Expand Down Expand Up @@ -87,6 +88,11 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
LLVMAliasInfoRef PT = nullptr,
Soundness S = Soundness::Soundy,
bool IncludeGlobals = true);
explicit LLVMBasedICFG(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
llvm::ArrayRef<std::string> EntryPoints = {},
LLVMTypeHierarchy *TH = nullptr,
Soundness S = Soundness::Soundy,
bool IncludeGlobals = true);

/// Creates an ICFG with an already given call-graph
explicit LLVMBasedICFG(CallGraph<n_t, f_t> CG, LLVMProjectIRDB *IRDB,
Expand Down Expand Up @@ -157,6 +163,10 @@ class LLVMBasedICFG : public LLVMBasedCFG, public ICFGBase<LLVMBasedICFG> {
[[nodiscard]] llvm::Function *buildCRuntimeGlobalCtorsDtorsModel(
llvm::Module &M, llvm::ArrayRef<llvm::Function *> UserEntryPoints);

void initialize(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
llvm::ArrayRef<std::string> EntryPoints,
LLVMTypeHierarchy *TH, Soundness S, bool IncludeGlobals);

// ---

CallGraph<const llvm::Instruction *, const llvm::Function *> CG;
Expand Down
54 changes: 38 additions & 16 deletions lib/PhasarLLVM/ControlFlow/LLVMBasedICFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@
namespace psr {
struct LLVMBasedICFG::Builder {
LLVMProjectIRDB *IRDB = nullptr;
LLVMAliasInfoRef PT{};
// LLVMAliasInfoRef PT{};
LLVMTypeHierarchy *TH{};
Resolver *Res = nullptr;
CallGraphBuilder<const llvm::Instruction *, const llvm::Function *>
CGBuilder{};
std::unique_ptr<Resolver> Res = nullptr;
llvm::DenseSet<const llvm::Function *> VisitedFunctions{};
llvm::SmallVector<llvm::Function *, 1> UserEntryPoints{};

Expand Down Expand Up @@ -321,6 +321,28 @@ bool LLVMBasedICFG::Builder::constructDynamicCall(const llvm::Instruction *CS) {
return NewTargetsFound;
}

void LLVMBasedICFG::initialize(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
llvm::ArrayRef<std::string> EntryPoints,
LLVMTypeHierarchy *TH, Soundness S,
bool IncludeGlobals) {
Builder B{IRDB, this->TH.get(), &CGResolver};

B.initEntryPoints(EntryPoints);
B.initGlobalsAndWorkList(this, IncludeGlobals);

PHASAR_LOG_LEVEL_CAT(
INFO, "LLVMBasedICFG",
"Starting ICFG construction "
<< std::chrono::steady_clock::now().time_since_epoch().count());

this->CG = B.buildCallGraph(S);

PHASAR_LOG_LEVEL_CAT(
INFO, "LLVMBasedICFG",
"Finished ICFG construction "
<< std::chrono::steady_clock::now().time_since_epoch().count());
}

LLVMBasedICFG::LLVMBasedICFG(LLVMProjectIRDB *IRDB,
CallGraphAnalysisType CGType,
llvm::ArrayRef<std::string> EntryPoints,
Expand All @@ -333,29 +355,29 @@ LLVMBasedICFG::LLVMBasedICFG(LLVMProjectIRDB *IRDB,
this->TH = std::make_unique<LLVMTypeHierarchy>(*IRDB);
}

Builder B{IRDB, PT, this->TH.get()};
LLVMAliasInfo PTOwn;

if (!PT && CGType == CallGraphAnalysisType::OTF) {
PTOwn = std::make_unique<LLVMAliasSet>(IRDB);
B.PT = PTOwn.asRef();
PT = PTOwn.asRef();
}

B.Res = Resolver::create(CGType, IRDB, this->TH.get(), this, B.PT);
B.initEntryPoints(EntryPoints);
B.initGlobalsAndWorkList(this, IncludeGlobals);
auto CGRes = Resolver::create(CGType, IRDB, this->TH.get(), this, PT);
initialize(IRDB, *CGRes, EntryPoints, TH, S, IncludeGlobals);
}

PHASAR_LOG_LEVEL_CAT(
INFO, "LLVMBasedICFG",
"Starting ICFG construction "
<< std::chrono::steady_clock::now().time_since_epoch().count());
LLVMBasedICFG::LLVMBasedICFG(LLVMProjectIRDB *IRDB, Resolver &CGResolver,
llvm::ArrayRef<std::string> EntryPoints,
LLVMTypeHierarchy *TH, Soundness S,
bool IncludeGlobals)
: IRDB(IRDB), TH(TH) {
assert(IRDB != nullptr);

this->CG = B.buildCallGraph(S);
if (!TH) {
this->TH = std::make_unique<LLVMTypeHierarchy>(*IRDB);
}

PHASAR_LOG_LEVEL_CAT(
INFO, "LLVMBasedICFG",
"Finished ICFG construction "
<< std::chrono::steady_clock::now().time_since_epoch().count());
initialize(IRDB, CGResolver, EntryPoints, TH, S, IncludeGlobals);
}

LLVMBasedICFG::LLVMBasedICFG(CallGraph<n_t, f_t> CG, LLVMProjectIRDB *IRDB,
Expand Down

0 comments on commit 355af01

Please sign in to comment.