Disallow multiple edges.
authorMikhail Glushenkov <foldr@codedgers.com>
Wed, 26 Nov 2008 22:59:45 +0000 (22:59 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Wed, 26 Nov 2008 22:59:45 +0000 (22:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60127 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CompilerDriver/CompilationGraph.h
tools/llvmc/doc/LLVMC-Reference.rst
tools/llvmc/driver/CompilationGraph.cpp

index f3c31ab22c890290ac454654246af3a746fa9b2d..029623fdc8e30e956aa4a16615eb19fe12b1648d 100644 (file)
@@ -83,8 +83,7 @@ namespace llvmc {
 
     /// AddEdge - Add an outward edge. Takes ownership of the provided
     /// Edge object.
-    void AddEdge(Edge* E)
-    { OutEdges.push_back(llvm::IntrusiveRefCntPtr<Edge>(E)); }
+    void AddEdge(Edge* E);
 
     // Inward edge counter. Used to implement topological sort.
     void IncrInEdges() { ++InEdges; }
index 77d9d2bd3a4ac8fb3ecfaaa97d969107aa1a9d20..ab45bc39929e5edf3c3d8178b29686d7cf8c6e85 100644 (file)
@@ -63,7 +63,7 @@ Predefined options
 ==================
 
 LLVMC has some built-in options that can't be overridden in the
-configuration files:
+configuration libraries:
 
 * ``-o FILE`` - Output file name.
 
@@ -154,7 +154,7 @@ one can create edges between nodes defined in some other plugin. To
 make this work, however, that plugin should be loaded first. To
 achieve this, the concept of plugin priority was introduced. By
 default, every plugin has priority zero; to specify the priority
-explicitly, put the following line in your ``.td`` file::
+explicitly, put the following line in your plugin's TableGen file::
 
     def Priority : PluginPriority<$PRIORITY_VALUE>;
     # Where PRIORITY_VALUE is some integer > 0
@@ -220,7 +220,9 @@ weight of 0 + 2*N where N is the number of tests that evaluated to
 true in the ``case`` expression. It is also possible to provide an
 integer parameter to ``inc_weight`` and ``dec_weight`` - in this case,
 the weight is increased (or decreased) by the provided value instead
-of the default 2.
+of the default 2. It is also possible to change the default weight of
+an optional edge by using the ``default`` clause of the ``case``
+construct.
 
 When passing an input file through the graph, LLVMC picks the edge
 with the maximum weight. To avoid ambiguity, there should be only one
@@ -228,6 +230,12 @@ default edge between two nodes (with the exception of the root node,
 which gets a special treatment - there you are allowed to specify one
 default edge *per language*).
 
+When multiple plugins are loaded, their compilation graphs are merged
+together. Since multiple edges are not allowed, an edge defined in
+several plugins will be replaced by the definition from the plugin
+that was loaded last. Plugin load order can be controlled by using the
+plugin priority feature described above.
+
 To get a visual representation of the compilation graph (useful for
 debugging), run ``llvmc --view-graph``. You will need ``dot`` and
 ``gsview`` installed for this to work properly.
index 81283babb4858bfb172d4906f9412ce90b5714e7..a4fda4834fc737f23548aa78241cff2ffcc29430 100644 (file)
@@ -79,6 +79,20 @@ namespace {
 
 }
 
+void Node::AddEdge(Edge* Edg) {
+  // If there already was an edge between two nodes, modify it instead
+  // of adding a new edge.
+  const std::string& ToolName = Edg->ToolName();
+  for (container_type::iterator B = OutEdges.begin(), E = OutEdges.end();
+       B != E; ++B) {
+    if ((*B)->ToolName() == ToolName) {
+      llvm::IntrusiveRefCntPtr<Edge>(Edg).swap(*B);
+      return;
+    }
+  }
+  OutEdges.push_back(llvm::IntrusiveRefCntPtr<Edge>(Edg));
+}
+
 CompilationGraph::CompilationGraph() {
   NodesMap["root"] = Node(this);
 }