Add Call instruction in IR for a non-existing function

Hello everyone,
I am trying to add checkpoints to my IR code. In order to do that I need to add this instruction:
call void @m5_checkpoint(i64 0, i64 0)

to some of the basic blocks in my benchmark.

m5_checkpoint is a function defined for checkpointing in another simulator and is not included in my benchmark source code. So I need to create this instruction and I couldn’t figure out how to do this by reading the manual. I will appreciate if anyone can help me .

Regards,
Fami

Hi Fami,

you need to declare your function as an external global Symbol in order
to use it (you will still need to provide the symbol at linktime
though).

One way to do this is to call the module method getOrInsertFunction
after creating the correct Functiontype:

    auto *FT = llvm::FunctionType::get(...);
    M.getOrInsertFunction("m5_checkpoint", FT)

hope it helps,

Serge

Hi,

I think it’s called getOrInsertFunction() in module class, with reference from:

http://llvm.org/releases/2.6/docs/tutorial/JITTutorial1.html

Also, when you encounter questions for LLVM C++ APIs in the future, you can write desired output code and use llc to generate proper C++API code, which I think is a very neat feature of LLVM.

e.g.
clang -c -emit-llvm your_desired_output.c
llc -march=cpp your_desired_output.bc

Hope this helps.
Regards,
Kevin

Thank you all.
Kevin,
I didn’t get your point. Do you mean to change the bc file and them create C++ out of it?
Regards,
Fami

Dear Fami,

Pardon me for the late response.

The bc file is the bitcode version of the program IR for LLVM, you could generate it by clang:

$ clang -c -emit-llvm hello.c -o hello.bc

And llc is the LLVM bitcode compiler, which turns LLVM IR into executables. But it also supports turning IR into C++ code that uses LLVM API to generate the corresponding IR. I think it’s a good reference for using LLVM C++ API. For example if you want to understand how you should use LLVM C++ API to generate code in hello.c (and therefore hello.bc as IR), try using the following:

$ llc -march=cpp hello.bc -o hello.cpp

The hello.cpp should contain the C++ code that uses C++ API to generate corresponding IR.

See more:
http://llvm.org/releases/3.8.0/docs/CommandGuide/llc.html

Regards,

Kevin