docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
global_cfg_analysis.h
Go to the documentation of this file.
1#pragma once
2
3#include <llvm/ADT/StringRef.h>
4#include <llvm/IR/Module.h>
5#include <llvm/IR/ModuleSummaryIndex.h>
6#include <llvm/Support/raw_ostream.h>
7
8#include <boost/graph/adjacency_list.hpp>
9
10#include "analysis.h"
12#include "sdfg_registry.h"
13
14namespace docc::analysis {
15
16using Graph = boost::adjacency_list<boost::listS, boost::listS, boost::bidirectionalS>;
17using Vertex = boost::graph_traits<Graph>::vertex_descriptor;
18using Edge = boost::graph_traits<Graph>::edge_descriptor;
19
20static uint32_t next_node_id = 0;
21
22class SDFGCfgVisitor;
23
25
27 GlobalCFGNode(Vertex V, uint32_t modId, int64_t funcId)
28 : Vertex_(V), node_id_(next_node_id++), modId_(modId), funcId_(funcId) {
29 }
30 void print(llvm::raw_ostream& OS);
31
33 uint32_t node_id_;
34 uint32_t modId_;
35 int64_t funcId_;
36 llvm::GlobalValue::GUID Id_ = 0;
37 std::string Name_;
38
41 llvm::BasicBlock* BB_ = nullptr;
42 llvm::BasicBlock* fused_bb_last_ = nullptr;
43 int32_t first_bb_insn_idx_ = -1;
44 int32_t last_bb_insn_idx_ = -1;
46
47 llvm::Instruction* Inst_ = nullptr;
48 uint16_t evtSteps_ = 0;
49 bool suppress_ = false;
51};
52
53enum class EdgeType {
59 // CallSDFGInternal,
60 // CallSDFGCrossModule,
61 // CallSDFGCrossLibrary,
64};
65
66inline const char* getEdgeTypeName(EdgeType Type) {
67 switch (Type) {
69 return "Branch";
71 return "Sequence";
73 return "CallInternal";
75 return "CallExternal";
77 return "CallCrossModule";
78 // case EdgeType::CallSDFGInternal:
79 // return "CallSDFGInternal";
80 // case EdgeType::CallSDFGCrossModule:
81 // return "CallSDFGCrossModule";
82 // case EdgeType::CallSDFGCrossLibrary:
83 // return "CallSDFGCrossLibrary";
85 return "CallIndirect";
87 return "Return";
88 }
89 return "Unknown";
90}
91
94 Edge E,
95 EdgeType type,
96 GlobalCFGNode* from,
97 GlobalCFGNode* to,
98 int32_t fromEvtIdx = -1,
99 bool incRet = false,
100 int32_t toEvtIdx = -1
101 )
102 : Edge_(E), Type_(type), From_(from), To_(to), fromEvtIdx_(fromEvtIdx), toEvtIdx_(toEvtIdx), incRet_(incRet) {
103 }
104
109 int32_t fromEvtIdx_;
110 int32_t toEvtIdx_;
112};
113
115 friend class GlobalCFGBuilder;
116 friend class SDFGCfgVisitor;
117
118public:
119 static bool available(AnalysisManager& am);
120
121 void run(AnalysisManager& AM) override;
122
123 const Graph& getGraph() const {
124 return Graph_;
125 }
126 const GlobalCFGEdge& getEdge(Edge E) const {
127 return *Edges_.at(E);
128 }
129 const GlobalCFGNode& getNode(Vertex V) const {
130 return *Nodes_.at(V);
131 }
132 const GlobalCFGNode* getEntryPoint(llvm::StringRef Name) const {
133 return findNodeExternallyVisible(Name);
134 }
135 const std::vector<GlobalCFGNode*>* getExitPoints(llvm::GlobalValue::GUID id) const;
136 const std::vector<GlobalCFGNode*>* getExitPoints(llvm::StringRef name) const;
137
138
139private:
140 Graph Graph_;
141 std::map<Vertex, std::unique_ptr<GlobalCFGNode>> Nodes_;
142 std::map<Edge, std::unique_ptr<GlobalCFGEdge>> Edges_;
143 std::unordered_map<llvm::GlobalValue::GUID, GlobalCFGNode*> EntryPoints_;
144 std::unordered_map<llvm::GlobalValue::GUID, std::vector<GlobalCFGNode*>> ExitPoints_;
145 llvm::LLVMContext Ctx_;
146 std::vector<std::unique_ptr<llvm::Module>> Modules_;
147 llvm::StringMap<uint32_t> moduleIds_;
148 int64_t next_func_id_ = 0;
149
150 void addEntryPoint(llvm::GlobalValue::GUID Id, GlobalCFGNode* Node);
151 GlobalCFGNode* findNodeExternallyVisible(llvm::StringRef Name) const;
152
153 uint32_t getModuleId(llvm::StringRef modPath);
154};
155
156} // namespace docc::analysis
Definition analysis.h:14
friend class AnalysisManager
Definition analysis.h:15
Definition global_cfg_analysis.h:114
const std::vector< GlobalCFGNode * > * getExitPoints(llvm::StringRef name) const
const GlobalCFGEdge & getEdge(Edge E) const
Definition global_cfg_analysis.h:126
const GlobalCFGNode & getNode(Vertex V) const
Definition global_cfg_analysis.h:129
void run(AnalysisManager &AM) override
const Graph & getGraph() const
Definition global_cfg_analysis.h:123
const GlobalCFGNode * getEntryPoint(llvm::StringRef Name) const
Definition global_cfg_analysis.h:132
static bool available(AnalysisManager &am)
friend class SDFGCfgVisitor
Definition global_cfg_analysis.h:116
const std::vector< GlobalCFGNode * > * getExitPoints(llvm::GlobalValue::GUID id) const
friend class GlobalCFGBuilder
Definition global_cfg_analysis.h:115
This a wrapper around 1 SDFG (may include historic versions of the same SDFG in the future).
Definition sdfg_registry.h:40
Base class for all structured control flow nodes in a StructuredSDFG.
Definition control_flow_node.h:44
Represents a return statement that exits the function with a value.
Definition return.h:32
A sequential container of control flow nodes.
Definition sequence.h:52
Definition analysis.h:9
EdgeType
Definition global_cfg_analysis.h:53
@ CallIndirect
Definition global_cfg_analysis.h:62
@ CallCrossModule
Definition global_cfg_analysis.h:58
@ CallExternal
Definition global_cfg_analysis.h:57
@ Sequence
Definition global_cfg_analysis.h:55
@ Return
Definition global_cfg_analysis.h:63
@ CallInternal
Definition global_cfg_analysis.h:56
@ Branch
Definition global_cfg_analysis.h:54
CfgSpecialType
Definition global_cfg_analysis.h:24
@ D2H
Definition global_cfg_analysis.h:24
@ H2D
Definition global_cfg_analysis.h:24
@ None
Definition global_cfg_analysis.h:24
@ ErrorHandling
Definition global_cfg_analysis.h:24
static uint32_t next_node_id
Definition global_cfg_analysis.h:20
boost::graph_traits< Graph >::vertex_descriptor Vertex
Definition global_cfg_analysis.h:17
boost::adjacency_list< boost::listS, boost::listS, boost::bidirectionalS > Graph
Definition global_cfg_analysis.h:16
boost::graph_traits< Graph >::edge_descriptor Edge
Definition global_cfg_analysis.h:18
const char * getEdgeTypeName(EdgeType Type)
Definition global_cfg_analysis.h:66
Definition global_cfg_analysis.h:92
bool incRet_
Definition global_cfg_analysis.h:111
GlobalCFGNode * From_
Definition global_cfg_analysis.h:107
int32_t toEvtIdx_
Definition global_cfg_analysis.h:110
EdgeType Type_
Definition global_cfg_analysis.h:106
Edge Edge_
Definition global_cfg_analysis.h:105
GlobalCFGNode * To_
Definition global_cfg_analysis.h:108
int32_t fromEvtIdx_
Definition global_cfg_analysis.h:109
GlobalCFGEdge(Edge E, EdgeType type, GlobalCFGNode *from, GlobalCFGNode *to, int32_t fromEvtIdx=-1, bool incRet=false, int32_t toEvtIdx=-1)
Definition global_cfg_analysis.h:93
Definition global_cfg_analysis.h:26
CfgSpecialType specialType_
Definition global_cfg_analysis.h:50
uint32_t modId_
Definition global_cfg_analysis.h:34
int32_t last_bb_insn_idx_
Definition global_cfg_analysis.h:44
std::string Name_
Definition global_cfg_analysis.h:37
void print(llvm::raw_ostream &OS)
llvm::Instruction * Inst_
Definition global_cfg_analysis.h:47
llvm::GlobalValue::GUID Id_
Definition global_cfg_analysis.h:36
const sdfg::structured_control_flow::ControlFlowNode * sdfg_node_
Definition global_cfg_analysis.h:40
int64_t funcId_
Definition global_cfg_analysis.h:35
llvm::BasicBlock * BB_
Definition global_cfg_analysis.h:41
uint16_t evtSteps_
Definition global_cfg_analysis.h:48
GlobalCFGNode(Vertex V, uint32_t modId, int64_t funcId)
Definition global_cfg_analysis.h:27
Vertex Vertex_
Definition global_cfg_analysis.h:32
int32_t first_bb_insn_idx_
Definition global_cfg_analysis.h:43
bool suppress_
Definition global_cfg_analysis.h:49
docc::analysis::SDFGHolder * sdfg_
Definition global_cfg_analysis.h:39
llvm::BasicBlock * fused_bb_last_
Definition global_cfg_analysis.h:42
uint32_t node_id_
Definition global_cfg_analysis.h:33
bool last_insn_interesting_
Definition global_cfg_analysis.h:45