diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /cmake/modules | |
parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
download | src-eb11fae6d08f479c0799db45860a98af528fa6e7.tar.gz src-eb11fae6d08f479c0799db45860a98af528fa6e7.zip |
Vendor import of llvm trunk r338150:vendor/llvm/llvm-trunk-r338150
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=336809
svn path=/vendor/llvm/llvm-trunk-r338150/; revision=336814; tag=vendor/llvm/llvm-trunk-r338150
Diffstat (limited to 'cmake/modules')
-rwxr-xr-x | cmake/modules/AddLLVM.cmake | 98 | ||||
-rw-r--r-- | cmake/modules/CMakeLists.txt | 6 | ||||
-rw-r--r-- | cmake/modules/CrossCompile.cmake | 3 | ||||
-rw-r--r-- | cmake/modules/FindLibpfm.cmake | 23 | ||||
-rw-r--r-- | cmake/modules/HandleLLVMOptions.cmake | 67 | ||||
-rw-r--r-- | cmake/modules/HandleLLVMStdlib.cmake | 6 | ||||
-rwxr-xr-x | cmake/modules/LLVM-Config.cmake | 2 | ||||
-rw-r--r-- | cmake/modules/LLVMConfig.cmake.in | 7 | ||||
-rw-r--r-- | cmake/modules/LLVMExternalProjectUtils.cmake | 51 | ||||
-rw-r--r-- | cmake/modules/LLVMInstallSymlink.cmake | 2 | ||||
-rw-r--r-- | cmake/modules/LLVMProcessSources.cmake | 20 |
11 files changed, 217 insertions, 68 deletions
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index fd5627eecbb2..5ea2024d1c81 100755 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -83,7 +83,7 @@ function(add_llvm_symbol_exports target_name export_file) # FIXME: Don't write the "local:" line on OpenBSD. # in the export file, also add a linker script to version LLVM symbols (form: LLVM_N.M) add_custom_command(OUTPUT ${native_export_file} - COMMAND echo "LLVM_${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} {" > ${native_export_file} + COMMAND echo "LLVM_${LLVM_VERSION_MAJOR} {" > ${native_export_file} COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> ${native_export_file} || : COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${export_file} >> ${native_export_file} COMMAND echo " local: *;" >> ${native_export_file} @@ -147,34 +147,48 @@ function(add_llvm_symbol_exports target_name export_file) set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) endfunction(add_llvm_symbol_exports) -if(NOT WIN32 AND NOT APPLE) +if(APPLE) + execute_process( + COMMAND "${CMAKE_LINKER}" -v + ERROR_VARIABLE stderr + ) + set(LLVM_LINKER_DETECTED YES) + if("${stderr}" MATCHES "PROJECT:ld64") + set(LLVM_LINKER_IS_LD64 YES) + message(STATUS "Linker detection: ld64") + else() + set(LLVM_LINKER_DETECTED NO) + message(STATUS "Linker detection: unknown") + endif() +elseif(NOT WIN32) # Detect what linker we have here if( LLVM_USE_LINKER ) set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} -Wl,--version) else() - set(command ${CMAKE_C_COMPILER} -Wl,--version) + separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}") + set(command ${CMAKE_C_COMPILER} ${flags} -Wl,--version) endif() execute_process( COMMAND ${command} OUTPUT_VARIABLE stdout ERROR_VARIABLE stderr ) - set(LLVM_LINKER_DETECTED ON) + set(LLVM_LINKER_DETECTED YES) if("${stdout}" MATCHES "GNU gold") - set(LLVM_LINKER_IS_GOLD ON) + set(LLVM_LINKER_IS_GOLD YES) message(STATUS "Linker detection: GNU Gold") elseif("${stdout}" MATCHES "^LLD") - set(LLVM_LINKER_IS_LLD ON) + set(LLVM_LINKER_IS_LLD YES) message(STATUS "Linker detection: LLD") elseif("${stdout}" MATCHES "GNU ld") - set(LLVM_LINKER_IS_GNULD ON) + set(LLVM_LINKER_IS_GNULD YES) message(STATUS "Linker detection: GNU ld") elseif("${stderr}" MATCHES "Solaris Link Editors" OR "${stdout}" MATCHES "Solaris Link Editors") - set(LLVM_LINKER_IS_SOLARISLD ON) + set(LLVM_LINKER_IS_SOLARISLD YES) message(STATUS "Linker detection: Solaris ld") else() - set(LLVM_LINKER_DETECTED OFF) + set(LLVM_LINKER_DETECTED NO) message(STATUS "Linker detection: unknown") endif() endif() @@ -207,7 +221,7 @@ function(add_link_opts target_name) elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-z -Wl,discard-unused=sections") - elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD) + elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") # Object files are compiled with -ffunction-data-sections. # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks # tools that use plugins. Always pass --gc-sections once we require @@ -486,7 +500,7 @@ function(llvm_add_library name) PROPERTIES # Since 4.0.0, the ABI version is indicated by the major version SOVERSION ${LLVM_VERSION_MAJOR} - VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) + VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}) endif() endif() @@ -508,7 +522,7 @@ function(llvm_add_library name) if(${output_name} STREQUAL "output_name-NOTFOUND") set(output_name ${name}) endif() - set(library_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX}) + set(library_name ${output_name}-${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}) set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name}) llvm_install_library_symlink(${api_name} ${library_name} SHARED @@ -566,6 +580,7 @@ function(llvm_add_library name) if(ARG_SHARED OR ARG_MODULE) llvm_externalize_debuginfo(${name}) + llvm_codesign(${name}) endif() endfunction() @@ -770,6 +785,8 @@ macro(add_llvm_executable name) # API for all shared libaries loaded by this executable. target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB}) endif() + + llvm_codesign(${name}) endmacro(add_llvm_executable name) function(export_executable_symbols target) @@ -1269,7 +1286,7 @@ function(get_llvm_lit_path base_dir file_name) endif() set(lit_file_name "llvm-lit") - if (WIN32 AND NOT CYGWIN) + if (CMAKE_HOST_WIN32 AND NOT CYGWIN) # llvm-lit needs suffix.py for multiprocess to find a main module. set(lit_file_name "${lit_file_name}.py") endif () @@ -1473,7 +1490,7 @@ function(add_llvm_tool_symlink link_name target) if(NOT ARG_OUTPUT_DIR) # If you're not overriding the OUTPUT_DIR, we can make the link relative in # the same directory. - if(UNIX) + if(CMAKE_HOST_UNIX) set(dest_binary "$<TARGET_FILE_NAME:${target}>") endif() if(CMAKE_CONFIGURATION_TYPES) @@ -1499,7 +1516,7 @@ function(add_llvm_tool_symlink link_name target) endif() endif() - if(UNIX) + if(CMAKE_HOST_UNIX) set(LLVM_LINK_OR_COPY create_symlink) else() set(LLVM_LINK_OR_COPY copy) @@ -1543,9 +1560,12 @@ function(llvm_externalize_debuginfo name) if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP) if(APPLE) - set(strip_command COMMAND xcrun strip -Sxl $<TARGET_FILE:${name}>) + if(NOT CMAKE_STRIP) + set(CMAKE_STRIP xcrun strip) + endif() + set(strip_command COMMAND ${CMAKE_STRIP} -Sxl $<TARGET_FILE:${name}>) else() - set(strip_command COMMAND strip -gx $<TARGET_FILE:${name}>) + set(strip_command COMMAND ${CMAKE_STRIP} -gx $<TARGET_FILE:${name}>) endif() endif() @@ -1557,19 +1577,48 @@ function(llvm_externalize_debuginfo name) set_property(TARGET ${name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-object_path_lto,${lto_object}") endif() + if(NOT CMAKE_DSYMUTIL) + set(CMAKE_DSYMUTIL xcrun dsymutil) + endif() add_custom_command(TARGET ${name} POST_BUILD - COMMAND xcrun dsymutil $<TARGET_FILE:${name}> + COMMAND ${CMAKE_DSYMUTIL} $<TARGET_FILE:${name}> ${strip_command} ) else() add_custom_command(TARGET ${name} POST_BUILD - COMMAND objcopy --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug + COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug ${strip_command} -R .gnu_debuglink - COMMAND objcopy --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}> + COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}> ) endif() endfunction() +function(llvm_codesign name) + if(NOT LLVM_CODESIGNING_IDENTITY) + return() + endif() + + if(APPLE) + if(NOT CMAKE_CODESIGN) + set(CMAKE_CODESIGN xcrun codesign) + endif() + if(NOT CMAKE_CODESIGN_ALLOCATE) + execute_process( + COMMAND xcrun -f codesign_allocate + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE + ) + endif() + add_custom_command( + TARGET ${name} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E + env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} + ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY} + $<TARGET_FILE:${name}> + ) + endif() +endfunction() + function(llvm_setup_rpath name) if(CMAKE_INSTALL_RPATH) return() @@ -1589,7 +1638,8 @@ function(llvm_setup_rpath name) if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") set_property(TARGET ${name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-z,origin ") - elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT LLVM_LINKER_IS_GOLD) + endif() + if(LLVM_LINKER_IS_GNULD) # $ORIGIN is not interpreted at link time by ld.bfd set_property(TARGET ${name} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ") @@ -1613,10 +1663,10 @@ function(setup_dependency_debugging name) return() endif() - set(deny_attributes_gen "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.gen\"))") - set(deny_intrinsics_gen "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.gen\"))") + set(deny_attributes_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.inc\"))") + set(deny_intrinsics_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.inc\"))") - set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_gen} ${deny_intrinsics_gen}'") + set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_inc} ${deny_intrinsics_inc}'") set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command}) endfunction() diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt index 6074e8358594..6c316a2f04fb 100644 --- a/cmake/modules/CMakeLists.txt +++ b/cmake/modules/CMakeLists.txt @@ -47,6 +47,12 @@ set(LLVM_CONFIG_LIBRARY_DIRS set(LLVM_CONFIG_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(LLVM_CONFIG_BINARY_DIR "${LLVM_BINARY_DIR}") set(LLVM_CONFIG_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}") + +if (LLVM_LINK_LLVM_DYLIB) + set(LLVM_CONFIG_LINK_LLVM_DYLIB + "set(LLVM_LINK_LLVM_DYLIB ${LLVM_LINK_LLVM_DYLIB})") +endif() + # We need to use the full path to the LLVM Exports file to make sure we get the # one from the build tree. This is due to our cmake files being split between # this source dir and the binary dir in the build tree configuration and the diff --git a/cmake/modules/CrossCompile.cmake b/cmake/modules/CrossCompile.cmake index 0ec76ead5c47..b239816c8253 100644 --- a/cmake/modules/CrossCompile.cmake +++ b/cmake/modules/CrossCompile.cmake @@ -45,10 +45,13 @@ function(llvm_create_cross_target_internal target_name toolchain buildtype) add_custom_command(OUTPUT ${LLVM_${target_name}_BUILD}/CMakeCache.txt COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" + -DCMAKE_MAKE_PROGRAM="${CMAKE_MAKE_PROGRAM}" ${CROSS_TOOLCHAIN_FLAGS_${target_name}} ${CMAKE_SOURCE_DIR} -DLLVM_TARGET_IS_CROSSCOMPILE_HOST=TRUE -DLLVM_TARGETS_TO_BUILD="${targets_to_build_arg}" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="${experimental_targets_to_build_arg}" + -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET_TRIPLE}" + -DLLVM_TARGET_ARCH="${LLVM_TARGET_ARCH}" ${build_type_flags} ${linker_flag} ${external_clang_dir} WORKING_DIRECTORY ${LLVM_${target_name}_BUILD} DEPENDS CREATE_LLVM_${target_name} diff --git a/cmake/modules/FindLibpfm.cmake b/cmake/modules/FindLibpfm.cmake new file mode 100644 index 000000000000..202bb030e380 --- /dev/null +++ b/cmake/modules/FindLibpfm.cmake @@ -0,0 +1,23 @@ +# CMake module for finding libpfm4. +# +# If successful, the following variables will be defined: +# HAVE_LIBPFM +# +# Libpfm can be disabled by setting LLVM_ENABLE_LIBPFM to 0. + +include(CheckIncludeFile) +include(CheckLibraryExists) + +if (LLVM_ENABLE_LIBPFM) + check_library_exists(pfm pfm_initialize "" HAVE_LIBPFM_INITIALIZE) + if(HAVE_LIBPFM_INITIALIZE) + check_include_file(perfmon/perf_event.h HAVE_PERFMON_PERF_EVENT_H) + check_include_file(perfmon/pfmlib.h HAVE_PERFMON_PFMLIB_H) + check_include_file(perfmon/pfmlib_perf_event.h HAVE_PERFMON_PFMLIB_PERF_EVENT_H) + if(HAVE_PERFMON_PERF_EVENT_H AND HAVE_PERFMON_PFMLIB_H AND HAVE_PERFMON_PFMLIB_PERF_EVENT_H) + set(HAVE_LIBPFM 1) + endif() + endif() +endif() + + diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake index f77600a48308..5fd318f00917 100644 --- a/cmake/modules/HandleLLVMOptions.cmake +++ b/cmake/modules/HandleLLVMOptions.cmake @@ -48,14 +48,6 @@ elseif(LLVM_PARALLEL_LINK_JOBS) message(WARNING "Job pooling is only available with Ninja generators.") endif() -if (LINKER_IS_LLD_LINK) - # Pass /MANIFEST:NO so that CMake doesn't run mt.exe on our binaries. Adding - # manifests with mt.exe breaks LLD's symbol tables and takes as much time as - # the link. See PR24476. - append("/MANIFEST:NO" - CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) -endif() - if( LLVM_ENABLE_ASSERTIONS ) # MSVC doesn't like _DEBUG on release builds. See PR 4379. if( NOT MSVC ) @@ -115,7 +107,7 @@ if(WIN32) set(LLVM_ON_UNIX 0) endif(CYGWIN) else(WIN32) - if(UNIX) + if(FUCHSIA OR UNIX) set(LLVM_ON_WIN32 0) set(LLVM_ON_UNIX 1) if(APPLE OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX") @@ -123,9 +115,9 @@ else(WIN32) else() set(LLVM_HAVE_LINK_VERSION_SCRIPT 1) endif() - else(UNIX) + else(FUCHSIA OR UNIX) MESSAGE(SEND_ERROR "Unable to determine platform") - endif(UNIX) + endif(FUCHSIA OR UNIX) endif(WIN32) set(EXEEXT ${CMAKE_EXECUTABLE_SUFFIX}) @@ -353,6 +345,19 @@ if( MSVC ) append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + # Allow users to request PDBs in release mode. CMake offeres the + # RelWithDebInfo configuration, but it uses different optimization settings + # (/Ob1 vs /Ob2 or -O2 vs -O3). LLVM provides this flag so that users can get + # PDBs without changing codegen. + option(LLVM_ENABLE_PDB OFF) + if (LLVM_ENABLE_PDB AND uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE") + append("/Zi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + # /DEBUG disables linker GC and ICF, but we want those in Release mode. + append("/DEBUG /OPT:REF /OPT:ICF" + CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS + CMAKE_SHARED_LINKER_FLAGS) + endif() + # /Zc:strictStrings is incompatible with VS12's (Visual Studio 2013's) # debug mode headers. Instead of only enabling them in VS2013's debug mode, # we'll just enable them for Visual Studio 2015 (VS 14, MSVC_VERSION 1900) @@ -550,7 +555,7 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)) append("-Wall" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() - append("-W -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + append("-Wextra -Wno-unused-parameter -Wwrite-strings" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) append("-Wcast-qual" CMAKE_CXX_FLAGS) # Turn off missing field initializer warnings for gcc to avoid noise from @@ -574,6 +579,11 @@ if (LLVM_ENABLE_WARNINGS AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)) append_if(USE_NO_UNINITIALIZED "-Wno-uninitialized" CMAKE_CXX_FLAGS) append_if(USE_NO_MAYBE_UNINITIALIZED "-Wno-maybe-uninitialized" CMAKE_CXX_FLAGS) + # Disable -Wclass-memaccess, a C++-only warning from GCC 8 that fires on + # LLVM's ADT classes. + check_cxx_compiler_flag("-Wclass-memaccess" CXX_SUPPORTS_CLASS_MEMACCESS_FLAG) + append_if(CXX_SUPPORTS_CLASS_MEMACCESS_FLAG "-Wno-class-memaccess" CMAKE_CXX_FLAGS) + # Check if -Wnon-virtual-dtor warns even though the class is marked final. # If it does, don't add it. So it won't be added on clang 3.4 and older. # This also catches cases when -Wnon-virtual-dtor isn't supported by @@ -626,7 +636,7 @@ macro(append_common_sanitizer_flags) add_flag_if_supported("-gline-tables-only" GLINE_TABLES_ONLY) endif() # Use -O1 even in debug mode, otherwise sanitizers slowdown is too large. - if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + if (uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND LLVM_OPTIMIZE_SANITIZED_BUILDS) add_flag_if_supported("-O1" O1) endif() elseif (CLANG_CL) @@ -660,11 +670,6 @@ if(LLVM_USE_SANITIZER) append_common_sanitizer_flags() append("-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - set(BLACKLIST_FILE "${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt") - if (EXISTS "${BLACKLIST_FILE}") - append("-fsanitize-blacklist=${BLACKLIST_FILE}" - CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - endif() elseif (LLVM_USE_SANITIZER STREQUAL "Thread") append_common_sanitizer_flags() append("-fsanitize=thread" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) @@ -696,6 +701,13 @@ if(LLVM_USE_SANITIZER) if (LLVM_USE_SANITIZE_COVERAGE) append("-fsanitize=fuzzer-no-link" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() + if (LLVM_USE_SANITIZER MATCHES ".*Undefined.*") + set(BLACKLIST_FILE "${CMAKE_SOURCE_DIR}/utils/sanitizers/ubsan_blacklist.txt") + if (EXISTS "${BLACKLIST_FILE}") + append("-fsanitize-blacklist=${BLACKLIST_FILE}" + CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + endif() + endif() endif() # Turn on -gsplit-dwarf if requested @@ -707,11 +719,13 @@ add_definitions( -D__STDC_CONSTANT_MACROS ) add_definitions( -D__STDC_FORMAT_MACROS ) add_definitions( -D__STDC_LIMIT_MACROS ) -# clang doesn't print colored diagnostics when invoked from Ninja +# clang and gcc don't default-print colored diagnostics when invoked from Ninja. if (UNIX AND - CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND - CMAKE_GENERATOR STREQUAL "Ninja") - append("-fcolor-diagnostics" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + CMAKE_GENERATOR STREQUAL "Ninja" AND + (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR + (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND + NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)))) + append("-fdiagnostics-color" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() # lld doesn't print colored diagnostics when invoked from Ninja @@ -849,6 +863,13 @@ else() set(LLVM_ENABLE_PLUGINS ON) endif() +set(LLVM_ENABLE_IDE_default OFF) +if (XCODE OR MSVC_IDE OR CMAKE_EXTRA_GENERATOR) + set(LLVM_ENABLE_IDE_default ON) +endif() +option(LLVM_ENABLE_IDE "Generate targets and process sources for use with an IDE" + ${LLVM_ENABLE_IDE_default}) + function(get_compile_definitions) get_directory_property(top_dir_definitions DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS) foreach(definition ${top_dir_definitions}) @@ -861,3 +882,5 @@ function(get_compile_definitions) set(LLVM_DEFINITIONS "${result}" PARENT_SCOPE) endfunction() get_compile_definitions() + +option(LLVM_FORCE_ENABLE_STATS "Enable statistics collection for builds that wouldn't normally enable it" OFF) diff --git a/cmake/modules/HandleLLVMStdlib.cmake b/cmake/modules/HandleLLVMStdlib.cmake index c0512ac34f6d..a0706d8e0846 100644 --- a/cmake/modules/HandleLLVMStdlib.cmake +++ b/cmake/modules/HandleLLVMStdlib.cmake @@ -13,10 +13,12 @@ if(NOT DEFINED LLVM_STDLIB_HANDLED) endfunction() include(CheckCXXCompilerFlag) + include(CheckLinkerFlag) if(LLVM_ENABLE_LIBCXX) if(LLVM_COMPILER_IS_GCC_COMPATIBLE) - check_cxx_compiler_flag("-stdlib=libc++" CXX_SUPPORTS_STDLIB) - if(CXX_SUPPORTS_STDLIB) + check_cxx_compiler_flag("-stdlib=libc++" CXX_COMPILER_SUPPORTS_STDLIB) + check_linker_flag("-stdlib=libc++" CXX_LINKER_SUPPORTS_STDLIB) + if(CXX_COMPILER_SUPPORTS_STDLIB AND CXX_LINKER_SUPPORTS_STDLIB) append("-stdlib=libc++" CMAKE_CXX_FLAGS CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS) diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake index 10fd52609274..8eabddc73775 100755 --- a/cmake/modules/LLVM-Config.cmake +++ b/cmake/modules/LLVM-Config.cmake @@ -68,7 +68,7 @@ macro(llvm_config executable) cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN}) set(link_components ${ARG_UNPARSED_ARGUMENTS}) - if(USE_SHARED) + if(ARG_USE_SHARED) # If USE_SHARED is specified, then we link against libLLVM, # but also against the component libraries below. This is # done in case libLLVM does not contain all of the components diff --git a/cmake/modules/LLVMConfig.cmake.in b/cmake/modules/LLVMConfig.cmake.in index 077201691656..8b4c22a30314 100644 --- a/cmake/modules/LLVMConfig.cmake.in +++ b/cmake/modules/LLVMConfig.cmake.in @@ -13,6 +13,10 @@ set(LLVM_COMMON_DEPENDS @LLVM_COMMON_DEPENDS@) set(LLVM_AVAILABLE_LIBS @LLVM_AVAILABLE_LIBS@) +@LLVM_CONFIG_LINK_LLVM_DYLIB@ + +set(LLVM_DYLIB_COMPONENTS @LLVM_DYLIB_COMPONENTS@) + set(LLVM_ALL_TARGETS @LLVM_ALL_TARGETS@) set(LLVM_TARGETS_TO_BUILD @LLVM_TARGETS_TO_BUILD@) @@ -37,6 +41,8 @@ set(LLVM_ENABLE_THREADS @LLVM_ENABLE_THREADS@) set(LLVM_ENABLE_ZLIB @LLVM_ENABLE_ZLIB@) +set(LLVM_LIBXML2_ENABLED @LLVM_LIBXML2_ENABLED@) + set(LLVM_ENABLE_DIA_SDK @LLVM_ENABLE_DIA_SDK@) set(LLVM_NATIVE_ARCH @LLVM_NATIVE_ARCH@) @@ -54,7 +60,6 @@ set(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS @LLVM_EXPORT_SYMBOLS_FOR_PLUGINS@) set(LLVM_PLUGIN_EXT @LLVM_PLUGIN_EXT@) set(LLVM_ON_UNIX @LLVM_ON_UNIX@) -set(LLVM_ON_WIN32 @LLVM_ON_WIN32@) set(LLVM_LIBDIR_SUFFIX @LLVM_LIBDIR_SUFFIX@) diff --git a/cmake/modules/LLVMExternalProjectUtils.cmake b/cmake/modules/LLVMExternalProjectUtils.cmake index b84ebbb53872..f736c3947843 100644 --- a/cmake/modules/LLVMExternalProjectUtils.cmake +++ b/cmake/modules/LLVMExternalProjectUtils.cmake @@ -46,7 +46,7 @@ function(llvm_ExternalProject_Add name source_dir) if(NOT ARG_TOOLCHAIN_TOOLS) set(ARG_TOOLCHAIN_TOOLS clang lld) if(NOT APPLE AND NOT WIN32) - list(APPEND ARG_TOOLCHAIN_TOOLS llvm-ar llvm-ranlib) + list(APPEND ARG_TOOLCHAIN_TOOLS llvm-ar llvm-ranlib llvm-nm llvm-objcopy llvm-objdump llvm-strip) endif() endif() foreach(tool ${ARG_TOOLCHAIN_TOOLS}) @@ -102,17 +102,32 @@ function(llvm_ExternalProject_Add name source_dir) endforeach() endforeach() - if(ARG_USE_TOOLCHAIN) + if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING) if(CLANG_IN_TOOLCHAIN) set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++) endif() + if(lld IN_LIST TOOLCHAIN_TOOLS) + list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld) + endif() if(llvm-ar IN_LIST TOOLCHAIN_TOOLS) list(APPEND compiler_args -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar) endif() if(llvm-ranlib IN_LIST TOOLCHAIN_TOOLS) list(APPEND compiler_args -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib) endif() + if(llvm-nm IN_LIST TOOLCHAIN_TOOLS) + list(APPEND compiler_args -DCMAKE_NM=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-nm) + endif() + if(llvm-objdump IN_LIST TOOLCHAIN_TOOLS) + list(APPEND compiler_args -DCMAKE_OBJDUMP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objdump) + endif() + if(llvm-objcopy IN_LIST TOOLCHAIN_TOOLS) + list(APPEND compiler_args -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy) + endif() + if(llvm-strip IN_LIST TOOLCHAIN_TOOLS) + list(APPEND compiler_args -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip) + endif() list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS}) endif() @@ -136,6 +151,21 @@ function(llvm_ExternalProject_Add name source_dir) set(sysroot_arg -DCMAKE_SYSROOT=${CMAKE_SYSROOT}) endif() + if(CMAKE_CROSSCOMPILING) + set(compiler_args -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_LINKER=${CMAKE_LINKER} + -DCMAKE_AR=${CMAKE_AR} + -DCMAKE_RANLIB=${CMAKE_RANLIB} + -DCMAKE_NM=${CMAKE_NM} + -DCMAKE_OBJCOPY=${CMAKE_OBJCOPY} + -DCMAKE_OBJDUMP=${CMAKE_OBJDUMP} + -DCMAKE_STRIP=${CMAKE_STRIP}) + set(llvm_config_path ${LLVM_CONFIG_PATH}) + else() + set(llvm_config_path "$<TARGET_FILE:llvm-config>") + endif() + ExternalProject_Add(${name} DEPENDS ${ARG_DEPENDS} llvm-config ${name}-clobber @@ -149,7 +179,7 @@ function(llvm_ExternalProject_Add name source_dir) -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} ${sysroot_arg} -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR} - -DLLVM_CONFIG_PATH=$<TARGET_FILE:llvm-config> + -DLLVM_CONFIG_PATH=${llvm_config_path} -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR} -DLLVM_HOST_TRIPLE=${LLVM_HOST_TRIPLE} -DLLVM_HAVE_LINK_VERSION_SCRIPT=${LLVM_HAVE_LINK_VERSION_SCRIPT} @@ -191,7 +221,7 @@ function(llvm_ExternalProject_Add name source_dir) endif() if(NOT ARG_NO_INSTALL) - install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${BINARY_DIR}/cmake_install.cmake \)" + install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_DO_STRIP=\${CMAKE_INSTALL_DO_STRIP} -P ${BINARY_DIR}/cmake_install.cmake\)" COMPONENT ${name}) add_llvm_install_targets(install-${name} @@ -201,16 +231,13 @@ function(llvm_ExternalProject_Add name source_dir) # Add top-level targets foreach(target ${ARG_EXTRA_TARGETS}) - string(REPLACE ":" ";" target_list ${target}) - list(GET target_list 0 target) - list(LENGTH target_list target_list_len) - if(${target_list_len} GREATER 1) - list(GET target_list 1 target_name) + if(DEFINED ${target}) + set(external_target "${${target}}") else() - set(target_name "${target}") + set(external_target "${target}") endif() - llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target} ${BINARY_DIR}) - add_custom_target(${target_name} + llvm_ExternalProject_BuildCmd(build_runtime_cmd ${external_target} ${BINARY_DIR}) + add_custom_target(${target} COMMAND ${build_runtime_cmd} DEPENDS ${name}-configure WORKING_DIRECTORY ${BINARY_DIR} diff --git a/cmake/modules/LLVMInstallSymlink.cmake b/cmake/modules/LLVMInstallSymlink.cmake index 482697b06baf..1a04de931ff7 100644 --- a/cmake/modules/LLVMInstallSymlink.cmake +++ b/cmake/modules/LLVMInstallSymlink.cmake @@ -3,7 +3,7 @@ # See PR8397. function(install_symlink name target outdir) - if(UNIX) + if(CMAKE_HOST_UNIX) set(LINK_OR_COPY create_symlink) set(DESTDIR $ENV{DESTDIR}) else() diff --git a/cmake/modules/LLVMProcessSources.cmake b/cmake/modules/LLVMProcessSources.cmake index 3b4838daed5a..f65f31d797cf 100644 --- a/cmake/modules/LLVMProcessSources.cmake +++ b/cmake/modules/LLVMProcessSources.cmake @@ -52,7 +52,7 @@ function(llvm_process_sources OUT_VAR) cmake_parse_arguments(ARG "" "" "ADDITIONAL_HEADERS;ADDITIONAL_HEADER_DIRS" ${ARGN}) set(sources ${ARG_UNPARSED_ARGUMENTS}) llvm_check_source_file_list( ${sources} ) - if( MSVC_IDE OR XCODE ) + if( LLVM_ENABLE_IDE ) # This adds .td and .h files to the Visual Studio solution: add_td_sources(sources) find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}") @@ -69,14 +69,18 @@ endfunction(llvm_process_sources) function(llvm_check_source_file_list) cmake_parse_arguments(ARG "" "SOURCE_DIR" "" ${ARGN}) - set(listed ${ARG_UNPARSED_ARGUMENTS}) + foreach(l ${ARG_UNPARSED_ARGUMENTS}) + get_filename_component(fp ${l} REALPATH) + list(APPEND listed ${fp}) + endforeach() + if(ARG_SOURCE_DIR) file(GLOB globbed - RELATIVE "${CMAKE_CURRENT_LIST_DIR}" "${ARG_SOURCE_DIR}/*.c" "${ARG_SOURCE_DIR}/*.cpp") else() file(GLOB globbed *.c *.cpp) endif() + foreach(g ${globbed}) get_filename_component(fn ${g} NAME) if(ARG_SOURCE_DIR) @@ -84,15 +88,21 @@ function(llvm_check_source_file_list) else() set(entry "${fn}") endif() + get_filename_component(gp ${g} REALPATH) # Don't reject hidden files. Some editors create backups in the # same directory as the file. if (NOT "${fn}" MATCHES "^\\.") list(FIND LLVM_OPTIONAL_SOURCES ${entry} idx) if( idx LESS 0 ) - list(FIND listed ${entry} idx) + list(FIND listed ${gp} idx) if( idx LESS 0 ) - message(SEND_ERROR "Found unknown source file ${g} + if(ARG_SOURCE_DIR) + set(fn_relative "${ARG_SOURCE_DIR}/${fn}") + else() + set(fn_relative "${fn}") + endif() + message(SEND_ERROR "Found unknown source file ${fn_relative} Please update ${CMAKE_CURRENT_LIST_FILE}\n") endif() endif() |