[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