From 43da46e79877361fce099ccbcf84745493c8cfa5 Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Mon, 28 Jul 2025 16:33:29 +0100 Subject: [PATCH 1/3] Enable running ClangReplInterpreterTests in an Emscripten environment --- clang/unittests/Interpreter/CMakeLists.txt | 59 +++++++++++++++---- .../Interpreter/CodeCompletionTest.cpp | 2 + .../IncrementalCompilerBuilderTest.cpp | 3 + .../Interpreter/InterpreterExtensionsTest.cpp | 3 +- .../unittests/Interpreter/InterpreterTest.cpp | 9 +++ .../Interpreter/InterpreterTestFixture.h | 2 + llvm/cmake/modules/AddLLVM.cmake | 4 +- 7 files changed, 68 insertions(+), 14 deletions(-) diff --git a/clang/unittests/Interpreter/CMakeLists.txt b/clang/unittests/Interpreter/CMakeLists.txt index 1dda9024075a1..347eb4b639ef3 100644 --- a/clang/unittests/Interpreter/CMakeLists.txt +++ b/clang/unittests/Interpreter/CMakeLists.txt @@ -1,3 +1,34 @@ +if(EMSCRIPTEN) +set(LLVM_COMPONENTS_TO_LINK + "" + ) +set(LLVM_LIBS_TO_LINK + "" + ) +set(CLANG_LIBS_TO_LINK + clangInterpreter + ) +else() +set(LLVM_COMPONENTS_TO_LINK + ${LLVM_TARGETS_TO_BUILD} + Core + MC + OrcJIT + Support + TargetParser + ) +set(LLVM_LIBS_TO_LINK + LLVMTestingSupport + ) +set(CLANG_LIBS_TO_LINK + clangAST + clangBasic + clangInterpreter + clangFrontend + clangSema + ) +endif() + add_distinct_clang_unittest(ClangReplInterpreterTests IncrementalCompilerBuilderTest.cpp IncrementalProcessingTest.cpp @@ -8,24 +39,28 @@ add_distinct_clang_unittest(ClangReplInterpreterTests EXPORT_SYMBOLS CLANG_LIBS - clangAST - clangBasic - clangInterpreter - clangFrontend - clangSema + ${CLANG_LIBS_TO_LINK} LINK_LIBS - LLVMTestingSupport + ${LLVM_LIBS_TO_LINK} LLVM_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} - Core - MC - OrcJIT - Support - TargetParser + ${LLVM_COMPONENTS_TO_LINK} ) +if(EMSCRIPTEN) +target_link_options(ClangReplInterpreterTests + PUBLIC "SHELL: -s MAIN_MODULE=1" + PUBLIC "SHELL: -s ALLOW_MEMORY_GROWTH=1" + PUBLIC "SHELL: -s STACK_SIZE=32mb" + PUBLIC "SHELL: -s INITIAL_MEMORY=128mb" + PUBLIC "SHELL: --emrun" +) +set_target_properties(ClangReplInterpreterTests PROPERTIES + SUFFIX ".html" +) +endif() + # Exceptions on Windows are not yet supported. if(NOT WIN32) add_subdirectory(ExceptionTests) diff --git a/clang/unittests/Interpreter/CodeCompletionTest.cpp b/clang/unittests/Interpreter/CodeCompletionTest.cpp index 23cfc469695d2..813a7d1429251 100644 --- a/clang/unittests/Interpreter/CodeCompletionTest.cpp +++ b/clang/unittests/Interpreter/CodeCompletionTest.cpp @@ -29,8 +29,10 @@ class CodeCompletionTest : public InterpreterTestBase { std::unique_ptr Interp; void SetUp() override { +#ifndef __EMSCRIPTEN__ if (!HostSupportsJIT()) GTEST_SKIP(); +#endif std::unique_ptr CI = cantFail(CB.CreateCpp()); this->Interp = cantFail(clang::Interpreter::create(std::move(CI))); } diff --git a/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp b/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp index c4a40071f55cf..b67a1f01be4b6 100644 --- a/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp +++ b/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp @@ -37,6 +37,9 @@ TEST(IncrementalCompilerBuilder, SetCompilerArgs) { } TEST(IncrementalCompilerBuilder, SetTargetTriple) { +#ifdef __EMSCRIPTEN__ + GTEST_SKIP() << "Test fails for Emscipten builds"; +#endif auto CB = clang::IncrementalCompilerBuilder(); CB.SetTargetTriple("armv6-none-eabi"); auto CI = cantFail(CB.CreateCpp()); diff --git a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp index 1c27cfb2c48fa..7c66e56160e38 100644 --- a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp +++ b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp @@ -75,9 +75,10 @@ struct OutOfProcInterpreter : public Interpreter { }; TEST_F(InterpreterExtensionsTest, FindRuntimeInterface) { +#ifndef __EMSCRIPTEN__ if (!HostSupportsJIT()) GTEST_SKIP(); - +#endif clang::IncrementalCompilerBuilder CB; llvm::Error ErrOut = llvm::Error::success(); auto CI = cantFail(CB.CreateCpp()); diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp index 768058b954d49..52d2b83fdb36f 100644 --- a/clang/unittests/Interpreter/InterpreterTest.cpp +++ b/clang/unittests/Interpreter/InterpreterTest.cpp @@ -147,6 +147,9 @@ TEST_F(InterpreterTest, DeclsAndStatements) { } TEST_F(InterpreterTest, UndoCommand) { +#ifdef __EMSCRIPTEN__ + GTEST_SKIP() << "Test fails for Emscipten builds"; +#endif Args ExtraArgs = {"-Xclang", "-diagnostic-log-file", "-Xclang", "-"}; // Create the diagnostic engine with unowned consumer. @@ -256,6 +259,9 @@ static NamedDecl *LookupSingleName(Interpreter &Interp, const char *Name) { } TEST_F(InterpreterTest, InstantiateTemplate) { +#ifdef __EMSCRIPTEN__ + GTEST_SKIP() << "Test fails for Emscipten builds"; +#endif // FIXME: We cannot yet handle delayed template parsing. If we run with // -fdelayed-template-parsing we try adding the newly created decl to the // active PTU which causes an assert. @@ -295,6 +301,9 @@ TEST_F(InterpreterTest, InstantiateTemplate) { } TEST_F(InterpreterTest, Value) { +#ifdef __EMSCRIPTEN__ + GTEST_SKIP() << "Test fails for Emscipten builds"; +#endif std::vector Args = {"-fno-sized-deallocation"}; std::unique_ptr Interp = createInterpreter(Args); diff --git a/clang/unittests/Interpreter/InterpreterTestFixture.h b/clang/unittests/Interpreter/InterpreterTestFixture.h index 113599ff98894..8d11c835374bd 100644 --- a/clang/unittests/Interpreter/InterpreterTestFixture.h +++ b/clang/unittests/Interpreter/InterpreterTestFixture.h @@ -38,8 +38,10 @@ class InterpreterTestBase : public ::testing::Test { } void SetUp() override { +#ifndef __EMSCRIPTEN__ if (!HostSupportsJIT()) GTEST_SKIP(); +#endif } void TearDown() override {} diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 83772ed8d2b13..40614d2b47868 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1764,7 +1764,9 @@ function(add_unittest test_suite test_name) set(LLVM_REQUIRES_RTTI OFF) endif() - list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream + if(NOT EMSCRIPTEN) + list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream + endif() add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN}) get_subproject_title(subproject_title) set_target_properties(${test_name} PROPERTIES FOLDER "${subproject_title}/Tests/Unit") From 92d02e182ce189530b20142250687baa98bc8655 Mon Sep 17 00:00:00 2001 From: mcbarton Date: Fri, 8 Aug 2025 14:53:06 +0100 Subject: [PATCH 2/3] Fix CMakeLists.txt with endif() --- clang/unittests/Interpreter/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/unittests/Interpreter/CMakeLists.txt b/clang/unittests/Interpreter/CMakeLists.txt index bca9b30e63a72..f33071c59a0e4 100644 --- a/clang/unittests/Interpreter/CMakeLists.txt +++ b/clang/unittests/Interpreter/CMakeLists.txt @@ -71,6 +71,7 @@ target_link_options(ClangReplInterpreterTests set_target_properties(ClangReplInterpreterTests PROPERTIES SUFFIX ".html" ) +endif() if(TARGET compiler-rt) add_dependencies(ClangReplInterpreterTests From 8e6d526c2ced7b634926c325202cfa814acf460e Mon Sep 17 00:00:00 2001 From: mcbarton <150042563+mcbarton@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:57:27 +0100 Subject: [PATCH 3/3] Remove LLVMSupport through properties of ClangReplInterpreterTests instead of AddLLVM.cmake modification --- clang/unittests/Interpreter/CMakeLists.txt | 5 +++++ llvm/cmake/modules/AddLLVM.cmake | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clang/unittests/Interpreter/CMakeLists.txt b/clang/unittests/Interpreter/CMakeLists.txt index 347eb4b639ef3..b6825f9461ad7 100644 --- a/clang/unittests/Interpreter/CMakeLists.txt +++ b/clang/unittests/Interpreter/CMakeLists.txt @@ -49,6 +49,11 @@ add_distinct_clang_unittest(ClangReplInterpreterTests ) if(EMSCRIPTEN) +# Without the above you try to link to LLVMSupport twice, and end +# up with a duplicate symbol error when creating the main module +get_target_property(LINKED_LIBS ClangReplInterpreterTests LINK_LIBRARIES) +list(REMOVE_ITEM LINKED_LIBS LLVMSupport) +set_target_properties(ClangReplInterpreterTests PROPERTIES LINK_LIBRARIES "${LINKED_LIBS}") target_link_options(ClangReplInterpreterTests PUBLIC "SHELL: -s MAIN_MODULE=1" PUBLIC "SHELL: -s ALLOW_MEMORY_GROWTH=1" diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index 40614d2b47868..83772ed8d2b13 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1764,9 +1764,7 @@ function(add_unittest test_suite test_name) set(LLVM_REQUIRES_RTTI OFF) endif() - if(NOT EMSCRIPTEN) - list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream - endif() + list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN}) get_subproject_title(subproject_title) set_target_properties(${test_name} PROPERTIES FOLDER "${subproject_title}/Tests/Unit")