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

Ryan Taylor via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 4 07:23:39 PDT 2016


Personally I would add a new pass that iterates, looks for the call you
want then inserts the new instruction.

On Sep 4, 2016 10:20, "SHUCAI YAO" <yaos4 at mcmaster.ca> wrote:

>
>
> 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/7a46584c/attachment.html>


More information about the llvm-dev mailing list