[llvm] 486b601 - [Support] Initialize common options in `getRegisteredOptions`

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 3 23:59:14 PDT 2021


Author: Senran Zhang
Date: 2021-08-03T23:59:10-07:00
New Revision: 486b6013f967ff80f8fa4d20bf5b93e94ce72aa0

URL: https://github.com/llvm/llvm-project/commit/486b6013f967ff80f8fa4d20bf5b93e94ce72aa0
DIFF: https://github.com/llvm/llvm-project/commit/486b6013f967ff80f8fa4d20bf5b93e94ce72aa0.diff

LOG: [Support] Initialize common options in `getRegisteredOptions`

This allows users accessing options in libSupport before invoking
`cl::ParseCommandLineOptions`, and also matches the behavior before
D105959.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D106334

Added: 
    llvm/unittests/Support/CommandLineInit/CMakeLists.txt
    llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp

Modified: 
    llvm/lib/Support/CommandLine.cpp
    llvm/unittests/Support/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index 4ae3ad4c24535..6c140863b13cc 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -2633,6 +2633,7 @@ void cl::AddExtraVersionPrinter(VersionPrinterTy func) {
 }
 
 StringMap<Option *> &cl::getRegisteredOptions(SubCommand &Sub) {
+  initCommonOptions();
   auto &Subs = GlobalParser->RegisteredSubCommands;
   (void)Subs;
   assert(is_contained(Subs, &Sub));

diff  --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt
index f03f12ee88e05..f1145681389e9 100644
--- a/llvm/unittests/Support/CMakeLists.txt
+++ b/llvm/unittests/Support/CMakeLists.txt
@@ -127,3 +127,5 @@ if(NOT LLVM_INTEGRATED_CRT_ALLOC)
   # The test doesn't pass when using a custom allocator, PR47881.
   add_subdirectory(DynamicLibrary)
 endif()
+
+add_subdirectory(CommandLineInit)

diff  --git a/llvm/unittests/Support/CommandLineInit/CMakeLists.txt b/llvm/unittests/Support/CommandLineInit/CMakeLists.txt
new file mode 100644
index 0000000000000..a69182f646980
--- /dev/null
+++ b/llvm/unittests/Support/CommandLineInit/CMakeLists.txt
@@ -0,0 +1,39 @@
+set(test_name CommandLineInitTests)
+set(test_suite UnitTests)
+
+# We don't call add_llvm_unittest() here, because the function automatically
+# links the test against TestMain.cpp, in which main() function calls
+# llvm::cl::ParseCommandLineOptions, and it makes the test always pass.
+# The following code mainly comes from `add_unittest` in
+# llvm/cmake/modules/AddLLVM.cmake, except that gtest_main is excluded from
+# target_link_libraries to prevent the test linking against TestMain.cpp.
+
+if (NOT LLVM_BUILD_TESTS)
+  set(EXCLUDE_FROM_ALL ON)
+endif()
+
+if (SUPPORTS_VARIADIC_MACROS_FLAG)
+  list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
+endif ()
+# Some parts of gtest rely on this GNU extension, don't warn on it.
+if(SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG)
+  list(APPEND LLVM_COMPILE_FLAGS "-Wno-gnu-zero-variadic-macro-arguments")
+endif()
+
+list(APPEND LLVM_LINK_COMPONENTS Support)
+
+add_llvm_executable(${test_name}
+  IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH
+  CommandLineInitTest.cpp)
+
+target_link_libraries(${test_name} PRIVATE gtest)
+
+add_dependencies(${test_suite} ${test_name})
+
+set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
+set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
+
+get_target_property(test_suite_folder ${test_suite} FOLDER)
+if (test_suite_folder)
+  set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
+endif ()

diff  --git a/llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp b/llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
new file mode 100644
index 0000000000000..391b344bd6450
--- /dev/null
+++ b/llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
@@ -0,0 +1,60 @@
+//===- llvm/unittest/Support/CommandLineInit/CommandLineInitTest.cpp ------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file
+/// Check if preset options in libSupport -- e.g., "help", "version", etc. --
+/// are correctly initialized and registered before getRegisteredOptions is
+/// invoked.
+///
+/// Most code here comes from llvm/utils/unittest/UnitTestMain/TestMain.cpp,
+/// except that llvm::cl::ParseCommandLineOptions() call is removed.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/CommandLine.h"
+#include "gtest/gtest.h"
+
+#if defined(_WIN32)
+#include <windows.h>
+#if defined(_MSC_VER)
+#include <crtdbg.h>
+#endif
+#endif
+
+using namespace llvm;
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+#if defined(_WIN32)
+  // Disable all of the possible ways Windows conspires to make automated
+  // testing impossible.
+  ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+#if defined(_MSC_VER)
+  ::_set_error_mode(_OUT_TO_STDERR);
+  _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+  _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+  _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+  _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+  _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+  _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+#endif
+#endif
+
+  return RUN_ALL_TESTS();
+}
+
+TEST(CommandLineInitTest, GetPresetOptions) {
+  StringMap<cl::Option *> &Map =
+      cl::getRegisteredOptions(*cl::TopLevelSubCommand);
+
+  for (auto *Str :
+       {"help", "help-hidden", "help-list", "help-list-hidden", "version"})
+    EXPECT_EQ(Map.count(Str), (size_t)1)
+        << "Could not get preset option `" << Str << '`';
+}


        


More information about the llvm-commits mailing list