[llvm-commits] [llvm] r50724 - in /llvm/trunk: tools/llvmc2/Common.td tools/llvmc2/CompilationGraph.cpp tools/llvmc2/CompilationGraph.h tools/llvmc2/Example.td tools/llvmc2/ExampleWithOpt.td tools/llvmc2/llvmc.cpp utils/TableGen/LLVMCCConfigurationEmitter.cpp
Tanya Lattner
lattner at apple.com
Tue May 6 10:45:28 PDT 2008
Please add doxygen style comments (///) to all functions and classes.
-Tanya
On May 6, 2008, at 9:35 AM, Mikhail Glushenkov wrote:
> Author: foldr
> Date: Tue May 6 11:35:25 2008
> New Revision: 50724
>
> URL: http://llvm.org/viewvc/llvm-project?rev=50724&view=rev
> Log:
> Convert internal representation to use DAG. This gives us more
> flexibility and enables future improvements.
>
> Modified:
> llvm/trunk/tools/llvmc2/Common.td
> llvm/trunk/tools/llvmc2/CompilationGraph.cpp
> llvm/trunk/tools/llvmc2/CompilationGraph.h
> llvm/trunk/tools/llvmc2/Example.td
> llvm/trunk/tools/llvmc2/ExampleWithOpt.td
> llvm/trunk/tools/llvmc2/llvmc.cpp
> llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp
>
> Modified: llvm/trunk/tools/llvmc2/Common.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> Common.td?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/Common.td (original)
> +++ llvm/trunk/tools/llvmc2/Common.td Tue May 6 11:35:25 2008
> @@ -15,6 +15,10 @@
> list<dag> properties = l;
> }
>
> +// Special Tool instance - root of all toolchains
> +
> +def root : Tool<[]>;
> +
> // Possible Tool properties
>
> def in_language;
> @@ -52,12 +56,13 @@
> list<LangToSuffixes> map = lst;
> }
>
> -// Toolchain classes
> +// Compilation graph
>
> -class ToolChain <list<Tool> lst> {
> - list <Tool> tools = lst;
> +class Edge<Tool t1, Tool t2> {
> + Tool a = t1;
> + Tool b = t2;
> }
>
> -class ToolChains <list<ToolChain> lst> {
> - list<ToolChain> chains = lst;
> +class CompilationGraph<list<Edge> lst> {
> + list<Edge> edges = lst;
> }
>
> Modified: llvm/trunk/tools/llvmc2/CompilationGraph.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> CompilationGraph.cpp?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/CompilationGraph.cpp (original)
> +++ llvm/trunk/tools/llvmc2/CompilationGraph.cpp Tue May 6
> 11:35:25 2008
> @@ -14,46 +14,120 @@
> #include "CompilationGraph.h"
>
> #include "llvm/Support/CommandLine.h"
> -#include "llvm/ADT/STLExtras.h"
> +#include "llvm/Support/DOTGraphTraits.h"
> +#include "llvm/Support/GraphWriter.h"
>
> #include <stdexcept>
>
> using namespace llvm;
> +using namespace llvmcc;
>
> extern cl::list<std::string> InputFilenames;
> extern cl::opt<std::string> OutputFilename;
>
> -int llvmcc::CompilationGraph::Build (const sys::Path& tempDir)
> const {
> - sys::Path In(InputFilenames.at(0)), Out;
> +CompilationGraph::CompilationGraph() {
> + NodesMap["root"] = Node(this);
> +}
> +
> +Node& CompilationGraph::getNode(const std::string& ToolName) {
> + nodes_map_type::iterator I = NodesMap.find(ToolName);
> + if (I == NodesMap.end())
> + throw std::runtime_error("Node " + ToolName + " is not in
> graph");
> + return I->second;
> +}
> +
> +const Node& CompilationGraph::getNode(const std::string& ToolName)
> const {
> + nodes_map_type::const_iterator I = NodesMap.find(ToolName);
> + if (I == NodesMap.end())
> + throw std::runtime_error("Node " + ToolName + " is not in
> graph!");
> + return I->second;
> +}
>
> - // Find out which language corresponds to the suffix of the
> first input file
> - LanguageMap::const_iterator Lang = ExtsToLangs.find(In.getSuffix
> ());
> +const std::string& CompilationGraph::getLanguage(const sys::Path&
> File) const {
> + LanguageMap::const_iterator Lang = ExtsToLangs.find
> (File.getSuffix());
> if (Lang == ExtsToLangs.end())
> - throw std::runtime_error("Unknown suffix!");
> + throw std::runtime_error("Unknown suffix: " + File.getSuffix()
> + '!');
> + return Lang->second;
> +}
> +
> +const CompilationGraph::tools_vector_type&
> +CompilationGraph::getToolsVector(const std::string& LangName) const
> +{
> + tools_map_type::const_iterator I = ToolsMap.find(LangName);
> + if (I == ToolsMap.end())
> + throw std::runtime_error("No tools corresponding to " + LangName
> + + " found!");
> + return I->second;
> +}
> +
> +void CompilationGraph::insertVertex(const IntrusiveRefCntPtr<Tool>
> V) {
> + if (!NodesMap.count(V->Name())) {
> + Node N;
> + N.OwningGraph = this;
> + N.ToolPtr = V;
> + NodesMap[V->Name()] = N;
> + }
> +}
>
> - // Find the toolchain corresponding to this language
> - ToolChainMap::const_iterator ToolsIt = ToolChains.find(Lang-
> >second);
> - if (ToolsIt == ToolChains.end())
> - throw std::runtime_error("Unknown language!");
> - ToolChain Tools = ToolsIt->second;
> +void CompilationGraph::insertEdge(const std::string& A,
> + const std::string& B) {
> + // TOTHINK: check this at compile-time?
> + if (B == "root")
> + throw std::runtime_error("Edges back to the root are not
> allowed!"
> + "Compilation graph should be acyclic!");
> +
> + if (A == "root") {
> + const Node& N = getNode(B);
> + const std::string& InputLanguage = N.ToolPtr->InputLanguage();
> + ToolsMap[InputLanguage].push_back(B);
>
> + // Needed to support iteration via GraphTraits.
> + NodesMap["root"].Children.push_back(B);
> + }
> + else {
> + Node& NA = getNode(A);
> + // Check that there is a node at B.
> + getNode(B);
> + NA.Children.push_back(B);
> + }
> +}
> +
> +// TOFIX: extend, add an ability to choose between different
> +// toolchains, support more interesting graph topologies.
> +int CompilationGraph::Build (const sys::Path& tempDir) const {
> PathVector JoinList;
> + const Tool* JoinTool = 0;
> + sys::Path In, Out;
>
> + // For each input file
> for (cl::list<std::string>::const_iterator B =
> InputFilenames.begin(),
> E = InputFilenames.end(); B != E; ++B) {
> In = sys::Path(*B);
>
> - // Pass input file through the toolchain
> - for (ToolChain::const_iterator B = Tools.begin(), E = Tools.end
> ();
> - B != E; ++B) {
> + // Get to the head of the toolchain.
> + const tools_vector_type& TV = getToolsVector(getLanguage(In));
> + if(TV.empty())
> + throw std::runtime_error("Tool names vector is empty!");
> + const Node* N = &getNode(*TV.begin());
> +
> + // Pass it through the chain until we bump into a Join node or a
> + // node that says that it is the last.
> + bool Last = false;
> + while(!Last) {
> + const Tool* CurTool = N->ToolPtr.getPtr();
>
> - const Tool* CurTool = B->getPtr();
> -
> - // Is this the last step in the chain?
> - if (llvm::next(B) == E || CurTool->IsLast()) {
> + if(CurTool->IsJoin()) {
> JoinList.push_back(In);
> + JoinTool = CurTool;
> break;
> }
> +
> + // Is this the last tool?
> + if (N->Children.empty() || CurTool->IsLast()) {
> + Out.appendComponent(In.getBasename());
> + Out.appendSuffix(CurTool->OutputSuffix());
> + Last = true;
> + }
> else {
> Out = tempDir;
> Out.appendComponent(In.getBasename());
> @@ -65,24 +139,57 @@
> if (CurTool->GenerateAction(In, Out).Execute() != 0)
> throw std::runtime_error("Tool returned error code!");
>
> + N = &getNode(*N->Children.begin());
> In = Out; Out.clear();
> }
> }
>
> - // Pass .o files to linker
> - const Tool* JoinNode = (--Tools.end())->getPtr();
> + if(JoinTool) {
> + // If the final output name is empty, set it to "a.out"
> + if (!OutputFilename.empty()) {
> + Out = sys::Path(OutputFilename);
> + }
> + else {
> + Out = sys::Path("a");
> + Out.appendSuffix(JoinTool->OutputSuffix());
> + }
>
> - // If the final output name is empty, set it to "a.out"
> - if (!OutputFilename.empty()) {
> - Out = sys::Path(OutputFilename);
> + if (JoinTool->GenerateAction(JoinList, Out).Execute() != 0)
> + throw std::runtime_error("Tool returned error code!");
> }
> - else {
> - Out = sys::Path("a");
> - Out.appendSuffix(JoinNode->OutputSuffix());
> +
> + return 0;
> +}
> +
> +namespace llvm {
> + template <>
> + struct DOTGraphTraits<llvmcc::CompilationGraph*>
> + : public DefaultDOTGraphTraits
> + {
> +
> + template<typename GraphType>
> + static std::string getNodeLabel(const Node* N, const GraphType&) {
> + if (N->ToolPtr)
> + return N->ToolPtr->Name();
> + else
> + return "root";
> }
>
> - if (JoinNode->GenerateAction(JoinList, Out).Execute() != 0)
> - throw std::runtime_error("Tool returned error code!");
> + };
> +}
>
> - return 0;
> +void CompilationGraph::writeGraph() {
> + std::ofstream O("CompilationGraph.dot");
> +
> + if(O.good()) {
> + llvm::WriteGraph(this, "CompilationGraph");
> + O.close();
> + }
> + else {
> + throw std::runtime_error("");
> + }
> +}
> +
> +void CompilationGraph::viewGraph() {
> + llvm::ViewGraph(this, "CompilationGraph");
> }
>
> Modified: llvm/trunk/tools/llvmc2/CompilationGraph.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> CompilationGraph.h?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/CompilationGraph.h (original)
> +++ llvm/trunk/tools/llvmc2/CompilationGraph.h Tue May 6 11:35:25
> 2008
> @@ -17,20 +17,196 @@
> #include "AutoGenerated.h"
> #include "Tool.h"
>
> +#include "llvm/ADT/GraphTraits.h"
> +#include "llvm/ADT/iterator"
> +#include "llvm/ADT/SmallVector.h"
> #include "llvm/ADT/StringMap.h"
> #include "llvm/System/Path.h"
>
> +#include <string>
> +
> namespace llvmcc {
>
> - typedef std::vector<llvm::IntrusiveRefCntPtr<Tool> > ToolChain;
> - typedef llvm::StringMap<ToolChain> ToolChainMap;
> + class CompilationGraph;
> +
> + struct Node {
> + typedef llvm::SmallVector<std::string, 3> sequence_type;
> +
> + Node() {}
> + Node(CompilationGraph* G) : OwningGraph(G) {}
> + Node(CompilationGraph* G, Tool* T) : OwningGraph(G), ToolPtr
> (T) {}
> +
> + // Needed to implement NodeChildIterator/GraphTraits
> + CompilationGraph* OwningGraph;
> + // The corresponding Tool.
> + llvm::IntrusiveRefCntPtr<Tool> ToolPtr;
> + // Links to children.
> + sequence_type Children;
> + };
> +
> + // This can be generalised to something like value_iterator for
> maps
> + class NodesIterator : public llvm::StringMap<Node>::iterator {
> + typedef llvm::StringMap<Node>::iterator super;
> + typedef NodesIterator ThisType;
> + typedef Node* pointer;
> + typedef Node& reference;
> +
> + public:
> + NodesIterator(super I) : super(I) {}
> +
> + inline reference operator*() const {
> + return super::operator->()->second;
> + }
> + inline pointer operator->() const {
> + return &super::operator->()->second;
> + }
> + };
> +
> + class CompilationGraph {
> + typedef llvm::StringMap<Node> nodes_map_type;
> + typedef llvm::SmallVector<std::string, 3> tools_vector_type;
> + typedef llvm::StringMap<tools_vector_type> tools_map_type;
>
> - struct CompilationGraph {
> - ToolChainMap ToolChains;
> + // Map from file extensions to language names.
> LanguageMap ExtsToLangs;
> + // Map from language names to lists of tool names.
> + tools_map_type ToolsMap;
> + // Map from tool names to Tool objects.
> + nodes_map_type NodesMap;
> +
> + public:
> +
> + CompilationGraph();
> +
> + // insertVertex - insert a new node into the graph.
> + void insertVertex(const llvm::IntrusiveRefCntPtr<Tool> T);
>
> + // insertEdge - Insert a new edge into the graph. This function
> + // assumes that both A and B have been already inserted.
> + void insertEdge(const std::string& A, const std::string& B);
> +
> + // Build - Build the target(s) from the set of the input
> + // files. Command-line options are passed implicitly as global
> + // variables.
> int Build(llvm::sys::Path const& tempDir) const;
> +
> + /// viewGraph - This function is meant for use from the debugger.
> + /// You can just say 'call G->viewGraph()' and a ghostview window
> + /// should pop up from the program, displaying the compilation
> + /// graph. This depends on there being a 'dot' and 'gv' program
> + /// in your path.
> + void viewGraph();
> +
> + /// Write a CompilationGraph.dot file.
> + void writeGraph();
> +
> + // GraphTraits support
> +
> + typedef NodesIterator nodes_iterator;
> +
> + nodes_iterator nodes_begin() {
> + return NodesIterator(NodesMap.begin());
> + }
> +
> + nodes_iterator nodes_end() {
> + return NodesIterator(NodesMap.end());
> + }
> +
> + // Return a reference to the node correponding to the given tool
> + // name. Throws std::runtime_error in case of error.
> + Node& getNode(const std::string& ToolName);
> + const Node& getNode(const std::string& ToolName) const;
> +
> + // Auto-generated function.
> + friend void PopulateCompilationGraph(CompilationGraph&);
> +
> + private:
> + // Helper function - find out which language corresponds to the
> + // suffix of this file
> + const std::string& getLanguage(const llvm::sys::Path& File)
> const;
> +
> + // Return a reference to the tool names list correponding to the
> + // given language name. Throws std::runtime_error in case of
> + // error.
> + const tools_vector_type& getToolsVector(const std::string&
> LangName) const;
> + };
> +
> + // Auxiliary class needed to implement GraphTraits support.
> + class NodeChildIterator : public bidirectional_iterator<Node,
> ptrdiff_t> {
> + typedef NodeChildIterator ThisType;
> + typedef Node::sequence_type::iterator iterator;
> +
> + CompilationGraph* OwningGraph;
> + iterator KeyIter;
> + public:
> + typedef Node* pointer;
> + typedef Node& reference;
> +
> + NodeChildIterator(Node* N, iterator I) :
> + OwningGraph(N->OwningGraph), KeyIter(I) {}
> +
> + const ThisType& operator=(const ThisType& I) {
> + assert(OwningGraph == I.OwningGraph);
> + KeyIter = I.KeyIter;
> + return *this;
> + }
> +
> + inline bool operator==(const ThisType& I) const
> + { return KeyIter == I.KeyIter; }
> + inline bool operator!=(const ThisType& I) const
> + { return KeyIter != I.KeyIter; }
> +
> + inline pointer operator*() const {
> + return &OwningGraph->getNode(*KeyIter);
> + }
> + inline pointer operator->() const {
> + return &OwningGraph->getNode(*KeyIter);
> + }
> +
> + ThisType& operator++() { ++KeyIter; return *this; } //
> Preincrement
> + ThisType operator++(int) { // Postincrement
> + ThisType tmp = *this;
> + ++*this;
> + return tmp;
> + }
> +
> + inline ThisType& operator--() { --KeyIter; return *this; } //
> Predecrement
> + inline ThisType operator--(int) { // Postdecrement
> + ThisType tmp = *this;
> + --*this;
> + return tmp;
> + }
> +
> };
> }
>
> +namespace llvm {
> + template <>
> + struct GraphTraits<llvmcc::CompilationGraph*> {
> + typedef llvmcc::CompilationGraph GraphType;
> + typedef llvmcc::Node NodeType;
> + typedef llvmcc::NodeChildIterator ChildIteratorType;
> +
> + static NodeType* getEntryNode(GraphType* G) {
> + return &G->getNode("root");
> + }
> +
> + static ChildIteratorType child_begin(NodeType* N) {
> + return ChildIteratorType(N, N->Children.begin());
> + }
> + static ChildIteratorType child_end(NodeType* N) {
> + return ChildIteratorType(N, N->Children.end());
> + }
> +
> + typedef GraphType::nodes_iterator nodes_iterator;
> + static nodes_iterator nodes_begin(GraphType *G) {
> + return G->nodes_begin();
> + }
> + static nodes_iterator nodes_end(GraphType *G) {
> + return G->nodes_end();
> + }
> + };
> +
> +}
> +
> #endif // LLVM_TOOLS_LLVMC2_COMPILATION_GRAPH_H
>
> Modified: llvm/trunk/tools/llvmc2/Example.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> Example.td?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/Example.td (original)
> +++ llvm/trunk/tools/llvmc2/Example.td Tue May 6 11:35:25 2008
> @@ -7,7 +7,7 @@
> //
> //
> ===-------------------------------------------------------------------
> ---===//
> //
> -// This file contains toolchain descriptions used by llvmcc.
> +// This file contains compilation graph description used by llvmcc.
> //
> //
> ===-------------------------------------------------------------------
> ---===//
>
> @@ -16,9 +16,14 @@
>
> // Toolchains
>
> -def ToolChains : ToolChains<[
> - ToolChain<[llvm_gcc_c, llc, llvm_gcc_assembler,
> llvm_gcc_linker]>,
> - ToolChain<[llvm_gcc_cpp, llc, llvm_gcc_assembler,
> llvm_gcc_linker]>,
> - ToolChain<[llvm_as, llc, llvm_gcc_assembler, llvm_gcc_linker]>,
> - ToolChain<[llvm_gcc_assembler, llvm_gcc_linker]>
> +def CompilationGraph : CompilationGraph<[
> + Edge<root, llvm_gcc_c>,
> + Edge<root, llvm_gcc_assembler>,
> + Edge<root, llvm_gcc_cpp>,
> + Edge<root, llvm_as>,
> + Edge<llvm_gcc_c, llc>,
> + Edge<llvm_gcc_cpp, llc>,
> + Edge<llvm_as, llc>,
> + Edge<llc, llvm_gcc_assembler>,
> + Edge<llvm_gcc_assembler, llvm_gcc_linker>
> ]>;
>
> Modified: llvm/trunk/tools/llvmc2/ExampleWithOpt.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> ExampleWithOpt.td?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/ExampleWithOpt.td (original)
> +++ llvm/trunk/tools/llvmc2/ExampleWithOpt.td Tue May 6 11:35:25 2008
> @@ -7,7 +7,7 @@
> //
> //
> ===-------------------------------------------------------------------
> ---===//
> //
> -// This file contains toolchain descriptions used by llvmcc.
> +// This file contains compilation graph description used by llvmcc.
> //
> //
> ===-------------------------------------------------------------------
> ---===//
>
> @@ -16,9 +16,15 @@
>
> // Toolchains
>
> -def ToolChains : ToolChains<[
> - ToolChain<[llvm_gcc_c, opt, llc, llvm_gcc_assembler,
> llvm_gcc_linker]>,
> - ToolChain<[llvm_gcc_cpp, opt, llc, llvm_gcc_assembler,
> llvm_gcc_linker]>,
> - ToolChain<[llvm_as, opt, llc, llvm_gcc_assembler,
> llvm_gcc_linker]>,
> - ToolChain<[llvm_gcc_assembler, llvm_gcc_linker]>
> +def CompilationGraph : CompilationGraph<[
> + Edge<root, llvm_gcc_c>,
> + Edge<root, llvm_gcc_assembler>,
> + Edge<root, llvm_gcc_cpp>,
> + Edge<root, llvm_as>,
> + Edge<llvm_gcc_c, opt>,
> + Edge<llvm_gcc_cpp, opt>,
> + Edge<llvm_as, opt>,
> + Edge<opt, llc>,
> + Edge<llc, llvm_gcc_assembler>,
> + Edge<llvm_gcc_assembler, llvm_gcc_linker>
> ]>;
>
> Modified: llvm/trunk/tools/llvmc2/llvmc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/
> llvmc.cpp?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/tools/llvmc2/llvmc.cpp (original)
> +++ llvm/trunk/tools/llvmc2/llvmc.cpp Tue May 6 11:35:25 2008
> @@ -28,13 +28,21 @@
> namespace sys = llvm::sys;
> using namespace llvmcc;
>
> +// Built-in command-line options.
> // External linkage here is intentional.
> -cl::list<std::string> InputFilenames(cl::Positional,
> - cl::desc("<input file>"),
> cl::OneOrMore);
> +
> +cl::list<std::string> InputFilenames(cl::Positional, cl::desc
> ("<input file>"),
> + cl::OneOrMore);
> cl::opt<std::string> OutputFilename("o", cl::desc("Output file
> name"),
> cl::value_desc("file"));
> -cl::opt<bool> VerboseMode("v", cl::desc("Enable verbose mode"));
> -
> +cl::opt<bool> VerboseMode("v",
> + cl::desc("Enable verbose mode"));
> +cl::opt<bool> WriteGraph("write-graph",
> + cl::desc("Write CompilationGraph.dot file"),
> + cl::Hidden);
> +cl::opt<bool> ViewGraph("view-graph",
> + cl::desc("Show compilation graph in
> GhostView"),
> + cl::Hidden);
>
> namespace {
> int BuildTargets(const CompilationGraph& graph) {
> @@ -61,6 +69,12 @@
> cl::ParseCommandLineOptions(argc, argv,
> "LLVM Compiler Driver(Work In
> Progress)");
> PopulateCompilationGraph(graph);
> +
> + if(WriteGraph)
> + graph.writeGraph();
> + if(ViewGraph)
> + graph.viewGraph();
> +
> return BuildTargets(graph);
> }
> catch(const std::exception& ex) {
>
> Modified: llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/
> LLVMCCConfigurationEmitter.cpp?rev=50724&r1=50723&r2=50724&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp
> (original)
> +++ llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp Tue
> May 6 11:35:25 2008
> @@ -380,7 +380,7 @@
> checkNumberOfArguments(d, 1);
> SplitString(InitPtrToString(d->getArg(0)), toolProps_.CmdLine);
> if (toolProps_.CmdLine.empty())
> - throw std::string("Tool " + toolProps_.Name + " has empty
> command line!");
> + throw "Tool " + toolProps_.Name + " has empty command line!";
> }
>
> void onInLanguage (DagInit* d) {
> @@ -653,6 +653,9 @@
> << Indent2 << "std::vector<std::string> vec;\n";
>
> // Parse CmdLine tool property
> + if(P.CmdLine.empty())
> + throw "Tool " + P.Name + " has empty command line!";
> +
> StrVector::const_iterator I = P.CmdLine.begin();
> ++I;
> for (StrVector::const_iterator E = P.CmdLine.end(); I != E; ++I) {
> @@ -766,6 +769,10 @@
>
> // Emit a Tool class definition
> void EmitToolClassDefinition (const ToolProperties& P,
> std::ostream& O) {
> +
> + if(P.Name == "root")
> + return;
> +
> // Header
> O << "class " << P.Name << " : public Tool {\n"
> << "public:\n";
> @@ -851,35 +858,40 @@
> std::ostream& O)
> {
> // Get the relevant field out of RecordKeeper
> - Record* ToolChains = Records.getDef("ToolChains");
> - if (!ToolChains)
> - throw std::string("No ToolChains specification found!");
> - ListInit* chains = ToolChains->getValueAsListInit("chains");
> - if (!chains)
> - throw std::string("Error in toolchain list definition!");
> + Record* CompilationGraph = Records.getDef("CompilationGraph");
> + if (!CompilationGraph)
> + throw std::string("No CompilationGraph specification found!");
> + ListInit* edges = CompilationGraph->getValueAsListInit("edges");
> + if (!edges)
> + throw std::string("Error in compilation graph definition!");
>
> // Generate code
> O << "void llvmcc::PopulateCompilationGraph(CompilationGraph& G)
> {\n"
> - << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n"
> - << Indent1 << "std::vector<IntrusiveRefCntPtr<Tool> > vec;\n\n";
> + << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n\n";
> +
> + // Insert vertices
> +
> + RecordVector Tools = Records.getAllDerivedDefinitions("Tool");
> + if (Tools.empty())
> + throw std::string("No tool definitions found!");
> +
> + for (RecordVector::iterator B = Tools.begin(), E = Tools.end();
> B != E; ++B) {
> + const std::string& Name = (*B)->getName();
> + if(Name != "root")
> + O << Indent1 << "G.insertVertex(IntrusiveRefCntPtr<Tool>(new "
> + << Name << "()));\n";
> + }
> +
> + O << '\n';
> +
> + // Insert edges
>
> - for (unsigned i = 0; i < chains->size(); ++i) {
> - Record* ToolChain = chains->getElementAsRecord(i);
> - ListInit* Tools = ToolChain->getValueAsListInit("tools");
> -
> - // Get name of the first tool in the list
> - const std::string& firstTool =
> - dynamic_cast<DefInit&>(**Tools->begin()).getDef()->getName();
> -
> - for (ListInit::iterator B = Tools->begin(),
> - E = Tools->end(); B != E; ++B) {
> - Record* val = dynamic_cast<DefInit&>(**B).getDef();
> - O << Indent1 << "vec.push_back(IntrusiveRefCntPtr<Tool>(new "
> - << val->getName() << "()));\n";
> - }
> - O << Indent1 << "G.ToolChains[\"" << ToolToLang[firstTool]
> - << "\"] = vec;\n";
> - O << Indent1 << "vec.clear();\n\n";
> + for (unsigned i = 0; i < edges->size(); ++i) {
> + Record* Edge = edges->getElementAsRecord(i);
> + Record* A = Edge->getValueAsDef("a");
> + Record* B = Edge->getValueAsDef("b");
> + O << Indent1 << "G.insertEdge(\"" << A->getName() << "\", \""
> + << B->getName() << "\");\n";
> }
>
> O << "}\n\n";
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list