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>