summaryrefslogtreecommitdiff
path: root/cmake/modules
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/modules')
-rwxr-xr-xcmake/modules/AddLLVM.cmake68
-rw-r--r--cmake/modules/AddLLVMDefinitions.cmake11
-rwxr-xr-xcmake/modules/AddPartiallyLinkedObject.cmake42
-rw-r--r--cmake/modules/CrossCompileLLVM.cmake26
-rwxr-xr-xcmake/modules/FindBison.cmake52
-rw-r--r--cmake/modules/GetTargetTriple.cmake19
-rwxr-xr-xcmake/modules/LLVMConfig.cmake232
-rw-r--r--cmake/modules/LLVMProcessSources.cmake39
-rw-r--r--cmake/modules/TableGen.cmake23
9 files changed, 512 insertions, 0 deletions
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
new file mode 100755
index 0000000000000..c531298a30f04
--- /dev/null
+++ b/cmake/modules/AddLLVM.cmake
@@ -0,0 +1,68 @@
+include(LLVMProcessSources)
+include(LLVMConfig)
+
+macro(add_llvm_library name)
+ llvm_process_sources( ALL_FILES ${ARGN} )
+ add_library( ${name} ${ALL_FILES} )
+ set( llvm_libs ${llvm_libs} ${name} PARENT_SCOPE)
+ set( llvm_lib_targets ${llvm_lib_targets} ${name} PARENT_SCOPE )
+ if( LLVM_COMMON_DEPENDS )
+ add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
+ endif( LLVM_COMMON_DEPENDS )
+ install(TARGETS ${name}
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+endmacro(add_llvm_library name)
+
+
+macro(add_llvm_executable name)
+ llvm_process_sources( ALL_FILES ${ARGN} )
+ add_executable(${name} ${ALL_FILES})
+ if( LLVM_USED_LIBS )
+ foreach(lib ${LLVM_USED_LIBS})
+ target_link_libraries( ${name} ${lib} )
+ endforeach(lib)
+ endif( LLVM_USED_LIBS )
+ if( LLVM_LINK_COMPONENTS )
+ llvm_config(${name} ${LLVM_LINK_COMPONENTS})
+ endif( LLVM_LINK_COMPONENTS )
+ if( MSVC )
+ target_link_libraries(${name} ${llvm_libs})
+ else( MSVC )
+ add_dependencies(${name} llvm-config.target)
+ endif( MSVC )
+ get_system_libs(llvm_system_libs)
+ if( llvm_system_libs )
+ target_link_libraries(${name} ${llvm_system_libs})
+ endif()
+endmacro(add_llvm_executable name)
+
+
+macro(add_llvm_tool name)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
+ add_llvm_executable(${name} ${ARGN})
+ install(TARGETS ${name}
+ RUNTIME DESTINATION bin)
+endmacro(add_llvm_tool name)
+
+
+macro(add_llvm_example name)
+# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR})
+ add_llvm_executable(${name} ${ARGN})
+ install(TARGETS ${name}
+ RUNTIME DESTINATION examples)
+endmacro(add_llvm_example name)
+
+
+macro(add_llvm_target target_name)
+ if( TABLEGEN_OUTPUT )
+ add_custom_target(${target_name}Table_gen
+ DEPENDS ${TABLEGEN_OUTPUT})
+ add_dependencies(${target_name}Table_gen ${LLVM_COMMON_DEPENDS})
+ endif( TABLEGEN_OUTPUT )
+ include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
+ add_partially_linked_object(LLVM${target_name} ${ARGN})
+ if( TABLEGEN_OUTPUT )
+ add_dependencies(LLVM${target_name} ${target_name}Table_gen)
+ endif( TABLEGEN_OUTPUT )
+endmacro(add_llvm_target)
diff --git a/cmake/modules/AddLLVMDefinitions.cmake b/cmake/modules/AddLLVMDefinitions.cmake
new file mode 100644
index 0000000000000..0f6d81f736d51
--- /dev/null
+++ b/cmake/modules/AddLLVMDefinitions.cmake
@@ -0,0 +1,11 @@
+# There is no clear way of keeping track of compiler command-line
+# options chosen via `add_definitions', so we need our own method for
+# using it on tools/llvm-config/CMakeLists.txt.
+
+# Beware that there is no implementation of remove_llvm_definitions.
+
+macro(add_llvm_definitions)
+ set(LLVM_DEFINITIONS "${LLVM_DEFINITIONS} ${ARGN}")
+ add_definitions( ${ARGN} )
+endmacro(add_llvm_definitions)
+
diff --git a/cmake/modules/AddPartiallyLinkedObject.cmake b/cmake/modules/AddPartiallyLinkedObject.cmake
new file mode 100755
index 0000000000000..c9d96de1b9a84
--- /dev/null
+++ b/cmake/modules/AddPartiallyLinkedObject.cmake
@@ -0,0 +1,42 @@
+include(LLVMProcessSources)
+
+macro(target_name_of_partially_linked_object lib var)
+ if( MSVC )
+ set(${var} ${lib})
+ else( MSVC )
+ set(${var} ${lib}_pll)
+ endif( MSVC )
+endmacro(target_name_of_partially_linked_object lib var)
+
+
+macro(add_partially_linked_object lib)
+ if( MSVC )
+ add_llvm_library( ${lib} ${ARGN})
+ else( MSVC )
+ set(pll ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/${lib}.o)
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib)
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib)
+ llvm_process_sources( ALL_FILES ${ARGN} )
+ if( BUILD_SHARED_LIBS AND SUPPORTS_FPIC_FLAG )
+ add_definitions(-fPIC)
+ endif()
+ add_library( ${lib} STATIC ${ALL_FILES})
+ if( LLVM_COMMON_DEPENDS )
+ add_dependencies( ${lib} ${LLVM_COMMON_DEPENDS} )
+ endif( LLVM_COMMON_DEPENDS )
+ add_custom_command(OUTPUT ${pll}
+ COMMENT "Building ${lib}.o..."
+ DEPENDS ${lib}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib/${CMAKE_CFG_INTDIR}
+ COMMAND ar x ${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}
+ COMMAND ${CMAKE_LINKER} "${LLVM_PLO_FLAGS}" -r "*${CMAKE_CXX_OUTPUT_EXTENSION}" -o ${pll}
+ COMMAND ${CMAKE_COMMAND} -E remove -f *${CMAKE_CXX_OUTPUT_EXTENSION}
+ )
+ target_name_of_partially_linked_object(${lib} tnplo)
+ add_custom_target(${tnplo} ALL DEPENDS ${pll})
+ set( llvm_libs ${llvm_libs} ${pll} PARENT_SCOPE)
+ set( llvm_lib_targets ${llvm_lib_targets} ${tnplo} PARENT_SCOPE )
+ endif( MSVC )
+ install(FILES ${pll}
+ DESTINATION lib)
+endmacro(add_partially_linked_object lib)
diff --git a/cmake/modules/CrossCompileLLVM.cmake b/cmake/modules/CrossCompileLLVM.cmake
new file mode 100644
index 0000000000000..f638d67a30d1a
--- /dev/null
+++ b/cmake/modules/CrossCompileLLVM.cmake
@@ -0,0 +1,26 @@
+
+if( ${LLVM_TABLEGEN} STREQUAL "tblgen" )
+ set(CX_NATIVE_TG_DIR "${CMAKE_BINARY_DIR}/native")
+ set(LLVM_TABLEGEN "${CX_NATIVE_TG_DIR}/bin/tblgen")
+
+ add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CX_NATIVE_TG_DIR}
+ COMMENT "Creating ${CX_NATIVE_TG_DIR}...")
+
+ add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}/CMakeCache.txt
+ COMMAND ${CMAKE_COMMAND} -UMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR}
+ WORKING_DIRECTORY ${CX_NATIVE_TG_DIR}
+ DEPENDS ${CX_NATIVE_TG_DIR}
+ COMMENT "Configuring native TableGen...")
+
+ add_custom_command(OUTPUT ${LLVM_TABLEGEN}
+ COMMAND ${CMAKE_BUILD_TOOL}
+ DEPENDS ${CX_NATIVE_TG_DIR}/CMakeCache.txt
+ WORKING_DIRECTORY ${CX_NATIVE_TG_DIR}/utils/TableGen
+ COMMENT "Building native TableGen...")
+ add_custom_target(NativeTableGen DEPENDS ${LLVM_TABLEGEN})
+
+ add_dependencies(tblgen NativeTableGen)
+
+ set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CX_NATIVE_TG_DIR})
+endif()
diff --git a/cmake/modules/FindBison.cmake b/cmake/modules/FindBison.cmake
new file mode 100755
index 0000000000000..0320ae3ce142e
--- /dev/null
+++ b/cmake/modules/FindBison.cmake
@@ -0,0 +1,52 @@
+# - Try to find Bison
+# Once done this will define
+#
+# BISON_FOUND - system has Bison
+# BISON_EXECUTABLE - path of the bison executable
+# BISON_VERSION - the version string, like "2.5.31"
+#
+
+MACRO(FIND_BISON)
+ FIND_PROGRAM(BISON_EXECUTABLE NAMES bison)
+
+ IF(BISON_EXECUTABLE)
+ SET(BISON_FOUND TRUE)
+
+ EXECUTE_PROCESS(COMMAND ${BISON_EXECUTABLE} --version
+ OUTPUT_VARIABLE _BISON_VERSION
+ )
+ string (REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" BISON_VERSION "${_bison_VERSION}")
+ ENDIF(BISON_EXECUTABLE)
+
+ IF(BISON_FOUND)
+ IF(NOT Bison_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Bison: ${BISON_EXECUTABLE}")
+ ENDIF(NOT Bison_FIND_QUIETLY)
+ ELSE(BISON_FOUND)
+ IF(Bison_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find Bison")
+ ENDIF(Bison_FIND_REQUIRED)
+ ENDIF(BISON_FOUND)
+ENDMACRO(FIND_BISON)
+
+MACRO(BISON_GENERATOR _PREFIX _Y_INPUT _H_OUTPUT _CPP_OUTPUT)
+ IF(BISON_EXECUTABLE)
+ GET_FILENAME_COMPONENT(_Y_DIR ${_Y_INPUT} PATH)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_CPP_OUTPUT}
+ OUTPUT ${_H_OUTPUT}
+ DEPENDS ${_Y_INPUT}
+ COMMAND ${BISON_EXECUTABLE}
+ ARGS
+ -p ${_PREFIX} -o"${_CPP_OUTPUT}"
+ --defines="${_H_OUTPUT}" ${_Y_INPUT}
+ WORKING_DIRECTORY ${_Y_DIR}
+ )
+ SET_SOURCE_FILES_PROPERTIES(
+ ${_CPP_OUTPUT} ${_H_OUTPUT}
+ GENERATED
+ )
+ ELSE(BISON_EXECUTABLE)
+ MESSAGE(SEND_ERROR "Can't find bison program, and it's required")
+ ENDIF(BISON_EXECUTABLE)
+ENDMACRO(BISON_GENERATOR)
diff --git a/cmake/modules/GetTargetTriple.cmake b/cmake/modules/GetTargetTriple.cmake
new file mode 100644
index 0000000000000..c915a9a6ae607
--- /dev/null
+++ b/cmake/modules/GetTargetTriple.cmake
@@ -0,0 +1,19 @@
+# Returns the host triple.
+# Invokes config.guess
+
+function( get_target_triple var )
+ if( MSVC )
+ set( ${var} "i686-pc-win32" PARENT_SCOPE )
+ else( MSVC )
+ set(config_guess ${LLVM_MAIN_SRC_DIR}/autoconf/config.guess)
+ execute_process(COMMAND sh ${config_guess}
+ RESULT_VARIABLE TT_RV
+ OUTPUT_VARIABLE TT_OUT
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if( NOT TT_RV EQUAL 0 )
+ message(FATAL_ERROR "Failed to execute ${config_guess}")
+ endif( NOT TT_RV EQUAL 0 )
+ set( ${var} ${TT_OUT} PARENT_SCOPE )
+ message(STATUS "Target triple: ${${var}}")
+ endif( MSVC )
+endfunction( get_target_triple var )
diff --git a/cmake/modules/LLVMConfig.cmake b/cmake/modules/LLVMConfig.cmake
new file mode 100755
index 0000000000000..9776fb05d2a64
--- /dev/null
+++ b/cmake/modules/LLVMConfig.cmake
@@ -0,0 +1,232 @@
+include(FindPerl)
+
+
+function(get_system_libs return_var)
+ # Returns in `return_var' a list of system libraries used by LLVM.
+ if( NOT MSVC )
+ if( MINGW )
+ set(system_libs ${system_libs} imagehlp psapi)
+ elseif( CMAKE_HOST_UNIX )
+ if( HAVE_LIBDL )
+ set(system_libs ${system_libs} dl)
+ endif()
+ if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
+ set(system_libs ${system_libs} pthread)
+ endif()
+ endif( MINGW )
+ endif( NOT MSVC )
+ set(${return_var} ${system_libs} PARENT_SCOPE)
+endfunction(get_system_libs)
+
+
+macro(llvm_config executable)
+ # extra args is the list of link components.
+ if( MSVC )
+ msvc_llvm_config(${executable} ${ARGN})
+ else( MSVC )
+ nix_llvm_config(${executable} ${ARGN})
+ endif( MSVC )
+endmacro(llvm_config)
+
+
+function(msvc_llvm_config executable)
+ set( link_components ${ARGN} )
+ if( CMAKE_CL_64 )
+ set(include_lflag "/INCLUDE:")
+ else( CMAKE_CL_64 )
+ set(include_lflag "/INCLUDE:_")
+ endif()
+ foreach(c ${link_components})
+ if( c STREQUAL "jit" )
+ set(lfgs "${lfgs} ${include_lflag}X86TargetMachineModule")
+ endif( c STREQUAL "jit" )
+ list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
+ if( NOT idx LESS 0 )
+ set(lfgs "${lfgs} ${include_lflag}${c}TargetMachineModule")
+ list(FIND LLVM_ASMPRINTERS_FORCE_LINK ${c} idx)
+ if( NOT idx LESS 0 )
+ set(lfgs "${lfgs} ${include_lflag}${c}AsmPrinterForceLink")
+ endif()
+ endif()
+ endforeach(c)
+
+ msvc_map_components_to_libraries(LIBRARIES ${link_components})
+ target_link_libraries(${executable} ${LIBRARIES})
+
+ if( lfgs )
+ set_target_properties(${executable}
+ PROPERTIES
+ LINK_FLAGS ${lfgs})
+ endif()
+endfunction(msvc_llvm_config)
+
+
+function(msvc_map_components_to_libraries out_libs)
+ set( link_components ${ARGN} )
+ foreach(c ${link_components})
+ # add codegen/asmprinter
+ list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
+ if( NOT idx LESS 0 )
+ list(FIND llvm_libs "LLVM${c}CodeGen" idx)
+ if( NOT idx LESS 0 )
+ list(APPEND expanded_components "LLVM${c}CodeGen")
+ else()
+ list(FIND llvm_libs "LLVM${c}" idx)
+ if( NOT idx LESS 0 )
+ list(APPEND expanded_components "LLVM${c}")
+ else()
+ message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
+ endif()
+ endif()
+ list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
+ if( NOT asmidx LESS 0 )
+ list(APPEND expanded_components "LLVM${c}AsmPrinter")
+ endif()
+ elseif( c STREQUAL "native" )
+ # TODO: we assume ARCH is X86. In this case, we must use nativecodegen
+ # component instead. Do nothing, as in llvm-config script.
+ elseif( c STREQUAL "nativecodegen" )
+ # TODO: we assume ARCH is X86.
+ list(APPEND expanded_components "LLVMX86CodeGen")
+ elseif( c STREQUAL "backend" )
+ # same case as in `native'.
+ elseif( c STREQUAL "engine" )
+ # TODO: as we assume we are on X86, this is `jit'.
+ list(APPEND expanded_components "LLVMJIT")
+ elseif( c STREQUAL "all" )
+ list(APPEND expanded_components ${llvm_libs})
+ else( NOT idx LESS 0 )
+ list(APPEND expanded_components LLVM${c})
+ endif( NOT idx LESS 0 )
+ endforeach(c)
+ # We must match capitalization.
+ string(TOUPPER "${llvm_libs}" capitalized_libs)
+ list(REMOVE_DUPLICATES expanded_components)
+ set(curr_idx 0)
+ list(LENGTH expanded_components lst_size)
+ while( ${curr_idx} LESS ${lst_size} )
+ list(GET expanded_components ${curr_idx} c)
+ string(TOUPPER "${c}" capitalized)
+ list(FIND capitalized_libs ${capitalized} idx)
+ if( idx LESS 0 )
+ message(FATAL_ERROR "Library ${c} not found in list of llvm libraries.")
+ endif( idx LESS 0 )
+ list(GET llvm_libs ${idx} canonical_lib)
+ list(APPEND result ${canonical_lib})
+ list(APPEND result ${MSVC_LIB_DEPS_${canonical_lib}})
+ list(APPEND expanded_components ${MSVC_LIB_DEPS_${canonical_lib}})
+ list(REMOVE_DUPLICATES expanded_components)
+ list(LENGTH expanded_components lst_size)
+ math(EXPR curr_idx "${curr_idx} + 1")
+ endwhile( ${curr_idx} LESS ${lst_size} )
+ list(REMOVE_DUPLICATES result)
+ set(${out_libs} ${result} PARENT_SCOPE)
+endfunction(msvc_map_components_to_libraries)
+
+
+macro(nix_llvm_config executable)
+ set(lc "")
+ foreach(c ${ARGN})
+ set(lc "${lc} ${c}")
+ endforeach(c)
+ if( NOT HAVE_LLVM_CONFIG )
+ target_link_libraries(${executable}
+ "`${LLVM_TOOLS_BINARY_DIR}/llvm-config --libs ${lc}`")
+ else( NOT HAVE_LLVM_CONFIG )
+ # tbi: Error handling.
+ if( NOT PERL_EXECUTABLE )
+ message(FATAL_ERROR "Perl required but not found!")
+ endif( NOT PERL_EXECUTABLE )
+ execute_process(
+ COMMAND sh -c "${PERL_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/llvm-config --libs ${lc}"
+ RESULT_VARIABLE rv
+ OUTPUT_VARIABLE libs
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(NOT rv EQUAL 0)
+ message(FATAL_ERROR "llvm-config failed for executable ${executable}")
+ endif(NOT rv EQUAL 0)
+ string(REPLACE " " ";" libs ${libs})
+ foreach(c ${libs})
+ if(c MATCHES ".*\\.o")
+ get_filename_component(fn ${c} NAME)
+ target_link_libraries(${executable}
+ ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/${fn})
+ else(c MATCHES ".*\\.o")
+ string(REPLACE "-l" "" fn ${c})
+ target_link_libraries(${executable} ${fn})
+ endif(c MATCHES ".*\\.o")
+ endforeach(c)
+ endif( NOT HAVE_LLVM_CONFIG )
+endmacro(nix_llvm_config)
+
+
+# This data is used on MSVC for stablishing executable/library
+# dependencies. Comes from the llvm-config script, which is built and
+# installed on the bin directory for MinGW or Linux. At the end of the
+# script, you'll see lines like this:
+
+# LLVMARMAsmPrinter.o: LLVMARMCodeGen.o libLLVMAsmPrinter.a libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMTarget.a
+
+# This is translated to:
+
+# set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+
+# It is necessary to remove the `lib' prefix, the `.a' and `.o'
+# suffixes. Watch out for this line:
+
+# LLVMExecutionEngine.o LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
+
+# See how there are two elements before the colon. This must be
+# translated as if it were:
+
+# LLVMExecutionEngine.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
+# LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
+
+# TODO: do this transformations on cmake.
+
+# It is very important that the LLVM built for extracting this data
+# must contain all targets, not just X86.
+
+
+set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMARMCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMAlphaAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMAlphaCodeGen LLVMAlphaAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMCBackend LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
+set(MSVC_LIB_DEPS_LLVMCellSPUAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMCellSPUCodeGen LLVMCellSPUAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMCppBackend LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMJIT LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMIA64 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMInterpreter LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMMSIL LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
+set(MSVC_LIB_DEPS_LLVMMips LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMPIC16 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMPowerPCAsmPrinter LLVMPowerPCCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMPowerPCCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMSparcAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMSparcCodeGen LLVMSparcAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMX86AsmPrinter LLVMX86CodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMX86CodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMXCore LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMAsmParser LLVMCore LLVMSupport)
+set(MSVC_LIB_DEPS_LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMBitReader LLVMCore LLVMSupport)
+set(MSVC_LIB_DEPS_LLVMBitWriter LLVMCore LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMCodeGen LLVMAnalysis LLVMCore LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils)
+set(MSVC_LIB_DEPS_LLVMCore LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMDebugger LLVMAnalysis LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMHello LLVMCore LLVMSupport)
+set(MSVC_LIB_DEPS_LLVMInstrumentation LLVMCore LLVMScalarOpts LLVMSupport LLVMTransformUtils)
+set(MSVC_LIB_DEPS_LLVMLinker LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMScalarOpts LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils)
+set(MSVC_LIB_DEPS_LLVMSelectionDAG LLVMAnalysis LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
+set(MSVC_LIB_DEPS_LLVMSupport LLVMSystem)
+set(MSVC_LIB_DEPS_LLVMSystem )
+set(MSVC_LIB_DEPS_LLVMTarget LLVMCore LLVMSupport)
+set(MSVC_LIB_DEPS_LLVMTransformUtils LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMipa)
+set(MSVC_LIB_DEPS_LLVMipa LLVMAnalysis LLVMCore LLVMSupport)
+set(MSVC_LIB_DEPS_LLVMipo LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
diff --git a/cmake/modules/LLVMProcessSources.cmake b/cmake/modules/LLVMProcessSources.cmake
new file mode 100644
index 0000000000000..12a8968c724b9
--- /dev/null
+++ b/cmake/modules/LLVMProcessSources.cmake
@@ -0,0 +1,39 @@
+include(AddFileDependencies)
+
+
+macro(add_td_sources srcs)
+ file(GLOB tds *.td)
+ if( tds )
+ source_group("TableGen descriptions" FILES ${tds})
+ set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)
+ list(APPEND ${srcs} ${tds})
+ endif()
+endmacro(add_td_sources)
+
+
+macro(add_header_files srcs)
+ file(GLOB hds *.h)
+ if( hds )
+ set_source_files_properties(${hds} PROPERTIES HEADER_FILE_ONLY ON)
+ list(APPEND ${srcs} ${hds})
+ endif()
+endmacro(add_header_files)
+
+
+function(llvm_process_sources OUT_VAR)
+ set( sources ${ARGN} )
+ # Create file dependencies on the tablegenned files, if any. Seems
+ # that this is not strictly needed, as dependencies of the .cpp
+ # sources on the tablegenned .inc files are detected and handled,
+ # but just in case...
+ foreach( s ${sources} )
+ set( f ${CMAKE_CURRENT_SOURCE_DIR}/${s} )
+ add_file_dependencies( ${f} ${TABLEGEN_OUTPUT} )
+ endforeach(s)
+ if( MSVC_IDE )
+ # This adds .td and .h files to the Visual Studio solution:
+ add_td_sources(sources)
+ add_header_files(sources)
+ endif()
+ set( ${OUT_VAR} ${sources} PARENT_SCOPE )
+endfunction(llvm_process_sources)
diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake
new file mode 100644
index 0000000000000..adb22c726b927
--- /dev/null
+++ b/cmake/modules/TableGen.cmake
@@ -0,0 +1,23 @@
+# LLVM_TARGET_DEFINITIONS must contain the name of the .td file to process.
+# Extra parameters for `tblgen' may come after `ofn' parameter.
+# Adds the name of the generated file to TABLEGEN_OUTPUT.
+
+macro(tablegen ofn)
+ file(GLOB all_tds "*.td")
+
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
+ COMMAND ${LLVM_TABLEGEN} ${ARGN} -I ${CMAKE_CURRENT_SOURCE_DIR}
+ -I ${LLVM_MAIN_SRC_DIR}/lib/Target -I ${LLVM_MAIN_INCLUDE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/${LLVM_TARGET_DEFINITIONS}
+ -o ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
+ DEPENDS ${LLVM_TABLEGEN} ${all_tds}
+ COMMENT "Building ${ofn}.tmp..."
+ )
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp ${CMAKE_CURRENT_BINARY_DIR}/${ofn}
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
+ COMMENT "Building ${ofn}..."
+ )
+ set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn})
+endmacro(tablegen)