Call graph printer/viewer

Hi,

I would like viewing the call graph using opt. Right now this is
not possible. Indeed, to view the call graph one should tell
opt to dump it to a file and then open it with a DOT viewer.

So I started adding support for viewing the call graph from opt.
Basically, there are 2 alternatives:

1) If you are trying to print/view a graph that is a Function
   analysis, then exploit DOTGraphTraits{Viewer,Printer}
   * lib/Analysis/DomPrinter.cpp
   * lib/Analysis/RegionPrinter.cpp

2) Otherwise, use low-level interface {View,Write}Graph
   * lib/Analysis/CFGPrinter.cpp
     - View the graph, defines passes for viewing/printing

   * lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
   * lib/CodeGen/ScheduleDAGPrinter.cpp
     - View the graph, no associate pass

   * lib/CodeGen/EdgeBundles.cpp
     - MachineFunction pass. Provide a member function to view the
       graph using a custom ViewGraph function because the default
       implementation "it won't work"

   * lib/CodeGen/MachineFunction.cpp
     - Provide member function to see/print the MachineFunction as a
       graph. Passes not available. I think because MachineFunctions
       can only be viewed/printed on debug builds

I chosen to follow the first alternative. However, it works only for
FunctionPass, while I need a ModulePass, so I defined
DOTGraphTraitsModule{Viewer,Printer} for handling Module viewer/helpers
and I exploited them for providing call graph viewer/printer.

Attached is the patch. In the case it is OK, maybe
DOTGraphTraits{Viewer,Printer} should be renamed in something like
DOTGraphTraitsFunction{Viewer,Printer} to point out that they handle
function-related graph viewing/printing.

Bye,
speziale.ettore@gmail.com

call-graph-refactor.diff (9.92 KB)