Skip to content

Commit

Permalink
Build libSupport with -Werror=global-constructors (NFC)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
joker-eph committed Jul 27, 2021
1 parent 531b19a commit 402461b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ cd ${LIBCXX_BUILD}
ninja cxx cxxabi

FLAGS="${FLAGS} -fno-rtti -fno-exceptions"
LLVM_FLAGS="${FLAGS} -nostdinc++ -I${ZLIB_BUILD} -I${LIBCXX_BUILD}/include/c++/v1"
LLVM_FLAGS="${FLAGS} -nostdinc++ -I${ZLIB_BUILD} -I${LIBCXX_BUILD}/include/c++/v1 -Wno-error=global-constructors"

# Build LLVM.
if [[ ! -d ${LLVM_BUILD} ]]; then
Expand Down
21 changes: 21 additions & 0 deletions llvm/lib/Support/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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 <mutex>
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()
Expand Down

0 comments on commit 402461b

Please sign in to comment.