From e54da991d1be00e86fbdde37b68eec3751b128bf Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 13 Apr 2009 04:26:06 +0000 Subject: [PATCH] Link against libffi if available, fall back to "no external calls from interpreter mode" when it's not. llvm-svn: 68937 --- llvm/Makefile.config.in | 3 --- llvm/autoconf/configure.ac | 11 +++++------ .../Interpreter/ExternalFunctions.cpp | 16 ++++++++-------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/llvm/Makefile.config.in b/llvm/Makefile.config.in index 9d8ee3b137c4..dcc013d0e854 100644 --- a/llvm/Makefile.config.in +++ b/llvm/Makefile.config.in @@ -289,6 +289,3 @@ endif # Location of the plugin header file for gold. BINUTILS_INCDIR := @BINUTILS_INCDIR@ - -# Can we use libFFI for the interpreter? -HAVE_FFI := @HAVE_FFI@ diff --git a/llvm/autoconf/configure.ac b/llvm/autoconf/configure.ac index fb89e4172097..6441eaa621f3 100644 --- a/llvm/autoconf/configure.ac +++ b/llvm/autoconf/configure.ac @@ -737,8 +737,9 @@ AC_SEARCH_LIBS(dlopen,dl,AC_DEFINE([HAVE_DLOPEN],[1], AC_MSG_WARN([dlopen() not found - disabling plugin support])) dnl libffi is optional; used to call external functions from the interpreter -AC_CHECK_LIB(ffi,ffi_call,[have_libffi=1], - AC_MSG_WARN([libffi not found - disabling external calls from interpreter])) +AC_SEARCH_LIBS(ffi_call,ffi,AC_DEFINE([HAVE_FFI_CALL],[1], + [Define if libffi is available on this platform.]), + AC_MSG_WARN([libffi not found - disabling external calls from interpreter])) dnl mallinfo is optional; the code can compile (minus features) without it AC_SEARCH_LIBS(mallinfo,malloc,AC_DEFINE([HAVE_MALLINFO],[1], @@ -802,10 +803,8 @@ else AC_SUBST(HAVE_PTHREAD, 0) fi -dnl Once we know we have libffi, try to find ffi.h. -if test -n "$have_libffi" ; then - AC_CHECK_HEADERS([ffi.h ffi/ffi.h], [AC_SUBST(HAVE_FFI, 1)]) -fi +dnl Try to find ffi.h. +AC_CHECK_HEADERS([ffi.h ffi/ffi.h]) dnl===-----------------------------------------------------------------------=== dnl=== diff --git a/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp index 36de08358acf..160f1ba9f6c5 100644 --- a/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +++ b/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @@ -33,13 +33,13 @@ #include #include -#ifdef HAVE_FFI +#ifdef HAVE_FFI_CALL #ifdef HAVE_FFI_H #include +#define USE_LIBFFI #elif HAVE_FFI_FFI_H #include -#else -#error "Not sure where configure found ffi.h!" +#define USE_LIBFFI #endif #endif @@ -50,7 +50,7 @@ typedef GenericValue (*ExFunc)(const FunctionType *, static ManagedStatic > ExportedFunctions; static std::map FuncNames; -#ifdef HAVE_FFI +#ifdef USE_LIBFFI typedef void (*RawFunc)(void); static ManagedStatic > RawFunctions; #endif @@ -105,7 +105,7 @@ static ExFunc lookupFunction(const Function *F) { return FnPtr; } -#ifdef HAVE_FFI +#ifdef USE_LIBFFI static ffi_type *ffiTypeFor(const Type *Ty) { switch (Ty->getTypeID()) { case Type::VoidTyID: return &ffi_type_void; @@ -240,7 +240,7 @@ static bool ffiInvoke(RawFunc Fn, Function *F, return false; } -#endif // HAVE_FFI +#endif // USE_LIBFFI GenericValue Interpreter::callExternalFunction(Function *F, const std::vector &ArgVals) { @@ -253,7 +253,7 @@ GenericValue Interpreter::callExternalFunction(Function *F, : FI->second) return Fn(F->getFunctionType(), ArgVals); -#ifdef HAVE_FFI +#ifdef USE_LIBFFI std::map::iterator RF = RawFunctions->find(F); RawFunc RawFn; if (RF == RawFunctions->end()) { @@ -268,7 +268,7 @@ GenericValue Interpreter::callExternalFunction(Function *F, GenericValue Result; if (RawFn != 0 && ffiInvoke(RawFn, F, ArgVals, getTargetData(), Result)) return Result; -#endif // HAVE_FFI +#endif // USE_LIBFFI cerr << "Tried to execute an unknown external function: " << F->getType()->getDescription() << " " << F->getName() << "\n";