Hayden Livingston
2015-Feb-18 04:52 UTC
[LLVMdev] Calling into non-linked function via a pointer
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. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150217/e9e5fb48/attachment.html>
Hayden Livingston
2015-Feb-18 05:05 UTC
[LLVMdev] Calling into non-linked function via a pointer
I forgot add the error I'm getting: LLVM ERROR: Tried to execute an unknown external function: MyFunction On Tue, Feb 17, 2015 at 8: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. > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150217/ea6e82d5/attachment.html>
Bruce Hoult
2015-Feb-18 05:07 UTC
[LLVMdev] Calling into non-linked function via a pointer
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>
Hayden Livingston
2015-Feb-18 05:34 UTC
[LLVMdev] Calling into non-linked function via a pointer
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>