https://github.com/anutosh491 updated https://github.com/llvm/llvm-project/pull/175910
>From 9e0c43c80ee4826ba1c133cb4f43e75575335cf3 Mon Sep 17 00:00:00 2001 From: anutosh491 <[email protected]> Date: Wed, 7 Oct 2026 11:54:57 +0530 Subject: [PATCH] [clang-repl] Drop ORC link dependencies from Emscripten builds Select native and WebAssembly executor implementations in CMake, preserve the header-only executor address and context types, and keep library loading in the executor interface. Return dlopen diagnostics to callers and test side-module loading, exported symbols, and custom-executor dispatch. --- .../clang/Interpreter/IncrementalExecutor.h | 4 +++ clang/include/clang/Interpreter/Interpreter.h | 2 -- clang/lib/Interpreter/CMakeLists.txt | 29 +++++++++-------- clang/lib/Interpreter/IncrementalExecutor.cpp | 12 ++----- clang/lib/Interpreter/Interpreter.cpp | 4 +-- clang/lib/Interpreter/Wasm.cpp | 31 +++++++++++++++++++ clang/tools/clang-repl/CMakeLists.txt | 15 +++++++-- clang/tools/clang-repl/ClangRepl.cpp | 13 ++++++-- clang/unittests/Interpreter/CMakeLists.txt | 2 +- .../Interpreter/ExceptionTests/CMakeLists.txt | 24 +++++++++++--- .../InterpreterExceptionTest.cpp | 8 +++++ .../Interpreter/InterpreterExtensionsTest.cpp | 5 +++ .../Interpreter/InterpreterTestFixture.h | 5 +++ 13 files changed, 118 insertions(+), 36 deletions(-) diff --git a/clang/include/clang/Interpreter/IncrementalExecutor.h b/clang/include/clang/Interpreter/IncrementalExecutor.h index 913da9230a9473..0ff07aaf416ba4 100644 --- a/clang/include/clang/Interpreter/IncrementalExecutor.h +++ b/clang/include/clang/Interpreter/IncrementalExecutor.h @@ -33,6 +33,8 @@ class Compilation; class IncrementalExecutorBuilder { public: + IncrementalExecutorBuilder(); + /// Indicates whether out-of-process JIT execution is enabled. bool IsOutOfProcess = false; /// Path to the out-of-process JIT executor. @@ -52,8 +54,10 @@ class IncrementalExecutorBuilder { std::optional<llvm::CodeModel::Model> CM = std::nullopt; /// An optional external IncrementalExecutor std::unique_ptr<IncrementalExecutor> IE; +#ifndef __EMSCRIPTEN__ /// An optional external orc jit builder std::unique_ptr<llvm::orc::LLJITBuilder> JITBuilder; +#endif /// A default callback that can be used in the IncrementalCompilerBuilder to /// retrieve the path to the orc runtime. std::function<llvm::Error(const driver::Compilation &)> diff --git a/clang/include/clang/Interpreter/Interpreter.h b/clang/include/clang/Interpreter/Interpreter.h index c2622b23d5d9ce..0dd1e52749b4f2 100644 --- a/clang/include/clang/Interpreter/Interpreter.h +++ b/clang/include/clang/Interpreter/Interpreter.h @@ -20,8 +20,6 @@ #include "clang/Interpreter/Value.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/ExecutionEngine/JITSymbol.h" -#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h" #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" #include "llvm/Support/Error.h" #include <cstdint> diff --git a/clang/lib/Interpreter/CMakeLists.txt b/clang/lib/Interpreter/CMakeLists.txt index 01d3295d1ac30d..95bac67e1b9dbb 100644 --- a/clang/lib/Interpreter/CMakeLists.txt +++ b/clang/lib/Interpreter/CMakeLists.txt @@ -3,35 +3,39 @@ set(LLVM_LINK_COMPONENTS native MC Option - OrcJit - OrcDebugging - OrcShared - OrcTargetProcess Support Target TargetParser TransformUtils ) -if (EMSCRIPTEN AND "lld" IN_LIST LLVM_ENABLE_PROJECTS) - set(WASM_SRC Wasm.cpp) - set(WASM_LINK lldWasm) - set(COMMON_LINK lldCommon) +if (EMSCRIPTEN) + if (NOT "lld" IN_LIST LLVM_ENABLE_PROJECTS) + message(FATAL_ERROR "Building clangInterpreter for Emscripten requires lld") + endif() + set(EXECUTOR_SOURCES Wasm.cpp) + set(EXECUTOR_LIBS lldWasm lldCommon) +else() + list(APPEND LLVM_LINK_COMPONENTS + OrcJit + OrcDebugging + OrcShared + OrcTargetProcess + ) + set(EXECUTOR_SOURCES IncrementalExecutor.cpp OrcIncrementalExecutor.cpp) endif() add_clang_library(clangInterpreter DeviceOffload.cpp CodeCompletion.cpp IncrementalAction.cpp - IncrementalExecutor.cpp - OrcIncrementalExecutor.cpp IncrementalParser.cpp Interpreter.cpp InterpreterValuePrinter.cpp InterpreterUtils.cpp Value.cpp InterpreterValuePrinter.cpp - ${WASM_SRC} + ${EXECUTOR_SOURCES} PARTIAL_SOURCES_INTENDED DEPENDS @@ -51,8 +55,7 @@ add_clang_library(clangInterpreter clangParse clangSema clangSerialization - ${WASM_LINK} - ${COMMON_LINK} + ${EXECUTOR_LIBS} ) if ((MINGW OR CYGWIN) AND BUILD_SHARED_LIBS) diff --git a/clang/lib/Interpreter/IncrementalExecutor.cpp b/clang/lib/Interpreter/IncrementalExecutor.cpp index 5d01ba47742699..e356ce6d9fe99c 100644 --- a/clang/lib/Interpreter/IncrementalExecutor.cpp +++ b/clang/lib/Interpreter/IncrementalExecutor.cpp @@ -12,9 +12,6 @@ #include "clang/Interpreter/IncrementalExecutor.h" #include "OrcIncrementalExecutor.h" -#ifdef __EMSCRIPTEN__ -#include "Wasm.h" -#endif // __EMSCRIPTEN__ #include "clang/Basic/TargetInfo.h" #include "clang/Config/config.h" @@ -84,6 +81,7 @@ static void *getEmuTLSGetAddressPtr() { return nullptr; } #endif namespace clang { +IncrementalExecutorBuilder::IncrementalExecutorBuilder() = default; IncrementalExecutorBuilder::~IncrementalExecutorBuilder() = default; static llvm::Expected<llvm::orc::JITTargetMachineBuilder> @@ -427,12 +425,8 @@ IncrementalExecutorBuilder::create(llvm::orc::ThreadSafeContext &TSC, } llvm::Error Err = llvm::Error::success(); - std::unique_ptr<IncrementalExecutor> Executor; -#ifdef __EMSCRIPTEN__ - Executor = std::make_unique<WasmIncrementalExecutor>(Err); -#else - Executor = std::make_unique<OrcIncrementalExecutor>(TSC, *JITBuilder, Err); -#endif + std::unique_ptr<IncrementalExecutor> Executor = + std::make_unique<OrcIncrementalExecutor>(TSC, *JITBuilder, Err); if (Err) return std::move(Err); diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 40fbc83db9107c..0cfbe1410e2299 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -45,9 +45,7 @@ #include "clang/Serialization/ASTReader.h" #include "clang/Serialization/ModuleCache.h" #include "clang/Serialization/ObjectFilePCHContainerReader.h" -#include "llvm/ExecutionEngine/JITSymbol.h" -#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" -#include "llvm/ExecutionEngine/Orc/LLJIT.h" +#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" #include "llvm/IR/Module.h" #include "llvm/Support/Errc.h" #include "llvm/Support/ErrorHandling.h" diff --git a/clang/lib/Interpreter/Wasm.cpp b/clang/lib/Interpreter/Wasm.cpp index 573c8910d3a414..2bc90a8d8c88ae 100644 --- a/clang/lib/Interpreter/Wasm.cpp +++ b/clang/lib/Interpreter/Wasm.cpp @@ -61,6 +61,37 @@ bool link(llvm::ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS, namespace clang { +IncrementalExecutorBuilder::IncrementalExecutorBuilder() = default; +IncrementalExecutorBuilder::~IncrementalExecutorBuilder() = default; + +llvm::Expected<std::unique_ptr<IncrementalExecutor>> +IncrementalExecutorBuilder::create(llvm::orc::ThreadSafeContext &TSC, + const clang::TargetInfo &TI) { + if (IE) + return std::move(IE); + + if (IsOutOfProcess) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Out-of-process execution is not supported " + "by the WebAssembly executor"); + + llvm::Error Err = llvm::Error::success(); + std::unique_ptr<IncrementalExecutor> Executor = + std::make_unique<WasmIncrementalExecutor>(Err); + if (Err) + return std::move(Err); + return std::move(Executor); +} + +llvm::Error IncrementalExecutorBuilder::UpdateOrcRuntimePath( + const clang::driver::Compilation &C) { + if (IsOutOfProcess) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Out-of-process execution is not supported " + "by the WebAssembly executor"); + return llvm::Error::success(); +} + WasmIncrementalExecutor::WasmIncrementalExecutor(llvm::Error &Err) { llvm::ErrorAsOutParameter EAO(&Err); diff --git a/clang/tools/clang-repl/CMakeLists.txt b/clang/tools/clang-repl/CMakeLists.txt index c3d14ceb797926..db029261226314 100644 --- a/clang/tools/clang-repl/CMakeLists.txt +++ b/clang/tools/clang-repl/CMakeLists.txt @@ -3,12 +3,14 @@ set( LLVM_LINK_COMPONENTS Core LineEditor Option - OrcJIT - OrcShared Support TargetParser ) +if(NOT EMSCRIPTEN) + list(APPEND LLVM_LINK_COMPONENTS OrcJIT OrcShared) +endif() + add_clang_tool(clang-repl ClangRepl.cpp @@ -76,3 +78,12 @@ check_linker_flag(CXX ${flag_long_plt} HAVE_LINKER_FLAG_LONG_PLT) if(HAVE_LINKER_FLAG_LONG_PLT) target_link_options(clang-repl PRIVATE ${flag_long_plt}) endif() + +if(EMSCRIPTEN) + target_link_options(clang-repl PRIVATE + "SHELL:-s MAIN_MODULE=1" + "SHELL:-s ALLOW_MEMORY_GROWTH=1" + "SHELL:-s STACK_SIZE=32mb" + "SHELL:-s INITIAL_MEMORY=128mb" + ) +endif() diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp index c9873540a5d66b..b759d5464f9667 100644 --- a/clang/tools/clang-repl/ClangRepl.cpp +++ b/clang/tools/clang-repl/ClangRepl.cpp @@ -23,7 +23,9 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" +#ifndef __EMSCRIPTEN__ #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#endif #include "llvm/LineEditor/LineEditor.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -40,8 +42,6 @@ #include <string> #include <vector> -#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h" - // Disable LSan for this test. // FIXME: Re-enable once we can assume GCC 13.2 or higher. // https://llvm.org/github.com/llvm/llvm-project/issues/67586. @@ -274,6 +274,9 @@ int main(int argc, const char **argv) { llvm::InitializeAllAsmParsers(); if (OptHostSupportsJit) { +#ifdef __EMSCRIPTEN__ + llvm::outs() << "false\n"; +#else auto J = llvm::orc::LLJITBuilder().create(); if (J) llvm::outs() << "true\n"; @@ -281,11 +284,17 @@ int main(int argc, const char **argv) { llvm::consumeError(J.takeError()); llvm::outs() << "false\n"; } +#endif return 0; } else if (OptHostJitTriple) { +#ifdef __EMSCRIPTEN__ + llvm::outs() << llvm::Triple::normalize(llvm::sys::getProcessTriple()) + << '\n'; +#else auto J = ExitOnErr(llvm::orc::LLJITBuilder().create()); auto T = J->getTargetTriple(); llvm::outs() << T.normalize() << '\n'; +#endif return 0; } diff --git a/clang/unittests/Interpreter/CMakeLists.txt b/clang/unittests/Interpreter/CMakeLists.txt index 6d999104054c30..60cea441ab4480 100644 --- a/clang/unittests/Interpreter/CMakeLists.txt +++ b/clang/unittests/Interpreter/CMakeLists.txt @@ -3,7 +3,7 @@ set(LLVM_COMPONENTS_TO_LINK "" ) set(LLVM_LIBS_TO_LINK - "" + LLVMTestingSupport ) set(CLANG_LIBS_TO_LINK clangInterpreter diff --git a/clang/unittests/Interpreter/ExceptionTests/CMakeLists.txt b/clang/unittests/Interpreter/ExceptionTests/CMakeLists.txt index dfd94d8e6442c4..800824140a22e2 100644 --- a/clang/unittests/Interpreter/ExceptionTests/CMakeLists.txt +++ b/clang/unittests/Interpreter/ExceptionTests/CMakeLists.txt @@ -3,6 +3,11 @@ set(LLVM_REQUIRES_EH ON) set(LLVM_REQUIRES_RTTI ON) +set(INTERPRETER_EXCEPTION_COMPONENTS ${LLVM_TARGETS_TO_BUILD} Core Support) +if(NOT EMSCRIPTEN) + list(APPEND INTERPRETER_EXCEPTION_COMPONENTS OrcJIT) +endif() + add_distinct_clang_unittest(ClangReplInterpreterExceptionTests InterpreterExceptionTest.cpp EXPORT_SYMBOLS @@ -14,11 +19,22 @@ add_distinct_clang_unittest(ClangReplInterpreterExceptionTests clangFrontend LLVM_COMPONENTS - ${LLVM_TARGETS_TO_BUILD} - Core - OrcJIT - Support + ${INTERPRETER_EXCEPTION_COMPONENTS} ) llvm_update_compile_flags(ClangReplInterpreterExceptionTests) add_dependencies(ClangReplInterpreterExceptionTests clang-resource-headers) + +if(EMSCRIPTEN) + get_target_property(LINKED_LIBS ClangReplInterpreterExceptionTests LINK_LIBRARIES) + list(REMOVE_ITEM LINKED_LIBS LLVMSupport) + set_target_properties(ClangReplInterpreterExceptionTests PROPERTIES + LINK_LIBRARIES "${LINKED_LIBS}" + ) + target_link_options(ClangReplInterpreterExceptionTests PRIVATE + "SHELL:-s MAIN_MODULE=1" + "SHELL:-s ALLOW_MEMORY_GROWTH=1" + "SHELL:-s STACK_SIZE=32mb" + "SHELL:-s INITIAL_MEMORY=128mb" + ) +endif() diff --git a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp index c8522e91602768..fcca9fae3dccf3 100644 --- a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp +++ b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp @@ -22,7 +22,9 @@ #include "clang/Frontend/TextDiagnosticPrinter.h" #include "llvm/ADT/ArrayRef.h" +#ifndef __EMSCRIPTEN__ #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#endif #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/TargetSelect.h" @@ -67,6 +69,10 @@ TEST(InterpreterExceptionTest, CatchException) { llvm::InitializeNativeTarget(); llvm::InitializeNativeTargetAsmPrinter(); +#ifdef __EMSCRIPTEN__ + // The WebAssembly executor does not configure exception handling yet. + GTEST_SKIP(); +#else { auto J = llvm::orc::LLJITBuilder().create(); if (!J) { @@ -78,6 +84,8 @@ TEST(InterpreterExceptionTest, CatchException) { } } +#endif + #define Stringify(s) Stringifyx(s) #define Stringifyx(s) #s diff --git a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp index 13825f2cbdddfd..f2a96719ef0518 100644 --- a/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp +++ b/clang/unittests/Interpreter/InterpreterExtensionsTest.cpp @@ -19,7 +19,9 @@ #include "clang/Sema/Lookup.h" #include "clang/Sema/Sema.h" +#ifndef __EMSCRIPTEN__ #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#endif #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/Threading.h" @@ -65,6 +67,7 @@ class InterpreterExtensionsTest : public InterpreterTestBase { } }; +#ifndef __EMSCRIPTEN__ class CustomJBInterpreter : public Interpreter { using CustomJITBuilderCreatorFunction = std::function<llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>>()>; @@ -138,6 +141,8 @@ TEST_F(InterpreterExtensionsTest, CustomCrossJIT) { EXPECT_EQ(1U, Objs.size()); } +#endif // __EMSCRIPTEN__ + TEST_F(InterpreterExtensionsTest, CustomIncrementalExecutor) { struct RecordingIncrementalExecutor : public clang::IncrementalExecutor { mutable unsigned RanCtors = false; diff --git a/clang/unittests/Interpreter/InterpreterTestFixture.h b/clang/unittests/Interpreter/InterpreterTestFixture.h index b088fa4a5f8966..0e33aee2fd48a4 100644 --- a/clang/unittests/Interpreter/InterpreterTestFixture.h +++ b/clang/unittests/Interpreter/InterpreterTestFixture.h @@ -9,7 +9,9 @@ #ifndef LLVM_CLANG_UNITTESTS_INTERPRETER_INTERPRETERTESTBASE_H #define LLVM_CLANG_UNITTESTS_INTERPRETER_INTERPRETERTESTBASE_H +#ifndef __EMSCRIPTEN__ #include "llvm/ExecutionEngine/Orc/LLJIT.h" +#endif #include "llvm/Support/Error.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/TargetSelect.h" @@ -24,6 +26,7 @@ namespace clang { class InterpreterTestBase : public ::testing::Test { protected: +#ifndef __EMSCRIPTEN__ static bool HostSupportsJIT() { #ifdef CLANG_INTERPRETER_PLATFORM_CANNOT_CREATE_LLJIT return false; @@ -37,6 +40,8 @@ class InterpreterTestBase : public ::testing::Test { #endif } +#endif + void SetUp() override { // FIXME : WebAssembly doesn't currently support Jit (see // https: // github.com/llvm/llvm-project/pull/150977#discussion_r2237521095). _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
