[llvm-dev] How to create and insert a call MachineInstr?

Tim Northover via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 13 02:53:38 PDT 2018


Hi Will,

On 13 April 2018 at 09:50, Will Lester via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> I have used BuildMI to build a MachineInstr. But it seems that a call
> MachineInstr only has one parameter which is a
> register(%physreg44<imp-use>?).

This depends on the target, but calls normally have a few operands:

  + The callee (a register or a global address or something).
  + A regmask indicating which registers the call preserves.
  + A list of imp-uses and imp-defs for the registers used to pass and
return parameters.

If you writie a .ll file that makes a call you should be able to see
all these components in the generated MIR.

> Therefore how can I set the callee function and the arguments of the function?

For a direct call, you'd normally use MachineInstrBuilder's
addGlobalAddress to set the callee. You have to emit separate moves
and stores before the call to put the arguments in the correct
registers and stack slots. Be careful not to clobber live registers!

We can probably give a few more details (like the call instruction to
use, and which registers pass parameters; maybe some extra quirks) if
we know the actual target you're compiling for, but the outline above
won't change significantly.

Cheers.

Tim.


More information about the llvm-dev mailing list