[llvm-dev] How to insert instructions before each function calls?

SHUCAI YAO via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 4 07:20:24 PDT 2016


On Sun, Sep 4, 2016 at 7:44 AM, Ryan Taylor <ryta1203 at gmail.com> wrote:

> Mehdi,
>
>  Sorry, I misread his original post.
>
>  So something like:
>
>  XXXInsrtInfo   *XII;    // target instruction info
>   MachineBasicBlock::iterator MI = MachineBasicBlock(YourCallInst);
>  MachineBasicBlock *MBB = YourCallInst->getParent(); // basic block
> location of your call inst
>  BuildMI(*MBB, MI, DebugLoc(), XII->get(XXX:::INSTRUCTION)......);
>
> The BuildMI params are going to depend on what you want to do with the
> instruction being inserted.
>  http://llvm.org/docs/doxygen/html/MachineInstrBuilder_8h.html
>
> -Ryan
>
> Hi Ryan,
    I need to add two instructions for each function call. Do you mean I
should add this snippet in the Lowercall function? Or I should add a new
pass?

Thanks!



>
>
> On Sun, Sep 4, 2016 at 1:45 AM, Mehdi Amini <mehdi.amini at apple.com> wrote:
>
>>
>> On Sep 3, 2016, at 6:18 PM, Ryan Taylor via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>> So one way might look like this:
>>
>> IRBuilder<> Builder(&*BB); // BB = Function::iterator OR IRBuilder<>
>> Builder(CallInst->getParent());
>> Builder.SetInsertPoint(CallInst);
>> InstructionClass *YourNewInstruction = builder.CreateInstructionClass(.....);
>> // InstructionClass = type of instruction you are inserting
>>
>>
>> I’m not sure how the IRBuilder would work at the MI level, as Shucai was
>> asking.
>>
>>
>>
>>
>> On Sat, Sep 3, 2016 at 6:04 PM, Ryan Taylor <ryta1203 at gmail.com> wrote:
>>
>>> Take a look at IRBuilder and SetInsertPoint().
>>>
>>> On Sep 3, 2016 18:02, "SHUCAI YAO via llvm-dev" <llvm-dev at lists.llvm.org>
>>> wrote:
>>>
>>>> I'm trying to insert some instructions before each function calls
>>>> (before arguments push):
>>>>    lea %EAX, label                      ----- new instructions
>>>>    mov [ESP+stacksize], %EAX  ----- new instructions
>>>>    push arg1
>>>>    push arg2
>>>>    ...
>>>>    push argn
>>>>    call callee_name
>>>>
>>>> I am a newbie to LLVM. I tried to use buildMI() to insert the
>>>> instructions in the lowercall() function. But I couldn't put these
>>>> instructions in the right positions. Is there a way to locate the position
>>>> by using MachineBasicBlock iterator?
>>>>
>>>
>> Can you describe more precisely what are you trying to achieve?
>> I.e. what are these instructions? Why do you want to do that? It may lead
>> to a different answer.
>>
>> I'm trying to implement something similar to segmented stack mechanism by
using LLVM. Instead of inserting comparison code in the prologue of the
function, I would like do the probe before arguments pushed. The segmentd
stacks append a guarded page. This guard page will call the addmorestack
function if the probe instructions touch this guarded page. Otherwise, it
only stroe the return address in the bottom of the callee stack frame.

In order to achieve this, for each function call, two instructions are
needed to be inserted:
     LEA  %EAX, callee_return_label
     MOV [ESP- callee_stack_frame_size - arguments_size], %EAX
     PUSH argn
     ...
     PUSH arg1
     JMP callee_name
callee_return_label:
     ...

So I need to insert two instructions (LEA and MOV) before each function
call. I don't know when how to insert these two instructions.

Thanks!
Shucai



>>> Mehdi
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160904/2a3191f0/attachment.html>


More information about the llvm-dev mailing list