[llvm-dev] resolve the name of an ifunc resolver function

Johannes Doerfert via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 10 16:06:23 PDT 2020


Hi Marc,

Take a look at the IR: https://clang.godbolt.org/z/cq99EE

Line 5, on the right, you see the definition of the `ifunc`:
   @foo = dso_local ifunc i32 (), bitcast (i8* ()* @foo_resolve to i32 ()*)

The resolver constant probably is the `bitcast (...)` (= I haven't
actually checked). That would match your ConstantExpr observation. You
should be able to just access the operand 0 of the resolver constant
which is the llvm::Function (as llvm::Constant) you are looking for.
`getName()` on that one should work, eventually with a prior cast, thus:
   cast<Function>(r->getOperand(0))->getName()
You can also cast the resolver into a `UnaryConstantExpr` first if you
want, but that should not be necessary to access the operand, just if
you want to verify you have a bitcast in front of you.

Hope this helps.

~ Johannes


On 8/10/20 5:30 PM, Marc via llvm-dev wrote:
 > Hi,
 >
 > I just spent 4 hours trying to find a way to get the name of the
 > resolver function of a ifunc definition ... :-(
 >
 > and with all that time I didnt event get far:
 >
 > for (GlobalIFunc &IF : M.ifuncs()) {
 >   StringRef ifunc_name = IF.getName();
 >   Constant *r = IF.getResolver();
 >
 > But how do I get to the (Function*) or function name of the resolver
 > from there? I tried everything with the Constant which seems to be a
 > ConstantExpr type ... ....
 >
 > Example test program below:
 >
 > #include <stdio.h>
 >
 > int foo(void) __attribute__((ifunc("foo_resolve")));
 >
 > static int global = 1;
 >
 > static int foo1(void) { return 0; }
 >
 > static int foo2(void) { return 1; }
 >
 > void *foo_resolve(void) { return global == 1 ? foo1 : foo2; }
 >
 > int main() { printf("%d\n", foo()); }
 >
 > Thank you!
 >
 > Regards,
 > Marc
 > _______________________________________________
 > LLVM Developers mailing list
 > llvm-dev at lists.llvm.org
 > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list