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

Nick Lewycky nicholas at mxc.ca
Tue Nov 17 21:40:41 PST 2009


Xu Yang wrote:
> 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

Only because the optimizer saw sin(constant) and folded it away. The 
entire program became 'print constant string'. There is certainly a bug 
calling sinf() from the interpreter but I don't know what it is yet.

> The pthread problem remains after llvm-ld:
>
> $ lli -force-interpreter=true -load=/lib/libpthread.so.0 phello.llvm.bc
> 0   lli 0x08796bf8
> Segmentation fault

I don't expect this to work at all. Unlike the JIT, I don't know of any 
work having been done to make the interpreter thread-safe.

By the way, the interpreter can't support many more things, such as 
qsort() or any method which expects to call a function pointer. Is there 
a reason you need to use the interpreter? It's been largely 
undermaintained because it's pretty much useless when you've got a 
working JIT.

Nick

> 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
> <mailto: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
>     <mailto:nicholas at mxc.ca>> wrote:
>
>         Timo Juhani Lindfors wrote:
>
>             Nick Lewycky<nicholas at mxc.ca <mailto: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
>
>
>




More information about the llvm-dev mailing list