Accessing Dominator Tree

Hello,

I am working on a project that requires me to perform some analysis on a bitcode file outside the existing LLVM analysis frameworks (opt, etc.). In what I am doing, I need to be able to access the dominator tree for a given function. Is there a way I can instantiate a DominatorTree object outside the existing analysis frameworks?

I have tried several things all along the lines of:

DominatorTree DT;

DT.getBase().recalculate(F);

Everything I have tried results in an assertion failure when trying to access the front() of what I assume is the DominatorTree:

Assertion failed: !empty() && “Called front() on empty list!”

If anyone has an example of how to do this, I would really appreciate it.

Thanks,

David

On 7/29/11 9:43 AM, wrote: If you use a PassManager object to run passes, then you can simply have your analysis be an LLVM pass and use the standard getAnalysis<>() template function to get access to the dominator tree analysis. Any program can create a PassManager to run LLVM passes to perform analysis and transformation; the clang C/C++ front-end and the sc tool in SAFECode do this. I don’t know if using a PassManager is what you consider to be “outside the existing LLVM framework.” I’m hoping your only objection is to using the opt tool to run LLVM passes. – John T.

John,

Thanks for the quick reply. Using a PassManager object should work fine. As you said, my only objection is to exec’ing opt.

I had actually tried instantiating a PassManager object before, but I was definitely not doing it right. I will take a look at how clang and SAFECode use it, and see if I can get it working.

Thanks,

David

On 7/29/11 10:00 AM, wrote: The SAFECode sc tool is based on opt, so you can just see what opt does. Clang does something weird with the PassManager object (I think), so I recommend looking at opt or sc over clang. – John T.

John,

I was able to get access to the dominator tree by doing exactly as you said. I instantiate a PassManager object, make my code inherit from Pass, and add it to the PassManager. Then I overload runOnFunction, etc just like when writing a pass for opt.

All of that seems to be working great.

Thanks for your help,

David