[LLVMdev] code-altering Passes for llc
Dan Gohman
gohman at apple.com
Sun Aug 2 12:23:05 PDT 2009
On Aug 2, 2009, at 7:09 AM, Artjom Kochtchi wrote:
>
> Greetinigs,
>
> I am extending llc to include runtime checks for calls (in X86). So
> a call
> 'call target' is altered to look like this:
>
> [some check]
> jne error_function
> call target
>
> I've done this by implementing a MachineFunctionPass that is
> instantiated
> and added to the PassManager in X86TargetMachine::addPreRegAlloc.
>
> In order to create the jne-instruction I need some BasicBlock that
> contains
> the error routine. So I tried to create a ModulePass to insert some
> basic
> block e. g. in the beginning of the program, to use it for the
> jne-instruction. Unfortunately, llc then produces the error
>
> llc: PassManager.cpp:1597:
> virtual void llvm::ModulePass::assignPassManager(llvm::PMStack&,
> llvm::PassManagerType):
> Assertion `!PMS.empty() && "Unable to find appropriate Pass
> Manager"'
> failed.
>
> Adding a MachineFunctionPass the same way works fine. I've read here
> on the
> mailing list that some Pass dependencies cause this error, but I
> have no
> dependencies specified.
>
> How do I get the ModulePass to run? Is a ModulePass the right way to
> accomplish my aim, altogether?
You don't need a ModulePass to modify a CFG. A MachineFunctionPass
is fine for this.
The actual problem may be that your pass doesn't preserve some
Analysis that CodeGen is using. Since CodeGen is function-oriented,
ModulePasses cannot be freely scheduled.
>
> One more question concerning passes:
> Clearly, inserting a jne-instruction changes control flow, so the
> CFG is not
> up to date after the pass. Do I set AnalysisUsage in
> getAnalysisUsage to
> preserve nothing? In that case, is the CFG updated automatically by
> LLVM or
> do I need to apply the changes during the Pass not only the the
> MachineFunction, but also the the CFG?
The default if you don't override getAnalysisUsage is that everything is
considered clobbered. With a MachineFunctionPass, you can modify
the MachineFunction (including the MachineBasicBlock CFG), but
you shouldn't modify the LLVM IR Function.
Dan
More information about the llvm-dev
mailing list