systemc-clang 2.0.0
Parsing SystemC constructs
Loading...
Searching...
No Matches
SplitCFG.h
Go to the documentation of this file.
1#ifndef _SPLIT_CFG_H_
2#define _SPLIT_CFG_H_
3
4#include <unordered_map>
5
6#include "SplitCFGBlock.h"
7#include "llvm/ADT/SmallVector.h"
8#include "llvm/ADT/SmallPtrSet.h"
9#include <set>
10namespace systemc_clang {
11
12/* \class Additional information for paths traversed in SplitCFG
13 */
14
17 SupplementaryInfo(const SplitCFGBlock *block);
18
20
22
23 virtual ~SupplementaryInfo();
24
26 int getPathId() const;
27
29 int getFalseId() const;
30
32 const SplitCFGBlock *getSplitCFGBlock() const;
33
38};
39
44 public:
45 using SplitCFGBlockPtrVector = llvm::SmallVector<const SplitCFGBlock *>;
46 friend class SplitCFG;
47
48 public:
49 SplitCFGPathInfo(const SplitCFGBlock *block);
50
53
55
56 virtual ~SplitCFGPathInfo();
57
59 bool isTruePathValid() const { return (true_path_.size() > 0); }
60
62 bool isFalsePathValid() const { return ((false_path_.size() > 0)); }
63
66
69
70 // int getpathix() { return false_startix; }
71
73 std::string toStringFalsePath() const;
74
76 std::string toStringTruePath() const;
77
79 void dump() const;
80
81 private:
83 const clang::CFGBlock *cfg_block_;
87};
88
92class SplitCFG {
93 public:
94 using SplitCFGPathPair = std::pair<const SplitCFGBlock *, SupplementaryInfo>;
95 using SplitCFGPath = llvm::SmallVector<SplitCFGPathPair>;
96
97 // TODO: deprecated
98 using VectorSplitCFGBlock = llvm::SmallVector<const SplitCFGBlock *>;
99 using VectorSplitCFGBlockImpl = llvm::SmallVector<const SplitCFGBlock *>;
101 llvm::SmallVectorImpl<const clang::CFGElement *>;
102 using VectorCFGElementPtr = llvm::SmallVector<const clang::CFGElement *>;
103
104 private:
106 clang::ASTContext &context_;
107
109 std::unique_ptr<clang::CFG> cfg_;
110
112 std::unordered_map<const clang::CFGBlock *, SplitCFGBlock> split_blocks_;
113
115 llvm::SmallVector<SplitCFGPath> paths_;
116
118 std::unordered_map<unsigned int, SplitCFGBlock *> sccfg_;
119
120 llvm::SmallVector<std::pair<VectorCFGElementPtrImpl, bool>> split_elements;
121
123 std::unordered_map<const SplitCFGBlock *,
124 std::pair<const SplitCFGBlock *, unsigned int>>
126
130 std::unordered_map<const SplitCFGBlock *, SplitCFGPathInfo> path_info_;
131
132 llvm::SmallVector<std::unordered_map<const SplitCFGBlock *, SplitCFGPathInfo>>
134
136
137 unsigned int next_state_count_;
138
141
144 std::map<SplitCFGBlock*,SplitCFGBlock*> cop_;
145
146 private:
148 bool isElementWait(const clang::CFGElement &element) const;
149
152 void splitBlock(clang::CFGBlock *block);
153
155 void addSuccessors(SplitCFGBlock *to, const clang::CFGBlock *from);
156
158 void addPredecessors(SplitCFGBlock *to, const clang::CFGBlock *from);
159
161
165 void createUnsplitBlocks();
166
169 clang::CFGBlock *block,
170 const llvm::SmallVectorImpl<std::pair<VectorCFGElementPtr, bool>>
172
175 const llvm::SmallVector<std::pair<VectorCFGElementPtr, bool>>
176 &split_elements) const;
177
178 void dumpSCCFG() const;
179
180 public:
182 SplitCFG(clang::ASTContext &context);
184 SplitCFG(clang::ASTContext &context, const clang::CXXMethodDecl *cxx_decl);
185
187 SplitCFG(const SplitCFG &from) = delete;
188
190 SplitCFG &operator=(const SplitCFG &) = delete;
191
193 virtual ~SplitCFG();
194
196 // const llvm::SmallVectorImpl<VectorSplitCFGBlock> &
197
198 const llvm::SmallVectorImpl<llvm::SmallVector<SplitCFGPathPair>>
199 &getPathsFound();
200
202 void construct_sccfg(const clang::CXXMethodDecl *method);
203
205 void generate_paths();
206
207 const std::unordered_map<const SplitCFGBlock *, SplitCFGPathInfo>
208 &getPathInfo() const;
209
210 const llvm::SmallVector<std::unordered_map<const SplitCFGBlock *, SplitCFGPathInfo>>
211 &getAllPathInfo() const;
212
213 void preparePathInfo();
216 llvm::APInt getWaitArgument(const clang::CFGElement &element) const;
217
218
220 void dump() const;
221 void dumpToDot() const;
222 void dumpWaitNextStates() const;
223 void dumpPaths() const;
224 void dumpCurrPath(
225 // llvm::SmallVector<std::pair<const SplitCFGBlock *, SplitCFGPathInfo>>
226 SplitCFGPath &curr_path) const;
227
228 void dumpPathInfo() const;
229 void dumpAllPathInfo() const;
230
232 //
233 //
234
235 // Identify confluence blocks.
236 //
238 std::map<SplitCFGBlock*,SplitCFGBlock*> getConfluenceBlocks() const;
239
242 std::set<SplitCFGBlock*> identifySkipBlocks();
243
245
246 template <typename T>
247 void dumpSmallVector(llvm::SmallVectorImpl<T> &vlist) {
248 for (const auto v : vlist) {
249 llvm::dbgs() << v.first->getBlockID() << " ";
250 }
251 }
252
260
261 const SplitCFGPath // llvm::SmallVector<std::pair<const SplitCFGBlock *,
262 // SplitCFGPathInfo>>
264 llvm::SmallPtrSet<const SplitCFGBlock *, 32> &visited_blocks,
265 llvm::SmallVectorImpl<const SplitCFGBlock *> &waits_to_visit,
266 llvm::SmallPtrSetImpl<const SplitCFGBlock *> &visited_waits,
267 llvm::SmallVector<SplitCFGPathPair> &curr_path);
268 void dfs_rework();
269
272 bool isTernaryOperator(const SplitCFGBlock *block) const;
273
275 bool isLoop(const SplitCFGBlock *block) const;
276
280 bool isConditional(const SplitCFGBlock *block) const;
281
284 llvm::SmallPtrSetImpl<const SplitCFGBlock *> &visited,
285 const SplitCFGBlock *&block);
286
287 bool isLoopWithTwoSuccessors(const SplitCFGBlock *block) const;
289 bool parent_has_wait, const SplitCFGBlock *BB,
290 llvm::SmallVector<
291 std::pair<const SplitCFGBlock *, SplitCFGBlock::const_succ_iterator>,
292 8> &to_visit,
293 bool found);
294
295 bool isTruePath(const SplitCFGBlock *parent_block,
296 const SplitCFGBlock *block) const;
297
299 void setDifference(
300 const llvm::SmallPtrSetImpl<const SplitCFGBlock *> &larger,
301 const llvm::SmallPtrSetImpl<const SplitCFGBlock *> &smaller,
302 llvm::SmallPtrSetImpl<const SplitCFGBlock *> &to);
303 void setTruePathInfo(const SplitCFGBlock *sblock,
304 // const llvm::SmallVector< std::pair<const SplitCFGBlock
305 // *, SplitCFGPathInfo>> &newly_visited,
306 const SplitCFGPath &newly_visited, int ix = -1);
307
308 void setFalsePathInfo(const SplitCFGBlock *sblock,
309 const SplitCFGPath &newly_visited);
310 // const llvm::SmallVector<
311 // std::pair<const SplitCFGBlock *, SplitCFGPathInfo>> &newly_visited);
312
313 void addPathToSpecialNode(const SplitCFGPath &from);
314
316 llvm::SmallPtrSetImpl<const SplitCFGBlock *> &to,
317 const llvm::SmallPtrSetImpl<const SplitCFGBlock *> &from);
318 void dumpVisitedBlocks(llvm::SmallPtrSetImpl<const SplitCFGBlock *> &visited);
319
321
323 public:
324 // void make_edge_pairs( const SplitCFGBlock* block );
325};
326
327}; // namespace systemc_clang
328
329#endif /* _SPLIT_CFG_H_ */
SuccessorIterator::const_iterator const_succ_iterator
SplitCFGBlockPtrVector true_path_
Definition SplitCFG.h:86
SplitCFGBlockPtrVector false_path_
Definition SplitCFG.h:85
llvm::SmallVector< const SplitCFGBlock * > SplitCFGBlockPtrVector
Definition SplitCFG.h:45
bool isFalsePathValid() const
Return if there is a valid FALSE path.
Definition SplitCFG.h:62
SplitCFGPathInfo(const SplitCFGBlock *block)
class SplitCFGPathInfo
Definition SplitCFG.cpp:55
const SplitCFGBlockPtrVector & getFalsePath() const
Return the list of blocks visited on the FALSE path.
Definition SplitCFG.h:68
const SplitCFGBlockPtrVector & getTruePath() const
Return the list of blocks visited on the TRUE path.
Definition SplitCFG.h:65
const clang::CFGBlock * cfg_block_
Definition SplitCFG.h:83
void dump() const
Dump the paths.
Definition SplitCFG.cpp:101
std::string toStringFalsePath() const
Converts the TRUE path into a string for testing.
Definition SplitCFG.cpp:75
bool isTruePathValid() const
Return if there is a valid TRUE path.
Definition SplitCFG.h:59
SplitCFGPathInfo & operator=(const SplitCFGPathInfo &from)
Definition SplitCFG.cpp:65
std::string toStringTruePath() const
Converts the FALSE path into a string for testing.
Definition SplitCFG.cpp:88
const SplitCFGBlock * split_block_
Definition SplitCFG.h:82
unsigned int next_state_count_
Definition SplitCFG.h:137
SplitCFGPath sub_path_to_special_node_
Definition SplitCFG.h:135
llvm::SmallVector< const SplitCFGBlock * > VectorSplitCFGBlockImpl
Definition SplitCFG.h:99
std::unordered_map< const SplitCFGBlock *, std::pair< const SplitCFGBlock *, unsigned int > > wait_next_state_
Predecessor SplitCFGBlock* => (Wait SplitCFGBlock*)
Definition SplitCFG.h:125
bool has_ternary_op_
Set to true if the CFG has a ternary operator (ConditionalOperator).
Definition SplitCFG.h:140
void addSuccessorToVisitOrPop(bool parent_has_wait, const SplitCFGBlock *BB, llvm::SmallVector< std::pair< const SplitCFGBlock *, SplitCFGBlock::const_succ_iterator >, 8 > &to_visit, bool found)
Definition SplitCFG.cpp:454
void setTruePathInfo(const SplitCFGBlock *sblock, const SplitCFGPath &newly_visited, int ix=-1)
Definition SplitCFG.cpp:385
void splitBlock(clang::CFGBlock *block)
Split a CFGBlock into respective SplitCFGBlock if the CFGBlock has wait statements in it.
Definition SplitCFG.cpp:642
bool isConditional(const SplitCFGBlock *block) const
Checks if the block is a conditional. Note that this is different than ternary since the terminator i...
Definition SplitCFG.cpp:487
void dumpWaitNextStates() const
Definition SplitCFG.cpp:848
void dump() const
Dump member functions.
SplitCFG(const SplitCFG &from)=delete
Disallow a copy constructor for SCCFG.
llvm::SmallVector< const SplitCFGBlock * > VectorSplitCFGBlock
Definition SplitCFG.h:98
void dumpSmallVector(llvm::SmallVectorImpl< T > &vlist)
Definition SplitCFG.h:247
bool isElementWait(const clang::CFGElement &element) const
Checks if a CFGBlock has a wait() call in it.
Definition SplitCFG.cpp:614
void updateVisitedBlocks(llvm::SmallPtrSetImpl< const SplitCFGBlock * > &to, const llvm::SmallPtrSetImpl< const SplitCFGBlock * > &from)
Definition SplitCFG.cpp:437
void dumpPathInfo() const
Definition SplitCFG.cpp:936
void generate_paths()
Generates the paths between wait statements.
Definition SplitCFG.cpp:836
clang::ASTContext & context_
The context necessary to access translation unit.
Definition SplitCFG.h:106
void identifyConfluenceBlocks()
Identify confluence blocks in the CFG.
bool getUnvisitedSuccessor(const SplitCFGBlock *curr_block, SplitCFGBlock::const_succ_iterator &I, llvm::SmallPtrSetImpl< const SplitCFGBlock * > &visited, const SplitCFGBlock *&block)
Definition SplitCFG.cpp:472
std::set< SplitCFGBlock * > identifySkipBlocks()
std::pair< const SplitCFGBlock *, SupplementaryInfo > SplitCFGPathPair
Definition SplitCFG.h:94
bool isTruePath(const SplitCFGBlock *parent_block, const SplitCFGBlock *block) const
Definition SplitCFG.cpp:419
void setFalsePathInfo(const SplitCFGBlock *sblock, const SplitCFGPath &newly_visited)
Definition SplitCFG.cpp:396
SplitCFG(clang::ASTContext &context)
Constructor.
bool isLoop(const SplitCFGBlock *block) const
Checks if the block is a loop block.
Definition SplitCFG.cpp:506
const llvm::SmallVectorImpl< llvm::SmallVector< SplitCFGPathPair > > & getPathsFound()
Returns the paths that were found in the SCCFG.
void dumpCurrPath(SplitCFGPath &curr_path) const
Definition SplitCFG.cpp:861
llvm::SmallVector< SplitCFGPathPair > SplitCFGPath
Definition SplitCFG.h:95
void addSuccessors(SplitCFGBlock *to, const clang::CFGBlock *from)
Add successors to the SplitCFGBlock.
Definition SplitCFG.cpp:788
std::unordered_map< const clang::CFGBlock *, SplitCFGBlock > split_blocks_
The split blocks in the CFG.
Definition SplitCFG.h:112
llvm::APInt getWaitArgument(const clang::CFGElement &element) const
Returns the argument to a wait statement. Note that the only one supported are no arguments or intege...
Definition SplitCFG.cpp:583
llvm::SmallVector< SplitCFGPath > paths_
Paths of BBs generated.
Definition SplitCFG.h:115
bool isLoopWithTwoSuccessors(const SplitCFGBlock *block) const
Definition SplitCFG.cpp:445
void setDifference(const llvm::SmallPtrSetImpl< const SplitCFGBlock * > &larger, const llvm::SmallPtrSetImpl< const SplitCFGBlock * > &smaller, llvm::SmallPtrSetImpl< const SplitCFGBlock * > &to)
Compute the set difference between two SmallPtrSets.
Definition SplitCFG.cpp:408
llvm::SmallVector< std::pair< VectorCFGElementPtrImpl, bool > > split_elements
Definition SplitCFG.h:120
const llvm::SmallVector< std::unordered_map< const SplitCFGBlock *, SplitCFGPathInfo > > & getAllPathInfo() const
void addPathToSpecialNode(const SplitCFGPath &from)
Definition SplitCFG.cpp:117
llvm::SmallVector< std::unordered_map< const SplitCFGBlock *, SplitCFGPathInfo > > all_path_info_
Definition SplitCFG.h:133
std::unordered_map< const SplitCFGBlock *, SplitCFGPathInfo > path_info_
Map a SplitCFGBlock* to its path information. Stores the path information for the blocks that are imp...
Definition SplitCFG.h:130
std::unordered_map< unsigned int, SplitCFGBlock * > sccfg_
The block id to block for SCCFG.
Definition SplitCFG.h:118
llvm::SmallVectorImpl< const clang::CFGElement * > VectorCFGElementPtrImpl
Definition SplitCFG.h:100
const std::unordered_map< const SplitCFGBlock *, SplitCFGPathInfo > & getPathInfo() const
void createWaitSplitCFGBlocks(clang::CFGBlock *block, const llvm::SmallVectorImpl< std::pair< VectorCFGElementPtr, bool > > &split_elements)
Creates the SplitCFGBlocks for CFGBlock with a wait.
Definition SplitCFG.cpp:705
bool isTernaryOperator(const SplitCFGBlock *block) const
Checks if the block is contains a terminator that is a ternary operator.
Definition SplitCFG.cpp:498
SplitCFGBlock * outter_top
Definition SplitCFG.h:244
std::map< SplitCFGBlock *, SplitCFGBlock * > getConfluenceBlocks() const
Rework.
llvm::SmallVector< const clang::CFGElement * > VectorCFGElementPtr
Definition SplitCFG.h:102
void createUnsplitBlocks()
Creates SplitCFGBlocks for all CFGBlocks that do not have a wiat. splitBlock() creates the SplitCFGBl...
Definition SplitCFG.cpp:948
std::map< SplitCFGBlock *, SplitCFGBlock * > cop_
Definition SplitCFG.h:144
virtual ~SplitCFG()
Destructor that erases all SplitCFGBlocks created.
SplitCFG & operator=(const SplitCFG &)=delete
Disallow assignment operator.
void dumpVisitedBlocks(llvm::SmallPtrSetImpl< const SplitCFGBlock * > &visited)
Definition SplitCFG.cpp:428
void construct_sccfg(const clang::CXXMethodDecl *method)
Construct the SCCFG.
Definition SplitCFG.cpp:987
void dumpSplitElements(const llvm::SmallVector< std::pair< VectorCFGElementPtr, bool > > &split_elements) const
Dump all the CFGElements that were split.
Definition SplitCFG.cpp:816
void addPredecessors(SplitCFGBlock *to, const clang::CFGBlock *from)
Add predecessors to the SplitCFGBlock.
Definition SplitCFG.cpp:798
void dumpAllPathInfo() const
Definition SplitCFG.cpp:919
const SplitCFGPath dfs_visit_wait(const SplitCFGBlock *BB, llvm::SmallPtrSet< const SplitCFGBlock *, 32 > &visited_blocks, llvm::SmallVectorImpl< const SplitCFGBlock * > &waits_to_visit, llvm::SmallPtrSetImpl< const SplitCFGBlock * > &visited_waits, llvm::SmallVector< SplitCFGPathPair > &curr_path)
Modified DFS to create all paths within wait statements and from the root node.
Definition SplitCFG.cpp:127
std::unique_ptr< clang::CFG > cfg_
The saved CFG for a given method.
Definition SplitCFG.h:109
SupplementaryInfo(const SplitCFGBlock *block)
Construct object using SplitCFGBlock.
Definition SplitCFG.cpp:28
int getPathId() const
Returns the path identifier.
Definition SplitCFG.cpp:42
int getFalseId() const
Returns the path identifier for the false path.
Definition SplitCFG.cpp:44
SupplementaryInfo & operator=(const SupplementaryInfo &from)
Definition SplitCFG.cpp:35
const SplitCFGBlock * getSplitCFGBlock() const
Returns pointer to the SplitCFGBlock.
Definition SplitCFG.cpp:46
const SplitCFGBlock * split_block_
Member variables.
Definition SplitCFG.h:35