[LLVMdev] Controlling the order of a FunctionPass
John Criswell
criswell at uiuc.edu
Fri Jul 23 07:36:19 PDT 2010
Trevor Harmon wrote:
> On Jul 22, 2010, at 2:05 PM, John Criswell wrote:
>
>
>> If you write your pass as a ModulePass, then you can iterate over the
>> functions in any order that you want.
>>
>
> I had considered that, but my FunctionPass depends on other passes
> processing the functions first:
>
Two things to consider:
1) The PassManager isn't currently designed to schedule prerequisite
*transform* passes (like UnifyFunctionExitNodes). If your pass requires
that another transform pass be executed first, then the PassManager must
be explicitly told (via the PassManager.add() method) to run that pass
first. If you're running your pass via the opt tool, then it means that
the user must manually specify the prerequisite passes in the correct
order (e.g., opt -load <your pass filename> -mergereturn -<your pass
name>). If you're building a separate program that schedules the
passes, then it needs to run the prerequisite passes first.
See the sc tool in the SAFECode source code for an example.
2) For prerequisite *analysis* passes (like LoopInfo), your ModulePass
can declare them as prerequisites and get access to them using the
getAnalysis<PassName>(Function *) method. This is documented in the
"Writing an LLVM Pass" manual
(http://llvm.org/docs/WritingAnLLVMPass.html#getAnalysis).
-- John T.
> void MyPass::getAnalysisUsage(AnalysisUsage &AU) const {
> AU.addRequired<UnifyFunctionExitNodes>();
> AU.addRequired<LoopInfo>();
> AU.addPreserved<LoopInfo>();
> }
>
> bool MyPass::runOnFunction(Function &function) {
> LoopInfo &loopInfo = getAnalysis<LoopInfo>();
> ...
> }
>
> I don't know how to convert the above code into its equivalent form
> for a ModulePass.
>
> Trevor
>
>
More information about the llvm-dev
mailing list