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

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


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>


More information about the llvm-dev mailing list