From 60670bde11fd6acd7d0538c0e7c6635e6fb2f509 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Fri, 16 Jul 2021 03:32:59 +0000 Subject: [PATCH] Build libSupport with -Werror=global-constructors (NFC) Ensure that libSupport does not carry any static global initializer. libSupport can be embedded in use cases where we don't want to load all cl::opt unless we want to parse the command line. ManagedStatic can be used to enable lazy-initialization of globals. The -Werror=global-constructors is only added on platform that have support for the flag and for which std::mutex does not have a global destructor. This is ensured by having CMake trying to compile a file with a global mutex before adding the flag to libSupport. --- lib/Support/CMakeLists.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 2242b0ec60a..014b4a2caf1 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -1,5 +1,26 @@ include(GetLibraryName) +# Ensure that libSupport does not carry any static global initializer. +# libSupport can be embedded in use cases where we don't want to load all +# cl::opt unless we want to parse the command line. +# ManagedStatic can be used to enable lazy-initialization of globals. +# We don't use `add_flag_if_supported` as instead of compiling an empty file we +# check if the current platform is able to compile global std::mutex with this +# flag (Linux can, Darwin can't for example). +check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS) +if (HAS_WERROR_GLOBAL_CTORS) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors") + CHECK_CXX_SOURCE_COMPILES(" + #include + static std::mutex TestGlobalCtorDtor; + static std::recursive_mutex TestGlobalCtorDtor2; + int main() { (void)TestGlobalCtorDtor; (void)TestGlobalCtorDtor2; return 0;} + " LLVM_HAS_NOGLOBAL_CTOR_MUTEX) + if (NOT LLVM_HAS_NOGLOBAL_CTOR_MUTEX) + string(REPLACE "-Werror=global-constructors" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + endif() +endif() + if(LLVM_ENABLE_ZLIB) set(imported_libs ZLIB::ZLIB) endif()