[clang] [llvm] Enable running ClangReplInterpreterTests in an Emscripten environment (PR #150977)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 14 00:29:46 PDT 2025
https://github.com/mcbarton updated https://github.com/llvm/llvm-project/pull/150977
>From 43da46e79877361fce099ccbcf84745493c8cfa5 Mon Sep 17 00:00:00 2001
From: mcbarton <150042563+mcbarton at users.noreply.github.com>
Date: Mon, 28 Jul 2025 16:33:29 +0100
Subject: [PATCH 01/10] 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<clang::Interpreter> Interp;
void SetUp() override {
+#ifndef __EMSCRIPTEN__
if (!HostSupportsJIT())
GTEST_SKIP();
+#endif
std::unique_ptr<CompilerInstance> 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<const char *> Args = {"-fno-sized-deallocation"};
std::unique_ptr<Interpreter> 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 <matthew.c.barton at hotmail.co.uk>
Date: Fri, 8 Aug 2025 14:53:06 +0100
Subject: [PATCH 02/10] 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 at users.noreply.github.com>
Date: Wed, 13 Aug 2025 10:57:27 +0100
Subject: [PATCH 03/10] 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")
>From 8779794e25eccb9aec071eb75ed934f0de694c5f Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Wed, 13 Aug 2025 19:29:44 +0100
Subject: [PATCH 04/10] Enable InterpreterTestInstantiateTemplate Emscripten
build
---
clang/unittests/Interpreter/InterpreterTest.cpp | 3 ---
1 file changed, 3 deletions(-)
diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp
index 52d2b83fdb36f..2b6d6dbbe30d8 100644
--- a/clang/unittests/Interpreter/InterpreterTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterTest.cpp
@@ -259,9 +259,6 @@ 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.
>From 97fee89d4de04ca3dc220d01838dc17ee4272c59 Mon Sep 17 00:00:00 2001
From: mcbarton <150042563+mcbarton at users.noreply.github.com>
Date: Wed, 13 Aug 2025 23:18:47 +0100
Subject: [PATCH 05/10] Disable InterpreterTestInstantiateTemplate Emscripten
build for PR as failing again after merging main into PR
---
clang/unittests/Interpreter/InterpreterTest.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp
index 2b6d6dbbe30d8..52d2b83fdb36f 100644
--- a/clang/unittests/Interpreter/InterpreterTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterTest.cpp
@@ -259,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.
>From 6f9cd227d0698caa735b32a6804d4c6ad9464b41 Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Thu, 14 Aug 2025 08:19:56 +0100
Subject: [PATCH 06/10] Add a fixme
---
.../unittests/Interpreter/IncrementalCompilerBuilderTest.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp b/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp
index b67a1f01be4b6..6f22e36aeaffc 100644
--- a/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp
+++ b/clang/unittests/Interpreter/IncrementalCompilerBuilderTest.cpp
@@ -37,6 +37,10 @@ TEST(IncrementalCompilerBuilder, SetCompilerArgs) {
}
TEST(IncrementalCompilerBuilder, SetTargetTriple) {
+# FIXME: This test doesn't current work for Emscripten builds.
+# It should be possible to make it work. For details on how it fails and
+# the current progress to enable this test see
+# the following Github issue https://github.com/llvm/llvm-project/issues/153461
#ifdef __EMSCRIPTEN__
GTEST_SKIP() << "Test fails for Emscipten builds";
#endif
>From dcb0e2baabc741ef7f211c9cf0321512fdfb2f28 Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Thu, 14 Aug 2025 08:21:26 +0100
Subject: [PATCH 07/10] Add fixme
---
clang/unittests/Interpreter/InterpreterTest.cpp | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp
index 52d2b83fdb36f..3dd465084992c 100644
--- a/clang/unittests/Interpreter/InterpreterTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterTest.cpp
@@ -147,6 +147,10 @@ TEST_F(InterpreterTest, DeclsAndStatements) {
}
TEST_F(InterpreterTest, UndoCommand) {
+# FIXME: This test doesn't current work for Emscripten builds.
+# It should be possible to make it work. For details on how it fails and
+# the current progress to enable this test see
+# the following Github issue https://github.com/llvm/llvm-project/issues/153461
#ifdef __EMSCRIPTEN__
GTEST_SKIP() << "Test fails for Emscipten builds";
#endif
@@ -259,6 +263,10 @@ static NamedDecl *LookupSingleName(Interpreter &Interp, const char *Name) {
}
TEST_F(InterpreterTest, InstantiateTemplate) {
+# FIXME: This test doesn't current work for Emscripten builds.
+# It should be possible to make it work. For details on how it fails and
+# the current progress to enable this test see
+# the following Github issue https://github.com/llvm/llvm-project/issues/153461
#ifdef __EMSCRIPTEN__
GTEST_SKIP() << "Test fails for Emscipten builds";
#endif
@@ -301,6 +309,10 @@ TEST_F(InterpreterTest, InstantiateTemplate) {
}
TEST_F(InterpreterTest, Value) {
+# FIXME: This test doesn't current work for Emscripten builds.
+# It should be possible to make it work. For details on how it fails and
+# the current progress to enable this test see
+# the following Github issue https://github.com/llvm/llvm-project/issues/153461
#ifdef __EMSCRIPTEN__
GTEST_SKIP() << "Test fails for Emscipten builds";
#endif
>From 7d930ee7242d15bf15a2f9bb7d2c0eae0afc4ef7 Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Thu, 14 Aug 2025 08:27:45 +0100
Subject: [PATCH 08/10] Add fixme
---
clang/unittests/Interpreter/InterpreterTestFixture.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/unittests/Interpreter/InterpreterTestFixture.h b/clang/unittests/Interpreter/InterpreterTestFixture.h
index 8d11c835374bd..05a6a429b399c 100644
--- a/clang/unittests/Interpreter/InterpreterTestFixture.h
+++ b/clang/unittests/Interpreter/InterpreterTestFixture.h
@@ -38,6 +38,10 @@ class InterpreterTestBase : public ::testing::Test {
}
void SetUp() override {
+# FIXME: WebAssembly doesn't currently support Jit (see
+# https://github.com/llvm/llvm-project/pull/150977#discussion_r2237521095).
+# so this check of HostSupportsJIT has been skipped
+# over until support is added, and HostSupportsJIT can return true.
#ifndef __EMSCRIPTEN__
if (!HostSupportsJIT())
GTEST_SKIP();
>From c6362bc9c5c5288d87192541a610e3bce6902556 Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Thu, 14 Aug 2025 08:28:56 +0100
Subject: [PATCH 09/10] Add fixme
---
clang/unittests/Interpreter/InterpreterExtensionsTest.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp
index 7c66e56160e38..02030b5afa775 100644
--- a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp
@@ -75,6 +75,10 @@ struct OutOfProcInterpreter : public Interpreter {
};
TEST_F(InterpreterExtensionsTest, FindRuntimeInterface) {
+# FIXME: WebAssembly doesn't currently support Jit (see
+# https://github.com/llvm/llvm-project/pull/150977#discussion_r2237521095).
+# so this check of HostSupportsJIT has been skipped
+# over until support is added, and HostSupportsJIT can return true.
#ifndef __EMSCRIPTEN__
if (!HostSupportsJIT())
GTEST_SKIP();
>From 4506c269918d8a22004695e2a2cb7405413ad158 Mon Sep 17 00:00:00 2001
From: mcbarton <matthew.c.barton at hotmail.co.uk>
Date: Thu, 14 Aug 2025 08:29:32 +0100
Subject: [PATCH 10/10] Add fixme
---
clang/unittests/Interpreter/CodeCompletionTest.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/unittests/Interpreter/CodeCompletionTest.cpp b/clang/unittests/Interpreter/CodeCompletionTest.cpp
index 813a7d1429251..32cac95fdf66e 100644
--- a/clang/unittests/Interpreter/CodeCompletionTest.cpp
+++ b/clang/unittests/Interpreter/CodeCompletionTest.cpp
@@ -29,6 +29,10 @@ class CodeCompletionTest : public InterpreterTestBase {
std::unique_ptr<clang::Interpreter> Interp;
void SetUp() override {
+# FIXME: WebAssembly doesn't currently support Jit (see
+# https://github.com/llvm/llvm-project/pull/150977#discussion_r2237521095).
+# so this check of HostSupportsJIT has been skipped
+# over until support is added, and HostSupportsJIT can return true.
#ifndef __EMSCRIPTEN__
if (!HostSupportsJIT())
GTEST_SKIP();
More information about the cfe-commits
mailing list