Skip to content

[clang] Merge gtest binaries into AllClangUnitTests #134196

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Apr 29, 2025
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ getCodeModel(const CodeGenOptions &CodeGenOpts) {
.Case("kernel", llvm::CodeModel::Kernel)
.Case("medium", llvm::CodeModel::Medium)
.Case("large", llvm::CodeModel::Large)
.Case("default", ~1u)
.Cases("default", "", ~1u)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain why this change is needed?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically, after my change, some Frontend tests now exercise this codepath without setting up a code model, and they hit the assert below. What changed is that now the target they are generating IR for is registered, so this codepath executes, when it didn't before my change. Interpreting "empty" as the default code model here seemed like the most sensible thing to do, rather than adding logic to those tests to explicitly set a code model.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was going to ask about this: Why do FrontendTests now have to call llvm::InitializeAllTargetMCs();? They used to not depend on llvm/lib/Target at all. Why is this needed now that that code gets linked into a bigger binary?

.Default(~0u);
assert(CodeModel != ~0u && "invalid code model!");
if (CodeModel == ~1u)
Expand Down
54 changes: 52 additions & 2 deletions clang/unittests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ if(CLANG_BUILT_STANDALONE)
endif()
endif()

# add_clang_unittest(test_name file1.cpp file2.cpp)
# add_distinct_clang_unittest(test_name file1.cpp file2.cpp)
#
# Will compile the list of files together and link against the clang
# Produces a binary named 'basename(test_name)'.
function(add_clang_unittest test_name)
function(add_distinct_clang_unittest test_name)
cmake_parse_arguments(ARG
""
""
Expand Down Expand Up @@ -47,6 +47,34 @@ function(add_clang_unittest test_name)
target_link_libraries(${test_name} PRIVATE ${ARG_LINK_LIBS})
endfunction()

set(doc_opts BRIEF_DOCS "<internal setting>" FULL_DOCS "<internal settings>")
define_property(GLOBAL PROPERTY CLANG_UNITTEST_SRCS ${doc_opts})
define_property(GLOBAL PROPERTY CLANG_UNITTEST_LLVM_COMPONENTS ${doc_opts})
define_property(GLOBAL PROPERTY CLANG_UNITTEST_CLANG_LIBS ${doc_opts})
define_property(GLOBAL PROPERTY CLANG_UNITTEST_LINK_LIBS ${doc_opts})

# add_clang_unittest(test_name file1.cpp file2.cpp)
#
# Adds unittests to the combined AllClangUnitTests binary. The unittest binary
# is defined after adding all unittest subdirectories.
function(add_clang_unittest test_name)
cmake_parse_arguments(ARG
""
""
"CLANG_LIBS;LINK_LIBS;LLVM_COMPONENTS"
${ARGN})

file(RELATIVE_PATH src_prefix "${CMAKE_CURRENT_FUNCTION_LIST_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
set(srcs_prefixed)
foreach(src ${ARG_UNPARSED_ARGUMENTS})
set(srcs_prefixed ${srcs_prefixed} "${src_prefix}/${src}")
endforeach()
set_property(GLOBAL APPEND PROPERTY CLANG_UNITTEST_SRCS ${srcs_prefixed})
set_property(GLOBAL APPEND PROPERTY CLANG_UNITTEST_CLANG_LIBS ${ARG_CLANG_LIBS})
set_property(GLOBAL APPEND PROPERTY CLANG_UNITTEST_LINK_LIBS ${ARG_LINK_LIBS})
set_property(GLOBAL APPEND PROPERTY CLANG_UNITTEST_LLVM_COMPONENTS ${ARG_LLVM_COMPONENTS})
endfunction()

add_subdirectory(Basic)
add_subdirectory(Lex)
add_subdirectory(Parse)
Expand Down Expand Up @@ -77,3 +105,25 @@ add_subdirectory(Index)
add_subdirectory(InstallAPI)
add_subdirectory(Serialization)
add_subdirectory(Support)


# If we're doing a single merged clang unit test binary, add that target after
# all the previous subdirectories have been processed.
get_property(SRCS GLOBAL PROPERTY CLANG_UNITTEST_SRCS)
get_property(CLANG_LIBS GLOBAL PROPERTY CLANG_UNITTEST_CLANG_LIBS)
get_property(LINK_LIBS GLOBAL PROPERTY CLANG_UNITTEST_LINK_LIBS)
get_property(LLVM_COMPONENTS GLOBAL PROPERTY CLANG_UNITTEST_LLVM_COMPONENTS)
add_distinct_clang_unittest(AllClangUnitTests
${SRCS}
CLANG_LIBS
${CLANG_LIBS}
LINK_LIBS
${LINK_LIBS}
LLVM_COMPONENTS
${LLVM_COMPONENTS}
)

# The Tooling library has some internal headers. Make those work. If we like
# the merged clang unit test binary, we can update the include paths and make
# this the default.
include_directories(Tooling)
2 changes: 1 addition & 1 deletion clang/unittests/Driver/ModuleCacheTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ using namespace clang::driver;

namespace {

TEST(ModuleCacheTest, GetTargetAndMode) {
TEST(DriverModuleCacheTest, GetTargetAndMode) {
SmallString<128> Buf;
Driver::getDefaultModuleCachePath(Buf);
StringRef Path = Buf;
Expand Down
5 changes: 4 additions & 1 deletion clang/unittests/Frontend/OutputStreamTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@

#include "clang/Basic/LangStandard.h"
#include "clang/CodeGen/BackendUtil.h"
#include "clang/CodeGen/CodeGenAction.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
#include "clang/FrontendTool/Utils.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "gtest/gtest.h"

Expand All @@ -23,6 +23,7 @@ using namespace clang::frontend;
namespace {

TEST(FrontendOutputTests, TestOutputStream) {
llvm::InitializeAllTargetMCs();
auto Invocation = std::make_shared<CompilerInvocation>();
Invocation->getPreprocessorOpts().addRemappedFile(
"test.cc", MemoryBuffer::getMemBuffer("").release());
Expand All @@ -47,6 +48,7 @@ TEST(FrontendOutputTests, TestOutputStream) {
}

TEST(FrontendOutputTests, TestVerboseOutputStreamShared) {
llvm::InitializeAllTargetMCs();
auto Invocation = std::make_shared<CompilerInvocation>();
Invocation->getPreprocessorOpts().addRemappedFile(
"test.cc", MemoryBuffer::getMemBuffer("invalid").release());
Expand Down Expand Up @@ -77,6 +79,7 @@ TEST(FrontendOutputTests, TestVerboseOutputStreamOwned) {
std::string VerboseBuffer;
bool Success;
{
llvm::InitializeAllTargetMCs();
auto Invocation = std::make_shared<CompilerInvocation>();
Invocation->getPreprocessorOpts().addRemappedFile(
"test.cc", MemoryBuffer::getMemBuffer("invalid").release());
Expand Down
2 changes: 1 addition & 1 deletion clang/unittests/Interpreter/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
add_clang_unittest(ClangReplInterpreterTests
add_distinct_clang_unittest(ClangReplInterpreterTests
IncrementalCompilerBuilderTest.cpp
IncrementalProcessingTest.cpp
InterpreterTest.cpp
Expand Down
2 changes: 1 addition & 1 deletion clang/unittests/Interpreter/ExceptionTests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
set(LLVM_REQUIRES_EH ON)
set(LLVM_REQUIRES_RTTI ON)

add_clang_unittest(ClangReplInterpreterExceptionTests
add_distinct_clang_unittest(ClangReplInterpreterExceptionTests
InterpreterExceptionTest.cpp
EXPORT_SYMBOLS

Expand Down
13 changes: 4 additions & 9 deletions clang/unittests/Parse/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
set(LLVM_LINK_COMPONENTS
Support
)
add_clang_unittest(ParseTests
ParseHLSLRootSignatureTest.cpp
)
clang_target_link_libraries(ParseTests
PRIVATE
CLANG_LIBS
clangAST
clangBasic
clangLex
clangParse
clangSema
)
target_link_libraries(ParseTests
PRIVATE
LINK_LIBS
LLVMTestingAnnotations
LLVMTestingSupport
clangTesting
LLVM_COMPONENTS
Support
)