Modified LLVM IR

Hi,

I want to edit LLVM generated IR file, like as given below,

Original LLVM IR file,
@.str2 = private unnamed_addr constant [17 x i8] c"\0AI am in one_11\0A\00", align 1

; Function Attrs: nounwind
define i32 @one_1(i32 %ivar1, i32 %ivar2) #0 {
entry:
%ivar1.addr = alloca i32, align 4
%ivar2.addr = alloca i32, align 4
%isum = alloca i32, align 4
store i32 %ivar1, i32* %ivar1.addr, align 4
store i32 %ivar2, i32* %ivar2.addr, align 4
store i32 0, i32* %isum, align 4
%call = call i32 (i8*, …)* @printf(i8* getelementptr inbounds ([16 x i8]* @.str, i32 0, i32 0)) #1
%0 = load i32* %ivar1.addr, align 4
%1 = load i32* %ivar2.addr, align 4
%call1 = call i32 @one_11(i32 %0, i32 %1)
store i32 %call1, i32* %isum, align 4
%2 = load i32* %isum, align 4
ret i32 %2
}

Modified LLVM IR file,
@.str2 = private unnamed_addr constant [17 x i8] c"\0AI am in one_11\0A\00", align 1
@.str3 = private unnamed_addr constant [17 x i8] c"\0AI am in one_12\0A\00", align 1

; Function Attrs: nounwind
define i32 @one_1(i32 %ivar1, i32 %ivar2) #0 {
entry:
%ivar1.addr = alloca i32, align 4
%ivar2.addr = alloca i32, align 4
%isum = alloca i32, align 4
store i32 %ivar1, i32* %ivar1.addr, align 4
store i32 %ivar2, i32* %ivar2.addr, align 4
store i32 0, i32* %isum, align 4
%call1 = call i32 @one_12(i32 %0, i32 %1) <==
store i32 %call1, i32* %isum, align <==
%call = call i32 (i8*, …)* @printf(i8* getelementptr inbounds ([16 x i8]* @.str, i32 0, i32 0)) #1
%0 = load i32* %ivar1.addr, align 4
%1 = load i32* %ivar2.addr, align 4
%call2 = call i32 @one_11(i32 %0, i32 %1) <==
store i32 %call2, i32* %isum, align 4 <==
%2 = load i32* %isum, align 4
ret i32 %2
}

With llc tool, I want to generate object file for modified llvm ir file and it should call function
first “one_12"” and then function “one_11”.

Can someone please tell me how I can do my above requirement.

Thanks in advance,
Deepika

What is the condition for adding this code?

What have you tried so far? [Or are you looking for a contractor that can write code for you - I’m not sure this is quite the right place for that, but there are probably some people like that on this mailing list]

Hi,

I want to call/add some functions(that defined in another file) on top of some functions, and reflect the same changes in object file.
No, I am not looking for contractor.

Thanks,
Deepika

So how do you know what you want to modify (conceptually)?

Have you got a IR pass that you are working on, or are you asking for links/suggestions on how to start on one?

Hi,

Yes I am looking for IR pass that will do insert call of functions that defined in another file.
Links/suggestions that guide me to start for adding IR pass will help me so much.

Regards,
Deepika

This is the starting point:
http://llvm.org/docs/WritingAnLLVMPass.html

I suspect you want either a “FunctionPass” or a “BlockPass”.

The question you stil haven’t answered is how you know what you are going to insert function calls for. Inserting the call itself is relatively simple, detecting the right place may or may not be simple - and this is where the above advice may not be at all meaningful - since for example modifying the AST in the Clang part of the compiler may be more suitable, since that is where you have the knowledge of what the original source code looks like, rather than LLVM IR which is more disconnected from the original source.

Hi,

My requirement is something like as given below,
a.c => a.obj contains a1() and a2() function
b.c => b.obj contains b1() and b2() function
main.c => main.obj call to a1, a2, b1, b2

Now, I want to move a1(), a2() from a.obj to b2.obj and on top of function b1()
When I call b1() from main, it should call first a1, a2 and then function definition of b1

Can you please give me some pointers for my requirement.

Thank you in advance.
Deepika

So, I think we need to take one (or a dozen) step(s) back and look at what you are ACTUALLY trying to do. In other words, your question is a bit of an XY Question - like someone with a car with a punctured tyre, asking a mechanic how to undo the wheel nuts, because that’s what immediately comes to mind for taking the wheel off. But you should ask “how do I fix a puncture” (because the right steps and order of them is more than just undo the nuts that hold the wheel in place).

So what is your “fix a puncture” goal here?

Hi,

My goal is to edit a C object file and introduce a new function call within another function.

In my first post I edited IR file and then generate obj file with command,
llc -filetype=obj -o test.obj test.ll

In test.obj file I achieved my goal, but I have done this edition in IR file manually.
I want to control this by adding some IR passes in LLVM.

I am trying to add pass as per your suggested link. I built LLVM with cmake and now I have a question,
where I have to place .cpp file so it can build with cmake without any error.

Thank you for your pointers,
Deepika