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.

I forgot add the error I’m getting:

LLVM ERROR: Tried to execute an unknown external function: MyFunction

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);
}

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()

I have got this, but still no luck, I’m getting a segfault.

; ModuleID = ‘My_Module’

@FooBar = external global void ()

define double @sum(double, double) {
entry:
call void @FooBar()
%tmp = fadd double %0, %1
ret double %tmp
}

That’s what you get if you don’t have the * in ‘extern fn f;’ and therefore in '@f = external global i32 (i32)

Without the * llvm expects to link to a known and provided function. With the * it’s a global variable that contains the address of the function.

I think I understand what you’re trying to say. I have to figure out how to generate that. I’ve tried a few thigns but failing at different places.

I tried creating a load int32, and then trying to call through it, and it fails saying it’s not a function type. Then I tried different globlmapping things, and they fail with segfaults.

I also tried creating an constant int, and trying to make pointer to it, but I don’t think I quite succeeded here either.

I’d appreciate any pointers on how to go from a function pointer address to being able to emit call indirect.