Index: cmake/modules/HandleLLVMOptions.cmake =================================================================== --- cmake/modules/HandleLLVMOptions.cmake +++ cmake/modules/HandleLLVMOptions.cmake @@ -363,6 +363,36 @@ append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + if (NOT LLVM_ENABLE_TIMESTAMPS AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # clang-cl and cl by default produce non-deterministic binaries because + # link.exe /incremental requires a timestamp in the .obj file. clang-cl + # has the flag /Brepro to force deterministic binaries, so pass that when + # LLVM_ENABLE_TIMESTAMPS is turned off. + # This checks CMAKE_CXX_COMPILER_ID in addition to check_cxx_compiler_flag() + # because cl.exe does not emit an error on flags it doesn't understand, + # letting check_cxx_compiler_flag() claim it understands all flags. + check_cxx_compiler_flag("/Brepro" SUPPORTS_BREPRO) + append_if(SUPPORTS_BREPRO "/Brepro" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + + if (SUPPORTS_BREPRO) + # Check if /INCREMENTAL is passed to the linker and complain that it + # won't work with /Brepro. + string(TOUPPER "${CMAKE_EXE_LINKER_FLAGS}" upper_exe_flags) + string(TOUPPER "${CMAKE_MODULE_LINKER_FLAGS}" upper_module_flags) + string(TOUPPER "${CMAKE_SHARED_LINKER_FLAGS}" upper_shared_flags) + + string(FIND "${upper_exe_flags}" "/INCREMENTAL" exe_index) + string(FIND "${upper_module_flags}" "/INCREMENTAL" module_index) + string(FIND "${upper_shared_flags}" "/INCREMENTAL" shared_index) + + if (${exe_index} GREATER -1 OR + ${module_index} GREATER -1 OR + ${shared_index} GREATER -1) + message(FATAL_ERROR "LLVM_ENABLE_TIMESTAMPS not compatible with /INCREMENTAL linking") + endif() + endif() + endif() + # Disable sized deallocation if the flag is supported. MSVC fails to compile # the operator new overload in User otherwise. check_c_compiler_flag("/WX /Zc:sizedDealloc-" SUPPORTS_SIZED_DEALLOC) Index: lib/MC/WinCOFFObjectWriter.cpp =================================================================== --- lib/MC/WinCOFFObjectWriter.cpp +++ lib/MC/WinCOFFObjectWriter.cpp @@ -969,9 +969,6 @@ Header.PointerToSymbolTable = offset; - // FIXME: Remove the #else branch and make the #if branch unconditional once - // LLVM's self host configuration is aware of /Brepro. -#if (ENABLE_TIMESTAMPS == 1) // MS LINK expects to be able to use this timestamp to implement their // /INCREMENTAL feature. if (Asm.isIncrementalLinkerCompatible()) { @@ -980,12 +977,9 @@ Now = UINT32_MAX; Header.TimeDateStamp = Now; } else { + // Have deterministic output if /INCREMENTAL isn't needed. Also matches GNU. Header.TimeDateStamp = 0; } -#else - // We want a deterministic output. It looks like GNU as also writes 0 in here. - Header.TimeDateStamp = 0; -#endif // Write it all to disk... WriteFileHeader(Header); Index: test/MC/COFF/timestamp.s =================================================================== --- test/MC/COFF/timestamp.s +++ test/MC/COFF/timestamp.s @@ -1,5 +1,4 @@ // RUN: llvm-mc -filetype=obj -triple i686-pc-win32 -incremental-linker-compatible %s -o - | llvm-readobj -h | FileCheck %s -// REQUIRES: timestamps // CHECK: ImageFileHeader { // CHECK: TimeDateStamp: Index: test/lit.cfg =================================================================== --- test/lit.cfg +++ test/lit.cfg @@ -459,10 +459,6 @@ if not re.match(r'^x86_64.*-(mingw32|windows-gnu|win32)', config.target_triple): config.available_features.add('debug_frame') -# Check if we are embedding timestamps. -if config.enable_timestamps == '1': - config.available_features.add('timestamps') - # Check if we should use gmalloc. use_gmalloc_str = lit_config.params.get('use_gmalloc', None) if use_gmalloc_str is not None: Index: test/lit.site.cfg.in =================================================================== --- test/lit.site.cfg.in +++ test/lit.site.cfg.in @@ -36,7 +36,6 @@ config.have_zlib = "@HAVE_LIBZ@" config.have_dia_sdk = @HAVE_DIA_SDK@ config.enable_ffi = "@LLVM_ENABLE_FFI@" -config.enable_timestamps = "@ENABLE_TIMESTAMPS@" config.test_examples = "@ENABLE_EXAMPLES@" # Support substitution of the tools_dir with user parameters. This is