[LLVMdev] Inserting a function call using LLVM

teja tamboli tamboli.teja at gmail.com
Fri Oct 12 01:19:05 PDT 2012


Thanks Ciao

I am following your instruction  and able to write some code. Instead of
foo() my aim is to add

int mul_add(int x, int y, int z)
{
return (x*y+z)
}

Please find the attached source code in the email.

Issue I am facing now it is crashing and backtrace is

Assertion failed: (V->getParent() == 0 && "Value already in a
container!!"), function addNodeToList, file SymbolTableListTraitsImpl.h,
line 68.
0  opt               0x00000001007989b3 PrintStackTrace(void*) + 51
1  opt               0x0000000100798f1d SignalHandler(int) + 333
2  libSystem.B.dylib 0x00007fff8731d1ba _sigtramp + 26
3  libSystem.B.dylib 0x0000000700000018 _sigtramp + 2026778232
4  opt               0x00000001000a0c2f raise + 31
5  opt               0x00000001000a0c60 abort + 16
6  opt               0x00000001000a0d2d __assert_rtn + 189
7  opt               0x0000000100063077
llvm::SymbolTableListTraits<llvm::Instruction,
llvm::BasicBlock>::addNodeToList(llvm::Instruction*) + 101
8  LLVMHello.dylib   0x0000000101688a3c llvm::iplist<llvm::Instruction,
llvm::ilist_traits<llvm::Instruction>
>::insert(llvm::ilist_iterator<llvm::Instruction>, llvm::Instruction*) + 178
9  LLVMHello.dylib   0x00000001016877df (anonymous
namespace)::Hello::doInitialization(llvm::Module&) + 2639
10 opt               0x000000010070ebd4
llvm::FPPassManager::doInitialization(llvm::Module&) + 86
11 opt               0x000000010070dfe5
llvm::FPPassManager::runOnModule(llvm::Module&) + 35
12 opt               0x000000010071317b
llvm::MPPassManager::runOnModule(llvm::Module&) + 613
13 opt               0x0000000100714526
llvm::PassManagerImpl::run(llvm::Module&) + 150
14 opt               0x00000001007145cb
llvm::PassManager::run(llvm::Module&) + 39
15 opt               0x00000001000b5a50 main + 7552
16 opt               0x00000001000a7578 start + 52
Stack dump:


Also I am not sure how to send parameters to function mul_add() when I am
calling it from main() function. i.e. how and where to set x = 1, y = 2 and
z = 3 so that call from main() will be mul_add(1, 2, 3).

Please let me know

Thanks,
--Teja

On Mon, Oct 8, 2012 at 2:26 AM, Duncan Sands <baldrick at free.fr> wrote:

> Hi Teja,
>
>
>  I am new to LLVM and interested in using LLVM to work on a research
>> project for
>> my Master's degree.
>> My idea is following -
>>
>> 1. I have a simple C program basic.c -
>> #include <stdio.h>
>> int main() {
>>     printf("Hello World");
>>     return 0;
>> }
>>
>> 2. I will generate IR byte code for this basic.c using -
>> llvm-gcc -emit-llvm -S basic.c
>>
>> This will give me basic.s which has IR byte code like this -
>>
>> ; ModuleID = 'basic.c'
>> target datalayout =
>> "e-p:64:64:64-i1:8:8-i8:8:8-**i16:16:16-i32:32:32-i64:64:64-**
>> f32:32:32-f64:64:64-v64:64:64-**v128:128:128-a0:0:64-s0:64:64-**
>> f80:128:128-n8:16:32:64"
>> target triple = "x86_64-apple-darwin10.8"
>>
>> @.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x
>> i8]*>
>> [#uses=1]
>>
>> define i32 @main() nounwind ssp {
>> entry:
>>    %retval = alloca i32                            ; <i32*> [#uses=2]
>>    %0 = alloca i32                                 ; <i32*> [#uses=2]
>>    %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
>>    %1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64
>> 0, i64
>> 0)) nounwind ; <i32> [#uses=0]
>>    store i32 0, i32* %0, align 4
>>    %2 = load i32* %0, align 4                      ; <i32> [#uses=1]
>>    store i32 %2, i32* %retval, align 4
>>    br label %return
>>
>> return:                                           ; preds = %entry
>>    %retval1 = load i32* %retval                    ; <i32> [#uses=1]
>>    ret i32 %retval1
>> }
>>
>> declare i32 @puts(i8*)
>>
>> 3. I want to write a pass to insert a call foo(int a) after the printf()
>> call,
>> so that it looks like this -
>> #include <stdio.h>
>> int main() {
>>     printf("Hello World");
>>     foo(1);
>>     return 0;
>> }
>>
>> void foo(int a) {
>>     printf("a + 5 is : %d", a + 5);
>> }
>>
>
> you need to do:
> (1) insert a declaration of "foo" into the module;
> (2) find the spot in the IR where you want to put it, i.e. find the printf
> (3) insert the call
>
> For (1), use Function::Create.
> For (2), use Module::getFunction to lookup "main", then iterate over the
> basic
> blocks, and within each basic block iterate over instructions, looking for
> a
> call instruction, using isa<CallInst> to test if an instruction is a call.
> For (3), create an IRBuilder, set the insertion point to the instruction
> after
> the printf, and use the CreateCall method.
>
> Ciao, Duncan.
>
>
>
>> How can I achieve this? I looked online but couldn't find a definite
>> source
>> which tells me how to do this.
>> I think I can use Cloning.h and CloneFunction.cpp to clone a given
>> function and
>> then insert my call to foo().
>> But I'm not sure if this is the right way to do this. The documentation
>> obviously did not say this explicitly.
>> Any thoughts / pointers ?
>>
>> Thanks in advance !
>> - Teja
>>
>>
>> ______________________________**_________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>>
>>
> ______________________________**_________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>



-- 
Regards,
Teja
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121012/44521a85/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Hello.cpp
Type: text/x-c++src
Size: 4536 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121012/44521a85/attachment.cpp>


More information about the llvm-dev mailing list