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

Hayden Livingston halivingston at gmail.com
Tue Feb 17 21:51:18 PST 2015


I have got this, but still no luck, I'm getting a segfault.

; ModuleID = 'My_Module'

@FooBar = external global void ()

define double @sum(double, double) {
entry:
  call void @FooBar()
  %tmp = fadd double %0, %1
  ret double %tmp
}


On Tue, Feb 17, 2015 at 9: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
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150217/4b7771f8/attachment.html>


More information about the llvm-dev mailing list