1717#include < map>
1818#include < string>
1919
20+ #include < llvm/Analysis/DDG.h>
21+ #include < llvm/Analysis/DDGPrinter.h>
22+
2023namespace tsar {
2124
2225template <typename CFGType, typename CFGNodeType>
@@ -137,6 +140,13 @@ class ControlDependenceGraph : public CDGBase<CFGType, CFGNodeType> {
137140 CFGType *mCFG ;
138141};
139142
143+ using SourceCDG=ControlDependenceGraph<SourceCFG, SourceCFGNode>;
144+ using IRCDGNode=CDGNode<llvm::Function, llvm::BasicBlock>;
145+ using DefaultIRCDGNode=DefaultCDGNode<llvm::Function, llvm::BasicBlock>;
146+ using EntryIRCDGNode=EntryCDGNode<llvm::Function, llvm::BasicBlock>;
147+ using IRCDGEdge=CDGEdge<llvm::Function, llvm::BasicBlock>;
148+ using IRCDG=ControlDependenceGraph<llvm::Function, llvm::BasicBlock>;
149+
140150}// namespace tsar
141151
142152namespace llvm {
@@ -281,4 +291,88 @@ using IRCDGPass=CDGPass<tsar::ControlDependenceGraph<Function, BasicBlock>>;
281291
282292};// namespace llvm
283293
294+ namespace tsar {
295+ class ControlPDGEdge : public llvm ::DDGEdge {
296+ public:
297+ ControlPDGEdge (llvm::DDGNode &TargetNode) : llvm::DDGEdge(TargetNode, EdgeKind::Unknown) {}
298+ };
299+
300+ class ProgramDependencyGraph : public llvm ::DataDependenceGraph {
301+ private:
302+ using Base=llvm::DataDependenceGraph;
303+ void construct (llvm::Function &F) {
304+ //
305+ for (auto INode : *this )
306+ for (auto Edge : INode->getEdges ())
307+ assert (Edge->getKind ()!=llvm::DDGEdge::EdgeKind::Unknown);
308+ //
309+ IRCDG *CDG=CDGBuilder<IRCDG>().populate (F);
310+ std::map<llvm::Instruction*, llvm::DDGNode*> InstrMap;
311+ for (auto INode : *this )
312+ if (llvm::isa<llvm::SimpleDDGNode>(INode))
313+ for (auto I : llvm::dyn_cast<llvm::SimpleDDGNode>(INode)->getInstructions ())
314+ InstrMap[I]=INode;
315+ for (auto It : InstrMap)
316+ if (It.first ->isTerminator ()) {
317+ IRCDGNode *CDGNode=CDG->getNode (It.first ->getParent ());
318+ for (auto CDGEdge : *CDGNode) {
319+ // llvm::BasicBlock *TargetBB=(llvm::dyn_cast<DefaultIRCDGNode>(CDGEdge->getTargetNode())).getBlock();
320+ llvm::BasicBlock *TargetBB=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode ()))->getBlock ();
321+ for (auto IIt=TargetBB->begin (); IIt!=TargetBB->end (); ++IIt)
322+ connect (*InstrMap[It.first ], *InstrMap[&(*IIt)], *(new ControlPDGEdge (*InstrMap[&(*IIt)])));
323+ }
324+ }
325+ for (auto RootEdge : getRoot ().getEdges ())
326+ delete RootEdge;
327+ getRoot ().clear ();
328+ for (auto CDGEdge : *(CDG->getEntryNode ()))
329+ // for (auto IIt=llvm::dyn_cast<DefaultIRCDGNode>(CDGEdge->getTargetNode()).getBlock()->begin();
330+ for (auto IIt=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode ()))->getBlock ()->begin ();
331+ // IIt!=llvm::dyn_cast<DefaultIRCDGNode>(&CDGEdge->getTargetNode())->getBlock()->end(); ++IIt)
332+ IIt!=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode ()))->getBlock ()->end (); ++IIt)
333+ connect (getRoot (), *InstrMap[&(*IIt)], *(new ControlPDGEdge (*InstrMap[&(*IIt)])));
334+ delete CDG;
335+ }
336+ public:
337+ ProgramDependencyGraph (llvm::Function &F, llvm::DependenceInfo &DI)
338+ : Base(F, DI) {
339+ construct (F);
340+ }
341+ };
342+ }
343+
344+ namespace llvm {
345+ template <>
346+ struct GraphTraits <tsar::ProgramDependencyGraph *> : public GraphTraits<DataDependenceGraph*> {};
347+
348+ template <>
349+ struct GraphTraits <const tsar::ProgramDependencyGraph *> : public GraphTraits<const DataDependenceGraph*> {};
350+
351+ template <>
352+ struct DOTGraphTraits <const tsar::ProgramDependencyGraph *> : public DOTGraphTraits<const DataDependenceGraph*> {
353+ private:
354+ using GT=GraphTraits<const tsar::ProgramDependencyGraph *>;
355+ using BaseDOTGT=DOTGraphTraits<const DataDependenceGraph*>;
356+ public:
357+ DOTGraphTraits (bool isSimple=false ) : BaseDOTGT(isSimple) {}
358+
359+ std::string getNodeLabel (const DDGNode *Node, const tsar::ProgramDependencyGraph *PDG) {
360+ return BaseDOTGT::getNodeLabel (Node, PDG);
361+ }
362+
363+ std::string getEdgeAttributes (const DDGNode *Node, typename GT::ChildIteratorType ChildNodeIt, const tsar::ProgramDependencyGraph *PDG) {
364+ assert ((*ChildNodeIt.getCurrent ())->getKind ()!=DDGEdge::EdgeKind::Rooted);
365+ switch ((*ChildNodeIt.getCurrent ())->getKind ()) {
366+ case DDGEdge::EdgeKind::Unknown:
367+ return " style=\" dashed\" " ;
368+ case DDGEdge::EdgeKind::RegisterDefUse:
369+ return " style=\" solid\" color=\" blue\" " +BaseDOTGT::getEdgeAttributes (Node, ChildNodeIt, PDG);
370+ case DDGEdge::EdgeKind::MemoryDependence:
371+ return " style=\" solid\" color=\" green\" " +BaseDOTGT::getEdgeAttributes (Node, ChildNodeIt, PDG);
372+ }
373+ }
374+ };
375+
376+ };
377+
284378#endif // TSAR_INCLUDE_BUILDPDG_H
0 commit comments