Add support for viewing the module graph via Graphviz, for debugging
purposes. llvm-svn: 141697
This commit is contained in:
parent
7148bce86e
commit
9d7c1a2a18
|
@ -146,6 +146,9 @@ public:
|
||||||
void visitDepthFirst(bool (*Visitor)(Module &M, bool Preorder,
|
void visitDepthFirst(bool (*Visitor)(Module &M, bool Preorder,
|
||||||
void *UserData),
|
void *UserData),
|
||||||
void *UserData);
|
void *UserData);
|
||||||
|
|
||||||
|
/// \brief View the graphviz representation of the module graph.
|
||||||
|
void viewGraph();
|
||||||
};
|
};
|
||||||
|
|
||||||
} } // end namespace clang::serialization
|
} } // end namespace clang::serialization
|
||||||
|
|
|
@ -16,6 +16,10 @@
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/Support/system_error.h"
|
#include "llvm/Support/system_error.h"
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#include "llvm/Support/GraphWriter.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace clang;
|
using namespace clang;
|
||||||
using namespace serialization;
|
using namespace serialization;
|
||||||
|
|
||||||
|
@ -202,3 +206,48 @@ void ModuleManager::visitDepthFirst(bool (*Visitor)(Module &M, bool Preorder,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
namespace llvm {
|
||||||
|
template<>
|
||||||
|
struct GraphTraits<ModuleManager> {
|
||||||
|
typedef Module NodeType;
|
||||||
|
typedef llvm::SetVector<Module *>::const_iterator ChildIteratorType;
|
||||||
|
typedef ModuleManager::ModuleConstIterator nodes_iterator;
|
||||||
|
|
||||||
|
static ChildIteratorType child_begin(NodeType *Node) {
|
||||||
|
return Node->Imports.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
static ChildIteratorType child_end(NodeType *Node) {
|
||||||
|
return Node->Imports.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
static nodes_iterator nodes_begin(const ModuleManager &Manager) {
|
||||||
|
return Manager.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
static nodes_iterator nodes_end(const ModuleManager &Manager) {
|
||||||
|
return Manager.end();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct DOTGraphTraits<ModuleManager> : public DefaultDOTGraphTraits {
|
||||||
|
explicit DOTGraphTraits(bool IsSimple = false)
|
||||||
|
: DefaultDOTGraphTraits(IsSimple) { }
|
||||||
|
|
||||||
|
static bool renderGraphFromBottomUp() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getNodeLabel(Module *M, const ModuleManager&) {
|
||||||
|
return llvm::sys::path::stem(M->FileName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModuleManager::viewGraph() {
|
||||||
|
llvm::ViewGraph(*this, "Modules");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue