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

Marc via llvm-dev llvm-dev at lists.llvm.org
Mon Aug 10 16:14:58 PDT 2020


genius, this works!
I would never have found that out myself :)
thank you!

On 11.08.20 01:06, Johannes Doerfert wrote:
> 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

-- 
Marc Heuse
Mobil: +49 177 9611560
Fax: +49 30 37309726
www.mh-sec.de

Marc Heuse - IT-Security Consulting
Winsstr. 68
10405 Berlin

Ust.-Ident.-Nr.: DE244222388
PGP: AF3D 1D4C D810 F0BB 977D  3807 C7EE D0A0 6BE9 F573


More information about the llvm-dev mailing list