[LLVMdev] [patch] Dotty printer for dependency trees

Tobias Grosser grosser at fim.uni-passau.de
Thu Jul 16 13:20:14 PDT 2009

On Wed, 2009-07-15 at 22:14 -0700, an unknown sender wrote: 
> Tobias Grosser wrote:
> > On Wed, 2009-07-15 at 00:20 +0200, Tobias Grosser wrote:
> >> Hi,
> >>
> >> I started to work with llvm and liked the CFG dotty printer a lot.
> >> However there was none for the dominance trees.
> >>
> >> I implemented dotty printing for dominance trees
> Great! I'm a huge fan of graphviz integration in the compiler.
> > And here is the patch. 
> What's up with copying from CFGPrinter.cpp into CFGPrinter.h? You 
> shouldn't need that.

CFGPrinter.cpp implements the printing for a graph of basic blocks, in
this case for an CFG. The nodes in the case of dominance information are
also basic blocks, so I want to use the same code to print these.
As the template is defined in the *.cpp file it can not be accessed,
therefore I moved it to the .h file.

The function I am calling is:

DOTGraphTraits<const Function*>::getNodeLabel(const BasicBlock*, const
Function *, bool);

Is there any way to access the template in the *.cpp file? I do not want
to just copy the code or write my own version of basic block printing.
It would not be different from the current one.

> +  static nodes_iterator nodes_begin (DomTreeNode * N) {
> +    return df_begin<DomTreeNode *> (N);
> +  }
> +
> +  static nodes_iterator nodes_end  (DomTreeNode *N) {
> +    return df_end<DomTreeNode *> (N);
> +  }
> No spaces between the function name and the parenthesis. This occurs a 
> few times.


> @@ -112,7 +59,7 @@ namespace {
>       CFGOnlyViewer() : FunctionPass(&ID) {}
>       virtual bool runOnFunction(Function &F) {
> -      F.viewCFG();
> +      F.viewCFGOnly();
>         return false;
>       }
> Put that back. viewCFG shows the CFG with full instructions inside it 
> while viewCFGOnly shows just the block without the instruction listing 
> inside. This pass is intended to show the details.

I thought the CFGViewer pass triggered on '-view-cfg' should show
details, whereas the CFGOnlyViewer triggered on '-view-cfg-only' should
show the blocks without instructions.
At the moment CFGOnlyViewer as triggered by '-view-cfg-only' shows the
instructions, that seems to be wrong.

> +  template<>
> +    struct DOTGraphTraits<DomTreeNode*> : public DefaultDOTGraphTraits {
> +      static std::string getNodeLabel(DomTreeNode *Node,
> +				      DomTreeNode *Graph,
> +				      bool ShortNames) {
> Tabs are forbidden in LLVM. Also, neither "namespace llvm {" nor 
> "template<>" increase indent level.

> +	return DOTGraphTraits<const Function*>::getNodeLabel(
> +	  (const BasicBlock*) BB, (const Function *) BB->getParent(),
> +	   ShortNames);
> +      }
> If you're just changing constness, please use const_cast<>. But why 
> isn't this using DOMGraphTraits<Function*> instead?

I removed them, as they are not required. However I still have to use
the DOTGraphTraits<const Function*> template, as there does not exist
any template for DOTGraphTraits<Function*> and using
DOTGraphTraits<Function*> will not fall back to DOTGraphTraits<const
Function*>, but to the default implementation of DOTGraphTraits. That is
not what I want. As the graph printer does not modify the graph it seems
correct to define everything as 'const', so defining
DOTGraphTraits<Function*> does not seem to be a solution.

> +  struct DomViewer: public FunctionPass {
> Missing space before colon.


Thanks for your review

-------------- next part --------------
A non-text attachment was scrubbed...
Name: llvm-dot-dominance-printer.patch
Type: text/x-patch
Size: 19833 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090716/c593ff52/attachment.bin>

More information about the llvm-dev mailing list