[LLVMdev] lli -force-interpreter complains about external function

Nick Lewycky nicholas at mxc.ca
Sun Nov 15 23:23:53 PST 2009


Xu Yang wrote:
> Hi:
>
> When I try to execute lli -force-interpreter=true hello.bc, it gave the
> following error:
>
> LLVM ERROR: Tried to execute an unknown external function: i32 (i8*)* puts
>
> I think the error is because C library is not being linked with the byte
> code, but I was not able to find any helpful instruction in lli's document.
>
> Can you please teach me how to do it?

The interpreter uses libffi to make external function calls. However, it 
needs to be detected at LLVM's compile time. If you're using the 
released packages, we disabled that because we were worried about users 
who don't have libffi installed.

In short, install libffi and rebuild LLVM.

Nick

> Thanks
> Xu
>
>
> The hello.bc is generated as the following:
>
> ======file: hello.c======
> #include <stdio.h>
>
>
> int main(int argc, char** argv){
>    printf("hello world\n");
>    return 0;
> }
>
> ====================
>
>
> llvm-gcc -o hello.bc -emit-llvm -c hello.c
>
>
> This is the code in hello.bc (after llvm-dis):
> ==================================
> ; ModuleID = 'hello.bc'
> target datalayout =
> "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
> target triple = "i386-pc-linux-gnu"
>
> @.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x
> i8]*> [#uses=1]
>
> define i32 @main(i32 %argc, i8** %argv) nounwind {
> entry:
>    %argc_addr = alloca i32                         ; <i32*> [#uses=1]
>    %argv_addr = alloca i8**                        ; <i8***> [#uses=1]
>    %retval = alloca i32                            ; <i32*> [#uses=2]
>    %0 = alloca i32                                 ; <i32*> [#uses=2]
>    %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
>    store i32 %argc, i32* %argc_addr
>    store i8** %argv, i8*** %argv_addr
>    %1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i32
> 0, i32 0)) nounwind ; <i32> [#uses=0]
>    store i32 0, i32* %0, align 4
>    %2 = load i32* %0, align 4                      ; <i32> [#uses=1]
>    store i32 %2, i32* %retval, align 4
>    br label %return
>
> return:                                           ; preds = %entry
>    %retval1 = load i32* %retval                    ; <i32> [#uses=1]
>    ret i32 %retval1
> }
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list