+ check_function_exists(__main HAVE___MAIN)
+ check_function_exists(__cmpdi2 HAVE___CMPDI2)
+endif()
+if( HAVE_ARGZ_H )
+ check_symbol_exists(argz_append argz.h HAVE_ARGZ_APPEND)
+ check_symbol_exists(argz_create_sep argz.h HAVE_ARGZ_CREATE_SEP)
+ check_symbol_exists(argz_insert argz.h HAVE_ARGZ_INSERT)
+ check_symbol_exists(argz_next argz.h HAVE_ARGZ_NEXT)
+ check_symbol_exists(argz_stringify argz.h HAVE_ARGZ_STRINGIFY)
+endif()
+if( HAVE_DLFCN_H )
+ if( HAVE_LIBDL )
+ list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
+ endif()
+ check_symbol_exists(dlerror dlfcn.h HAVE_DLERROR)
+ check_symbol_exists(dlopen dlfcn.h HAVE_DLOPEN)
+ if( HAVE_LIBDL )
+ list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES dl)
+ endif()
+endif()
+
+check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
+if( LLVM_USING_GLIBC )
+ add_llvm_definitions( -D_GNU_SOURCE )
+endif()
+
+set(headers "")
+if (HAVE_SYS_TYPES_H)
+ set(headers ${headers} "sys/types.h")
+endif()
+
+if (HAVE_INTTYPES_H)
+ set(headers ${headers} "inttypes.h")
+endif()
+
+if (HAVE_STDINT_H)
+ set(headers ${headers} "stdint.h")
+endif()
+
+check_type_exists(int64_t "${headers}" HAVE_INT64_T)
+check_type_exists(uint64_t "${headers}" HAVE_UINT64_T)
+check_type_exists(u_int64_t "${headers}" HAVE_U_INT64_T)
+check_type_exists(error_t errno.h HAVE_ERROR_T)
+
+# available programs checks
+function(llvm_find_program name)
+ string(TOUPPER ${name} NAME)
+ string(REGEX REPLACE "\\." "_" NAME ${NAME})
+ find_program(LLVM_PATH_${NAME} ${name})
+ mark_as_advanced(LLVM_PATH_${NAME})
+ if(LLVM_PATH_${NAME})
+ set(HAVE_${NAME} 1 CACHE INTERNAL "Is ${name} available ?")
+ mark_as_advanced(HAVE_${NAME})
+ else(LLVM_PATH_${NAME})
+ set(HAVE_${NAME} "" CACHE INTERNAL "Is ${name} available ?")
+ endif(LLVM_PATH_${NAME})
+endfunction()
+
+llvm_find_program(gv)
+llvm_find_program(circo)
+llvm_find_program(twopi)
+llvm_find_program(neato)
+llvm_find_program(fdp)
+llvm_find_program(dot)
+llvm_find_program(dotty)
+llvm_find_program(xdot.py)
+llvm_find_program(Graphviz)
+
+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})
+else()
+ unset(HAVE_FFI_FFI_H CACHE)
+ unset(HAVE_FFI_H CACHE)
+ unset(HAVE_FFI_CALL CACHE)
+endif( LLVM_ENABLE_FFI )
+
+# Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
+include(CheckAtomic)
+
+if( LLVM_ENABLE_PIC )
+ set(ENABLE_PIC 1)
+else()
+ set(ENABLE_PIC 0)
+endif()
+
+include(CheckCXXCompilerFlag)
+
+check_cxx_compiler_flag("-Wno-variadic-macros" SUPPORTS_NO_VARIADIC_MACROS_FLAG)
+
+include(GetHostTriple)
+get_host_triple(LLVM_HOST_TRIPLE)
+
+# By default, we target the host, but this can be overridden at CMake
+# invocation time.
+set(LLVM_HOSTTRIPLE "${LLVM_HOST_TRIPLE}")
+
+# Determine the native architecture.
+string(TOLOWER "${LLVM_TARGET_ARCH}" LLVM_NATIVE_ARCH)
+if( LLVM_NATIVE_ARCH STREQUAL "host" )
+ string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE})
+endif ()
+
+if (LLVM_NATIVE_ARCH MATCHES "i[2-6]86")
+ set(LLVM_NATIVE_ARCH X86)
+elseif (LLVM_NATIVE_ARCH STREQUAL "x86")
+ set(LLVM_NATIVE_ARCH X86)
+elseif (LLVM_NATIVE_ARCH STREQUAL "amd64")
+ set(LLVM_NATIVE_ARCH X86)
+elseif (LLVM_NATIVE_ARCH STREQUAL "x86_64")
+ set(LLVM_NATIVE_ARCH X86)
+elseif (LLVM_NATIVE_ARCH MATCHES "sparc")
+ set(LLVM_NATIVE_ARCH Sparc)
+elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
+ set(LLVM_NATIVE_ARCH PowerPC)
+elseif (LLVM_NATIVE_ARCH MATCHES "arm")
+ set(LLVM_NATIVE_ARCH ARM)
+elseif (LLVM_NATIVE_ARCH MATCHES "mips")
+ set(LLVM_NATIVE_ARCH Mips)
+elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
+ set(LLVM_NATIVE_ARCH XCore)
+elseif (LLVM_NATIVE_ARCH MATCHES "msp430")
+ set(LLVM_NATIVE_ARCH MSP430)
+elseif (LLVM_NATIVE_ARCH MATCHES "hexagon")
+ set(LLVM_NATIVE_ARCH Hexagon)
+else ()
+ message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
+endif ()
+
+list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
+if (NATIVE_ARCH_IDX EQUAL -1)
+ message(STATUS
+ "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
+else ()
+ message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}")
+ set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target)
+ set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo)
+ set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC)
+ set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter)
+
+ # We don't have an ASM parser for all architectures yet.
+ if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt)
+ set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser)
+ endif ()
+
+ # We don't have an disassembler for all architectures yet.
+ if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt)
+ set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler)
+ endif ()
+endif ()