+check_symbol_exists(strtoq stdlib.h HAVE_STRTOQ)
+check_symbol_exists(strerror string.h HAVE_STRERROR)
+check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
+check_symbol_exists(strerror_s string.h HAVE_DECL_STRERROR_S)
+check_symbol_exists(memcpy string.h HAVE_MEMCPY)
+check_symbol_exists(memmove string.h HAVE_MEMMOVE)
+check_symbol_exists(setenv stdlib.h HAVE_SETENV)
+if( PURE_WINDOWS )
+ check_symbol_exists(_chsize_s io.h HAVE__CHSIZE_S)
+
+ check_function_exists(_alloca HAVE__ALLOCA)
+ check_function_exists(__alloca HAVE___ALLOCA)
+ check_function_exists(__chkstk HAVE___CHKSTK)
+ check_function_exists(___chkstk HAVE____CHKSTK)
+
+ check_function_exists(__ashldi3 HAVE___ASHLDI3)
+ check_function_exists(__ashrdi3 HAVE___ASHRDI3)
+ check_function_exists(__divdi3 HAVE___DIVDI3)
+ check_function_exists(__fixdfdi HAVE___FIXDFDI)
+ check_function_exists(__fixsfdi HAVE___FIXSFDI)
+ check_function_exists(__floatdidf HAVE___FLOATDIDF)
+ check_function_exists(__lshrdi3 HAVE___LSHRDI3)
+ check_function_exists(__moddi3 HAVE___MODDI3)
+ check_function_exists(__udivdi3 HAVE___UDIVDI3)
+ check_function_exists(__umoddi3 HAVE___UMODDI3)
+
+ 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()
+
+# Type checks
+check_type_exists(std::bidirectional_iterator<int,int> "iterator;iostream" HAVE_BI_ITERATOR)
+check_type_exists(std::iterator<int,int,int> iterator HAVE_STD_ITERATOR)
+check_type_exists(std::forward_iterator<int,int> iterator HAVE_FWD_ITERATOR)
+
+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)
+
+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_MULTITHREADED if gcc atomic builtins exists.
+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)