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

Hayden Livingston halivingston at gmail.com
Tue Feb 17 21:34:45 PST 2015


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/662e918d/attachment.html>


More information about the llvm-dev mailing list