From 41fe3a54c2613d81a68eb02ae76b394d0b8849ab Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 4 Apr 2019 18:30:07 +0000 Subject: Ensure that ManagedStatic is constant initialized in MSVC 2017 & 2019 Fixes PR41367. This effectively relands r357655 with a workaround for MSVC 2017. I tried various approaches with unions, but I ended up going with this ifdef approach because it lets us write the proper C++11 code that we want to write, with a separate workaround that we can delete when we drop MSVC 2017 support. This also adds LLVM_REQUIRE_CONSTANT_INITIALIZATION, which wraps [[clang::require_constant_initialization]]. This actually detected a minor issue when using clang-cl where clang wasn't able to use the constexpr constructor in MSVC's STL, so I switched back to using the default ctor of std::atomic. llvm-svn: 357714 --- llvm/lib/Support/CommandLine.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Support/CommandLine.cpp') diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp index c1193f9..d2cfef9f 100644 --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -373,11 +373,16 @@ void OptionCategory::registerCategory() { GlobalParser->registerCategory(this); } -// A special subcommand representing no subcommand -ManagedStatic llvm::cl::TopLevelSubCommand; +// A special subcommand representing no subcommand. It is particularly important +// that this ManagedStatic uses constant initailization and not dynamic +// initialization because it is referenced from cl::opt constructors, which run +// dynamically in an arbitrary order. +LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic + llvm::cl::TopLevelSubCommand; // A special subcommand that can be used to put an option into all subcommands. -ManagedStatic llvm::cl::AllSubCommands; +LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic + llvm::cl::AllSubCommands; void SubCommand::registerSubCommand() { GlobalParser->registerSubCommand(this); -- cgit v1.1