viewCFGOnly() function

Hello All,

I am trying to get basic CFG display to work. I have read the programmer's
manual and it mentions that we can simply call the viewCFGOnly() (part of
Function.h) from our sample program. When i read the comments for that
method in Function.h, it mentions that i need to call it from the gdb
debugger instead. I am confused as to how to get this working. Do we need to
call it from a simple program or a debugger. An example would be very
helpful.

I have LLVM compiled in debug mode and have "dot" and "gv" in my path.

I would appreciate any help or at least a point the right direction in terms
of documentation. Thank you.

You can call the function from your program OR the debugger. The comments simply inform you that it is quite handy to be able to call the function from a debugger (such as gdb).

To call the function in you code simply add a line such as:
F->viewCFGOnly();
Where F is an appropriate variable eg. a MachineFunction pointer

If you are using gdb then you can do the following:
call F->viewCFGOnly()

from a point where F is live.

David

nxer wrote:

Hello David,

Thanks for the reply. Would i not need to pass any arguments for
viewCFGOnly() method? According to this
http://llvm.org/doxygen/Function_8h-source.html seems like we need to?

I am building it on top of the example shown at
http://llvm.org/docs/WritingAnLLVMPass.html and just added
'F->viewCFGOnly(); line to it. It doesn't compile, i suspect it has to do
with the way i am compiling (i thought i solved this). I want to make sure
if what i am doing below (code wise) is correct and that the result should
be a CFG for the function.

My code:

#include "llvm/Pass.h"
#include "llvm/Function.h"

using namespace llvm;

namespace {
  struct Hello : public FunctionPass {

    static char ID;
    Hello() : FunctionPass(&ID) {}

    virtual bool runOnFunction(Function &F) {
      llvm::cerr << "Hello: " << F.getName() << "\n";
      F->viewCFGOnly();
      return false;
    }
  };

  char Hello::ID = 0;
  RegisterPass<Hello> X("hello", "Hello World Pass");
}

Thanks.

David Stuttard wrote:

Here's what the doxygen page has for viewCFGOnly() :

/// viewCFGOnly - This function is meant for use from the debugger. It works
/// just like viewCFG, but it does not include the contents of basic blocks
/// into the nodes, just the label. If you are only interested in the CFG
/// this can make the graph smaller.
///
void viewCFGOnly() const;

Which indicates that no arguments are necessary.

You're getting a compile error because you are using F->viewCFGOnly() when F is not a pointer in your example.

Try F.viewCFGOnly() instead

David

nxer wrote:

Oops, should have been clearer, i meant to use a method viewCFGOnly() in
Function.h, i thought we need to declare a function variable first
(llvm::Function* F) and use the create method, etc. I just confused myself
there so i just restarted with clean slate with MachineFunction and this is
what i have:

#include <stdint.h>
#include <stdio.h>
#include <llvm/Function.h>
#include "llvm/CodeGen/MachineFunction.h"

using namespace llvm;

int main( int argc, char ** argv )
{
llvm::MachineFunction* F;

F->viewCFGOnly();
return 0;
}

I compile it using this:
llvm-g++ test.cpp `llvm-config --cxxflags --ldflags --libs`

It compiles fine but then what? I have "dot" and "gv" in my path, i thought
there would be an empty graph or something that would display. I am not sure
if i misunderstood this whole thing. As you can probably tell i am bit a
noob with this so could you please point to the right documentation? I am
just piecing information together from random parts! Thanks.

David Stuttard wrote: