Commit 486b6013 authored by Senran Zhang's avatar Senran Zhang Committed by Fangrui Song
Browse files

[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
parent 8385de11
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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));
+2 −0
Original line number Diff line number Diff line
@@ -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)
+39 −0
Original line number Diff line number Diff line
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 ()
+60 −0
Original line number Diff line number Diff line
//===- 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 << '`';
}