Passing a function pointer as parameter to function call?

Dear all,

I’m writing an LLVM pass, and I want to insert a call instruction that takes a function pointer as a parameter. The effect would be the same as following:

atexit(foo);

Where foo is a function I insert with M.getOrInsertFunction(), which in LLVM is a Function class.

I searched for a while and did not come up with a satisfying answer. Should I create a Value class of pointer type, or a Int64Ty for a pointer? How do I get the pointer to the function I create? I also tried passing foo as Function* in LLVM as parameter to create CallInst directly, and I doesn’t seem to work.

Any hints and enlightenment is appreciated. Many thanks.

Regards,

Easiest thing to do would be to write the equivalent C code, throw it through Clang, and look at the IR it produces.

Hi David,

Thanks very much.

I tried and the IR it produces is:

%call = call i32 @atexit(void ()* foo)

The problem is this still doesn’t give me any clues how to produce the code inside my LLVM pass. How do I get the pointer to this foo function?

Any hints?

Thank you.
Kevin Hu

Hi David,

Thanks very much.

I tried and the IR it produces is:

%call = call i32 @atexit(void ()* foo)

The problem is this still doesn't give me any clues how to produce the
code inside my LLVM pass. How do I get the pointer to this foo function?

You can look at the Clang code to see how it produces this IR - or you
might be able to use the LLVM C++ backend that will produce C++ source code
that generates the textual IR it's given.

Dear Kevin,

In the LLVM IR, the function and the pointer to the function are the same thing. Within an LLVM pass, if you have a pointer to a Function object:

Function * F = M.getOrInsertFunction(...)

... then you can use F as a parameter to a call instruction:

std::vector<Value *> args;
args.push_back (F);
CallInst * CI = CallInst::Create (AtExit, args, ...);

Regards,

John Criswell