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

Xu Yang yangx2000 at gmail.com
Tue Nov 17 21:29:29 PST 2009


Hi Nick:

The first problem have been solved by calling llvm-ld:

$ llvm-ld -o hellosin.llvm hellosin.bc -lm
$ lli -force-interpreter=true -load=/usr/lib/libm.so hellosin.llvm.bc
hello sin:       0.50

The pthread problem remains after llvm-ld:

$ lli -force-interpreter=true -load=/lib/libpthread.so.0 phello.llvm.bc
0   lli 0x08796bf8
Segmentation fault


For those who are getting "invalid ELF header" error when calling llvm-ld
with -lpthread,
please change the load module from /usr/lib/pthread.a to
/lib/libpthread.so.0.

Thanks
Xu

On Wed, Nov 18, 2009 at 12:02 AM, Xu Yang <yangx2000 at gmail.com> wrote:

> Hi Nick:
>
> Thanks for pointing me to libffi.
> Recompile LLVM with libffi does solve the problem of printf.
> But it still has other problems:
> 1) sinf() returns 0 in the interpreter, but returns correct value in JIT
> (see hellosin.c)
> 2) calling pthread_create cause lli to crash in the interpreter mode, but
> no problem in JIT (see phello.c).
>
> My questions are:
> i) can I call any arbitrary external function in the interpreter?
> ii) how do I specify the dynamic library (where the external function is
> implemented), when I call the interpreter?
>
> Thanks
> Xu
>
> hellosin.c
> =======================
> #include <stdio.h>
> #include <math.h>
>
>
> int main(int argc, char** argv){
>   float f = sinf(0.5235988f);
>   printf("hello sin: %10.2f\n", f);
>   return 0;
> }
> ========================
> $ llvm-gcc -o hellosin.bc -emit-llvm -c hellosin.c
> $ lli -force-interpreter=true hellosin.bc
> hello sin:       0.00
> $ lli hellosin.bc
> hello sin:       0.50
>
> phello.c
> ========================
> #include <pthread.h>
> #include <stdio.h>
> #define NUM_THREADS     4
>
> void *PrintHello(void *threadid)
> {
>    long tid;
>    tid = (long)threadid;
>    printf("Hello from %ld.\n", tid);
>    pthread_exit(NULL);
> }
>
> int main (int argc, char *argv[])
> {
>    pthread_t threads[NUM_THREADS];
>    int ret;
>    long t;
>    for(t=0; t<NUM_THREADS; t++){
> #ifdef DEBUG
>       printf("creating thread %ld\n", t);
> #endif
>       ret = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
>       if (ret){
>          printf("pthread_create ERROR: %d\n", ret);
>          return(-1);
>       }
>    }
>    pthread_exit(NULL);
> }
> ========================
> $ llvm-gcc -o phello.bc -emit-llvm -c phello.c
> $ lli -force-interpreter=true phello.bc
> 0   lli 0x08796bf8
> Segmentation fault
> $ lli phello.bc
> Hello from 0.
> Hello from 1.
> Hello from 2.
> Hello from 3.
>
>
> On Tue, Nov 17, 2009 at 2:52 AM, Nick Lewycky <nicholas at mxc.ca> wrote:
>
>> Timo Juhani Lindfors wrote:
>>
>>> Nick Lewycky<nicholas at mxc.ca>  writes:
>>>
>>>> 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.
>>>>
>>>
>>> This seems to be quite a common problem (I too hit it once, thought it
>>> was a bug and reported it at
>>> http://llvm.org/bugs/show_bug.cgi?id=5466) how about making lli inform
>>> the user that LLVM was built without FFI support?
>>>
>>
>> Thanks for the reminder. I recall looking at the patch but I didn't apply
>> it at the time because I couldn't figure out why the code above it used
>> errs() in one case and llvm_report_error in another.
>>
>> Nick
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20091118/e40ace84/attachment.html>


More information about the llvm-dev mailing list