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 > > >
Reasonably Related 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