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

Bruce Hoult bruce at hoult.org
Tue Feb 17 22:17:48 PST 2015


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/20150218/54a4bfac/attachment.html>


More information about the llvm-dev mailing list