[LLVMdev] Calling into non-linked function via a pointer

Hayden Livingston halivingston at gmail.com
Tue Feb 17 23:43:40 PST 2015


I think I understand what you're trying to say. I have to figure out how to
generate that. I've tried a few thigns but failing at different places.

I tried creating a load int32, and then trying to call through it, and it
fails saying it's not a function type. Then I tried different globlmapping
things, and they fail with segfaults.

I also tried creating an constant int, and trying to make pointer to it,
but I don't think I quite succeeded here either.

I'd appreciate any pointers on how to go from a function pointer address to
being able to emit call indirect.

On Tue, Feb 17, 2015 at 10:17 PM, Bruce Hoult <bruce at hoult.org> wrote:

> That's what you get if you don't have the * in 'extern fn *f;' and
> therefore in '@f = external global i32 (i32)*'
>
> Without the * llvm expects to link to a known and provided function. With
> the * it's a global variable that contains the address of the function.
>
> On Wed, Feb 18, 2015 at 6:34 PM, Hayden Livingston <halivingston at gmail.com
> > wrote:
>
>> This is my module's dump, which is different than yours. I wonder how I
>> can get the external thing for my function.
>>
>> define double @sum(double, double) {
>> entry:
>>   call void @FooBar()
>>   %tmp = fadd double %0, %1
>>   ret double %tmp
>> }
>>
>> ; ModuleID = 'My_Module'
>>
>> define double @sum(double, double) {
>> entry:
>>   call void @FooBar()
>>   %tmp = fadd double %0, %1
>>   ret double %tmp
>> }
>>
>> declare void @FooBar()
>>
>>
>> On Tue, Feb 17, 2015 at 9:07 PM, Bruce Hoult <bruce at hoult.org> wrote:
>>
>>> Naturally you can, since C can. As usual, it's instructive to see what
>>> Clang generates e.g.
>>>
>>> typedef int fn(int);
>>>
>>> int test(fn f, int val){
>>>   return f(val);
>>> }
>>>
>>> -----------
>>>
>>> Compiled with: clang callfuncptr.c -O -S -emit-llvm -o callfuncptr.ll
>>>
>>> ; ModuleID = 'callfuncptr.c'
>>>
>>> target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
>>>
>>> target triple = "x86_64-apple-macosx10.10.0"
>>>
>>>
>>> ; Function Attrs: nounwind ssp uwtable
>>>
>>> define i32 @test(i32 (i32)* nocapture %f, i32 %val) #0 {
>>>
>>>   %1 = tail call i32 %f(i32 %val) #1
>>>
>>>   ret i32 %1
>>>
>>> }
>>>
>>> -------------
>>>
>>> Or...
>>>
>>>
>>> typedef int fn(int);
>>>
>>> extern fn *f;
>>>
>>> int test(int val){
>>>   return f(val);
>>> }
>>>
>>> -----------------------
>>>
>>> ; ModuleID = 'callfuncptr.c'
>>>
>>> target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
>>>
>>> target triple = "x86_64-apple-macosx10.10.0"
>>>
>>>
>>> @f = external global i32 (i32)*
>>>
>>>
>>> ; Function Attrs: nounwind ssp uwtable
>>>
>>> define i32 @test(i32 %val) #0 {
>>>
>>>   %1 = load i32 (i32)** @f, align 8, !tbaa !1
>>>
>>>   %2 = tail call i32 %1(i32 %val) #1
>>>
>>>   ret i32 %2
>>>
>>> }
>>>
>>>
>>> On Wed, Feb 18, 2015 at 5:52 PM, Hayden Livingston <
>>> halivingston at gmail.com> wrote:
>>>
>>>> I'm having a problem of being unable to call into an arbitrary function
>>>> that is loaded into memory whose pointer address is known to me but was not
>>>> linked into LLVM.
>>>>
>>>> I have added the function and called LLVMAddGlobalMapping with the
>>>> pointer, and the program segfaults.
>>>>
>>>> I was wondering if it is a supported scenario that LLVM can generate a
>>>> call into an arbitrary function that is not linked.
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>
>>>>
>>>
>>
>> --
>> This message has been scanned for viruses and
>> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and
>> is
>> believed to be clean.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150217/9289c3b9/attachment.html>


More information about the llvm-dev mailing list