[LLVMdev] Problem adding a MachineBasicBlock during X86 EmitPrologue

Arlen Cox arlencox at gmail.com
Fri Jun 18 13:53:17 PDT 2010


I think I can answer my own question here.  Somebody correct me if I am wrong.

I shouldn't have added this where I did.  It should have been added as
its own MachineFunctionPass.  The reason the block was disappearing
was either due to a later pass clobbering it or due to the verifier.
It seems that all other return blocks have a different return
associated (such as RET %EAX<imp-use,kill>), where as this one is just
a plain RET.

By moving my pass later in the passes, I placed it after the verifier
is no longer run and now not many passes are run after it.  Now the
block shows up numbered correctly.

Thanks for any further feedback.

-Arlen

On Fri, Jun 18, 2010 at 11:42 AM, Arlen Cox <arlencox at gmail.com> wrote:
> I'm attempting to add an error handler to functions with a custom
> calling convention.  This error is checked upon function entry, before
> any code is run (specifically, I cannot allow any stack operations).
> Because of this, I figured a good place to do this code insertion is
> in EmitPrologue.  I also, at this time, create the block that handles
> the error case.
>
>      // create a new block for the overflow handling code
>      MF.overflowBlock = MF.CreateMachineBasicBlock();
>      MachineFunction::iterator obinsert = MF.begin();
>      MF.addToMBBNumbering(MF.overflowBlock);
>      MF.push_back(MF.overflowBlock);
>      // on overflow jump to a new block to handle overflow
>      BuildMI(MBB, MBBI, DL, TII.get(X86::JAE_4)).addMBB(MF.overflowBlock);
>
>      //add dummy instruction to overflow block
>      BuildMI(MF.overflowBlock, DL, TII.get(X86::RET));
>
>
> The problem is that the block doesn't appear in generate code if the
> code starts with more than one basic block.  I get x86 code that looks
> something like this:
>
> _main:
>    ...
>    jae    "LBB1_-1"
>    ...
>
>
> There is no label created "LBB1_-1" and the block containing the ret
> instruction is missing.
>
> If I attempt to do an insertion operation, assuming it doesn't insert
> at the end() of the machine function, the code in MF.overflowBlock
> replaces the code in the block that the iterator points to.
>
> How am I doing this wrong?
>
> Thanks much,
> Arlen
>




More information about the llvm-dev mailing list