LLVM Interpreter & Qsort

Hi,

I am trying to run an LLVM analysis on a C++ program that calls qsort(),
using the LLVM interpreter (lli --force-interpreter). The code is the
qsort_large.c file in the MiBench benchmark suite. If I comment the qsort()
call, the execution works fine. If I uncomment the qsort() call, I run into
a segmentation fault error as follows:

0 lli 0x0000000000d35c6f
1 lli 0x0000000000d36199
2 libpthread.so.0 0x0000000004e41cb0
3 libpthread.so.0 0x000000000604e4d2

If I run valgrind, the output is the following:

vex amd64->IR: unhandled instruction bytes: 0x37 0x1 0x0 0x0 0x0 0x0 0x2 0x0
==9222== valgrind: Unrecognised instruction at address 0x604e4d2.
==9222== at 0x604E4D2: ???
==9222== by 0x5CA781B: msort_with_tmp.part.0 (msort.c:106)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA75A0: msort_with_tmp.part.0 (msort.c:46)
==9222== by 0x5CA7ABA: __GI_qsort_r.constprop.1 (msort.c:46)
==9222== by 0x5054E87: ffi_call_unix64 (in
/usr/local/lib/libffi.so.6.0.1)
==9222== by 0x505479C: ffi_call (in /usr/local/lib/libffi.so.6.0.1)
==9222== by 0x8604AE:
llvm::Interpreter::callExternalFunction(llvm::Function*,
std::vector<llvm::GenericValue, std::allocator&lt;llvm::GenericValue> >
const&) (in /usr/local/bin/lli)
==9222== by 0x85B49A: llvm::Interpreter::callFunction(llvm::Function*,
std::vector<llvm::GenericValue, std::allocator&lt;llvm::GenericValue> >
const&) (in /usr/local/bin/lli)
==9222== by 0x85B952: llvm::Interpreter::visitCallSite(llvm::CallSite)
(in /usr/local/bin/lli)
==9222== by 0x85D638: ??? (in /usr/local/bin/lli)
==9222== by 0x85BED8: llvm::Interpreter::run() (in /usr/local/bin/lli)
==9222== by 0x85045A: llvm::Interpreter::runFunction(llvm::Function*,
std::vector<llvm::GenericValue, std::allocator&lt;llvm::GenericValue> >
const&) (in /usr/local/bin/lli)
==9222== by 0xB93781:
llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*,
std::vector<std::string, std::allocator&lt;std::string> > const&, char
const* const*) (in /usr/local/bin/lli)
==9222== by 0x4FE861: main (in /usr/local/bin/lli)

This seems to suggest that the problem is the call to the comparator
function within qsort().

I have the following system configuration:
  - Ubuntu 12.04
  - LLVM v.3.2
  - Clang v.3.2
  - LibFFI v.3.0.12
  - Libc v.2.15

Do you happen to know if this behavior is normal?
Does LLVM 3.2 have support for function pointers?

Thank you in advance.
Simon