/// AddEdge - Add an outward edge. Takes ownership of the provided
/// Edge object.
/// AddEdge - Add an outward edge. Takes ownership of the provided
/// Edge object.
- void AddEdge(Edge* E)
- { OutEdges.push_back(llvm::IntrusiveRefCntPtr<Edge>(E)); }
// Inward edge counter. Used to implement topological sort.
void IncrInEdges() { ++InEdges; }
// Inward edge counter. Used to implement topological sort.
void IncrInEdges() { ++InEdges; }
==================
LLVMC has some built-in options that can't be overridden in the
==================
LLVMC has some built-in options that can't be overridden in the
+configuration libraries:
* ``-o FILE`` - Output file name.
* ``-o FILE`` - Output file name.
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
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
def Priority : PluginPriority<$PRIORITY_VALUE>;
# Where PRIORITY_VALUE is some integer > 0
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
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. 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
When passing an input file through the graph, LLVMC picks the edge
with the maximum weight. To avoid ambiguity, there should be only one
which gets a special treatment - there you are allowed to specify one
default edge *per language*).
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.
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.
+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);
}
CompilationGraph::CompilationGraph() {
NodesMap["root"] = Node(this);
}