Xu Yang
2009-Nov-18 05:02 UTC
[LLVMdev] lli -force-interpreter complains about external function
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/585c0a53/attachment.html>
Xu Yang
2009-Nov-18 05:29 UTC
[LLVMdev] lli -force-interpreter complains about external function
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>
Nick Lewycky
2009-Nov-18 05:40 UTC
[LLVMdev] lli -force-interpreter complains about external function
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.50Only 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 faultI 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 > > >
Apparently Analagous Threads
- [LLVMdev] lli -force-interpreter complains about external function
- [LLVMdev] lli -force-interpreter complains about external function
- [LLVMdev] lli -force-interpreter complains about external function
- [LLVMdev] lli -force-interpreter complains about external function
- [LLVMdev] lli -force-interpreter complains about external function