[LLVMdev] Calling into non-linked function via a pointer
Bruce Hoult
bruce at hoult.org
Tue Feb 17 21:07:48 PST 2015
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/20150218/8ec68f49/attachment.html>
More information about the llvm-dev
mailing list