aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOscar Fuentes <ofv@wanadoo.es>2011-01-21 15:42:54 +0000
committerOscar Fuentes <ofv@wanadoo.es>2011-01-21 15:42:54 +0000
commit596937914548c181f2504aad3b709189e87a561b (patch)
tree6801a4e7f8ae8442350c025c6523fa6f60a091e8
parent030160073d8ec7d5fc1d928d9c8b6173d3a5e0cc (diff)
downloadexternal_llvm-596937914548c181f2504aad3b709189e87a561b.zip
external_llvm-596937914548c181f2504aad3b709189e87a561b.tar.gz
external_llvm-596937914548c181f2504aad3b709189e87a561b.tar.bz2
Handles libffi on the CMake build.
Patch by arrowdodger! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123976 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CMakeLists.txt4
-rwxr-xr-xcmake/config-ix.cmake29
-rw-r--r--docs/CMake.html6
-rw-r--r--include/llvm/Config/config.h.cmake6
-rw-r--r--lib/ExecutionEngine/Interpreter/CMakeLists.txt16
5 files changed, 58 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 52f0a58..9878c79 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -114,6 +114,10 @@ if(LLVM_ENABLE_TIMESTAMPS)
set(ENABLE_TIMESTAMPS 1)
endif()
+option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
+set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
+set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
+
set(C_INCLUDE_DIRS "" CACHE STRING
"Colon separated list of directories clang will search for headers.")
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
index e19cb34..4a87a23 100755
--- a/cmake/config-ix.cmake
+++ b/cmake/config-ix.cmake
@@ -190,6 +190,35 @@ llvm_find_program(fdp)
llvm_find_program(dot)
llvm_find_program(dotty)
+if( LLVM_ENABLE_FFI )
+ find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR})
+ if( FFI_INCLUDE_PATH )
+ set(FFI_HEADER ffi.h CACHE INTERNAL "")
+ set(HAVE_FFI_H 1 CACHE INTERNAL "")
+ else()
+ find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR})
+ if( FFI_INCLUDE_PATH )
+ set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "")
+ set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "")
+ endif()
+ endif()
+
+ if( NOT FFI_HEADER )
+ message(FATAL_ERROR "libffi includes are not found.")
+ endif()
+
+ find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR})
+ if( NOT FFI_LIBRARY_PATH )
+ message(FATAL_ERROR "libffi is not found.")
+ endif()
+
+ list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
+ list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
+ check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL)
+ list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
+ list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
+endif( LLVM_ENABLE_FFI )
+
# Define LLVM_MULTITHREADED if gcc atomic builtins exists.
include(CheckAtomic)
diff --git a/docs/CMake.html b/docs/CMake.html
index 0bafedd..fc729af 100644
--- a/docs/CMake.html
+++ b/docs/CMake.html
@@ -338,6 +338,12 @@
By default, <tt>&quot;-sv --no-progress-bar&quot;</tt>
on Visual C++ and Xcode,
<tt>&quot;-sv&quot;</tt> on others.</dd>
+
+ <dt><b>LLVM_ENABLE_FFI</b>:BOOL</dt>
+ <dd>Indicates whether LLVM Interpreter will be linked with Foreign
+ Function Interface library. If the library or its headers are
+ installed on a custom location, you can set the variables
+ FFI_INCLUDE_DIR and FFI_LIBRARY_DIR. Defaults to OFF.</dd>
</dl>
</div>
diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake
index 16270ff..e017dd9 100644
--- a/include/llvm/Config/config.h.cmake
+++ b/include/llvm/Config/config.h.cmake
@@ -130,13 +130,13 @@
#cmakedefine HAVE_FENV_H ${HAVE_FENV_H}
/* Define if libffi is available on this platform. */
-#undef HAVE_FFI_CALL
+#cmakedefine HAVE_FFI_CALL ${HAVE_FFI_CALL}
/* Define to 1 if you have the <ffi/ffi.h> header file. */
-#undef HAVE_FFI_FFI_H
+#cmakedefine HAVE_FFI_FFI_H ${HAVE_FFI_FFI_H}
/* Define to 1 if you have the <ffi.h> header file. */
-#undef HAVE_FFI_H
+#cmakedefine HAVE_FFI_H ${HAVE_FFI_H}
/* Set to 1 if the finite function is found in <ieeefp.h> */
#cmakedefine HAVE_FINITE_IN_IEEEFP_H ${HAVE_FINITE_IN_IEEEFP_H}
diff --git a/lib/ExecutionEngine/Interpreter/CMakeLists.txt b/lib/ExecutionEngine/Interpreter/CMakeLists.txt
index dff97fa..39df555 100644
--- a/lib/ExecutionEngine/Interpreter/CMakeLists.txt
+++ b/lib/ExecutionEngine/Interpreter/CMakeLists.txt
@@ -1,5 +1,21 @@
+# If the user required a custom path for ffi headers, use it on its
+# abolute form (see config-ix.cmake):
+if( FFI_INCLUDE_DIR )
+ include_directories( ${FFI_INCLUDE_PATH} )
+endif()
+
+# If the user required a custom path for libffi, use it on its abolute
+# form (see config-ix.cmake):
+if( FFI_LIBRARY_DIR )
+ link_directories( ${FFI_LIBRARY_PATH} )
+endif()
+
add_llvm_library(LLVMInterpreter
Execution.cpp
ExternalFunctions.cpp
Interpreter.cpp
)
+
+if( LLVM_ENABLE_FFI )
+ target_link_libraries( LLVMInterpreter ffi )
+endif()