https://github.com/anutosh491 approved this pull request.

Looks great to me 

Here's what I did 

1) Fetched the commit and built it for wasm.
- Ran `node ./ClangReplInterpreterTests.js` and everything passes as expected
```
anutosh491@Anutoshs-MacBook-Air Interpreter % node 
./ClangReplInterpreterTests.js
[==========] Running 27 tests from 5 test suites.
[----------] Global test environment set-up.
[----------] 2 tests from IncrementalCompilerBuilder
[ RUN      ] IncrementalCompilerBuilder.SetCompilerArgs
[       OK ] IncrementalCompilerBuilder.SetCompilerArgs (32 ms)
....
....
....
[       OK ] CodeCompletionTest.NestedInvocations (44 ms)
[ RUN      ] CodeCompletionTest.TemplateFunctions
[       OK ] CodeCompletionTest.TemplateFunctions (62 ms)
[----------] 12 tests from CodeCompletionTest (710 ms total)

[----------] Global test environment tear-down
[==========] 27 tests from 5 test suites ran. (2060 ms total)
[  PASSED  ] 23 tests.
[  SKIPPED ] 4 tests, listed below:
[  SKIPPED ] IncrementalCompilerBuilder.SetTargetTriple
[  SKIPPED ] InterpreterTest.UndoCommand
[  SKIPPED ] InterpreterExtensionsTest.DefaultCrossJIT
[  SKIPPED ] InterpreterExtensionsTest.CustomCrossJIT
```
- Tried it in a demo playground

<img width="783" height="420" alt="image" 
src="https://github.com/user-attachments/assets/d27aee4c-508b-4468-99df-536d88f19d06";
 />

2) The next step what I did is, based on my comment above 
https://github.com/llvm/llvm-project/pull/175448#issuecomment-3737055710, I 
tried having a wasm build with no orc related symbols whatsoever/ not compiling 
any orc jit lib

A quick rough diff for that would be 
```
diff --git a/clang/include/clang/Interpreter/IncrementalExecutor.h 
b/clang/include/clang/Interpreter/IncrementalExecutor.h
index 913da9230a94..be72696e4cfa 100644
--- a/clang/include/clang/Interpreter/IncrementalExecutor.h
+++ b/clang/include/clang/Interpreter/IncrementalExecutor.h
@@ -33,6 +33,7 @@ class Compilation;
 
 class IncrementalExecutorBuilder {
 public:
+#ifndef __EMSCRIPTEN__
   /// Indicates whether out-of-process JIT execution is enabled.
   bool IsOutOfProcess = false;
   /// Path to the out-of-process JIT executor.
@@ -50,8 +51,12 @@ public:
   std::function<void()> CustomizeFork = nullptr;
   /// An optional code model to provide to the JITTargetMachineBuilder
   std::optional<llvm::CodeModel::Model> CM = std::nullopt;
+#endif
+
   /// An optional external IncrementalExecutor
   std::unique_ptr<IncrementalExecutor> IE;
+
+#ifndef __EMSCRIPTEN__
   /// An optional external orc jit builder
   std::unique_ptr<llvm::orc::LLJITBuilder> JITBuilder;
   /// A default callback that can be used in the IncrementalCompilerBuilder to
@@ -60,6 +65,7 @@ public:
       UpdateOrcRuntimePathCB = [this](const driver::Compilation &C) {
         return UpdateOrcRuntimePath(C);
       };
+#endif
 
   ~IncrementalExecutorBuilder();
 
@@ -67,7 +73,9 @@ public:
   create(llvm::orc::ThreadSafeContext &TSC, const clang::TargetInfo &TI);
 
 private:
+#ifndef __EMSCRIPTEN__
   llvm::Error UpdateOrcRuntimePath(const driver::Compilation &C);
+#endif
 };
 
 struct PartialTranslationUnit;
diff --git a/clang/lib/Interpreter/CMakeLists.txt 
b/clang/lib/Interpreter/CMakeLists.txt
index 01d3295d1ac3..50fcd99b8a08 100644
--- a/clang/lib/Interpreter/CMakeLists.txt
+++ b/clang/lib/Interpreter/CMakeLists.txt
@@ -1,17 +1,23 @@
 set(LLVM_LINK_COMPONENTS
-   core
-   native
-   MC
-   Option
-   OrcJit
-   OrcDebugging
-   OrcShared
-   OrcTargetProcess
-   Support
-   Target
-   TargetParser
-   TransformUtils
-   )
+  core
+  native
+  MC
+  Option
+  Support
+  Target
+  TargetParser
+  TransformUtils
+)
+
+# Only add ORC JIT-related components for non-Emscripten builds
+if(NOT EMSCRIPTEN)
+  list(APPEND LLVM_LINK_COMPONENTS
+    OrcJit
+    OrcDebugging
+    OrcShared
+    OrcTargetProcess
+  )
+endif()
 
 if (EMSCRIPTEN AND "lld" IN_LIST LLVM_ENABLE_PROJECTS)
   set(WASM_SRC Wasm.cpp)
@@ -19,12 +25,11 @@ if (EMSCRIPTEN AND "lld" IN_LIST LLVM_ENABLE_PROJECTS)
   set(COMMON_LINK lldCommon)
 endif()
 
-add_clang_library(clangInterpreter
+set(INTERPRETER_SOURCES
   DeviceOffload.cpp
   CodeCompletion.cpp
   IncrementalAction.cpp
   IncrementalExecutor.cpp
-  OrcIncrementalExecutor.cpp
   IncrementalParser.cpp
   Interpreter.cpp
   InterpreterValuePrinter.cpp
@@ -32,6 +37,15 @@ add_clang_library(clangInterpreter
   Value.cpp
   InterpreterValuePrinter.cpp
   ${WASM_SRC}
+)
+
+# Only include OrcIncrementalExecutor for non-Emscripten builds
+if(NOT EMSCRIPTEN)
+  list(APPEND INTERPRETER_SOURCES OrcIncrementalExecutor.cpp)
+endif()
+
+add_clang_library(clangInterpreter
+  ${INTERPRETER_SOURCES}
   PARTIAL_SOURCES_INTENDED
 
   DEPENDS
@@ -53,7 +67,7 @@ add_clang_library(clangInterpreter
   clangSerialization
   ${WASM_LINK}
   ${COMMON_LINK}
-  )
+)
 
 if ((MINGW OR CYGWIN) AND BUILD_SHARED_LIBS)
   # The DLLs are supposed to export all symbols (except for ones that are
diff --git a/clang/lib/Interpreter/IncrementalExecutor.cpp 
b/clang/lib/Interpreter/IncrementalExecutor.cpp
index 001651522c32..0d3c08297c1d 100644
--- a/clang/lib/Interpreter/IncrementalExecutor.cpp
+++ b/clang/lib/Interpreter/IncrementalExecutor.cpp
@@ -11,10 +11,11 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Interpreter/IncrementalExecutor.h"
-#include "OrcIncrementalExecutor.h"
 #ifdef __EMSCRIPTEN__
-#include "Wasm.h"
-#endif // __EMSCRIPTEN__
+  #include "Wasm.h"
+#else
+  #include "OrcIncrementalExecutor.h"
+#endif
 
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Driver/Compilation.h"
@@ -26,17 +27,19 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Twine.h"
 
-#include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
-#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h"
-#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
-#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
-#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
-#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
-#include "llvm/ExecutionEngine/Orc/LLJIT.h"
-#include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h"
-#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
-#include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
-#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
+#ifndef __EMSCRIPTEN__
+  #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
+  #include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h"
+  #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
+  #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
+  #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
+  #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
+  #include "llvm/ExecutionEngine/Orc/LLJIT.h"
+  #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h"
+  #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
+  #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
+  #include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
+#endif
 
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
@@ -63,6 +66,7 @@
 namespace clang {
 IncrementalExecutorBuilder::~IncrementalExecutorBuilder() = default;
 
+#ifndef __EMSCRIPTEN__
 static llvm::Expected<llvm::orc::JITTargetMachineBuilder>
 createJITTargetMachineBuilder(const llvm::Triple &TT) {
   if (TT.getTriple() == llvm::sys::getProcessTriple())
@@ -368,12 +372,20 @@ outOfProcessJITBuilder(const IncrementalExecutorBuilder 
&IncrExecutorBuilder) {
 
   return std::make_pair(std::move(JB), childPid);
 }
+#endif // !__EMSCRIPTEN__
 
 llvm::Expected<std::unique_ptr<IncrementalExecutor>>
 IncrementalExecutorBuilder::create(llvm::orc::ThreadSafeContext &TSC,
                                    const clang::TargetInfo &TI) {
   if (IE)
     return std::move(IE);
+
+#ifdef __EMSCRIPTEN__
+  (void)TSC;
+  (void)TI;
+  return std::make_unique<WasmIncrementalExecutor>();
+#else
+
   llvm::Triple TT = TI.getTriple();
   if (!TT.isOSWindows() && IsOutOfProcess) {
     if (!JITBuilder) {
@@ -403,18 +415,16 @@ 
IncrementalExecutorBuilder::create(llvm::orc::ThreadSafeContext &TSC,
 
   llvm::Error Err = llvm::Error::success();
   std::unique_ptr<IncrementalExecutor> Executor;
-#ifdef __EMSCRIPTEN__
-  Executor = std::make_unique<WasmIncrementalExecutor>();
-#else
   Executor = std::make_unique<OrcIncrementalExecutor>(TSC, *JITBuilder, Err);
-#endif
 
   if (Err)
     return std::move(Err);
 
   return std::move(Executor);
+#endif
 }
 
+#ifndef __EMSCRIPTEN__
 llvm::Error IncrementalExecutorBuilder::UpdateOrcRuntimePath(
     const clang::driver::Compilation &C) {
   if (!IsOutOfProcess)
@@ -506,5 +516,6 @@ llvm::Error 
IncrementalExecutorBuilder::UpdateOrcRuntimePath(
       llvm::formatv("OrcRuntime library not found in: {0}", Joined).str(),
       llvm::inconvertibleErrorCode());
 }
+#endif // !__EMSCRIPTEN__
 
 } // end namespace clang
 ```
 
 **This wasm build on libclangInterpreter.a would be devoid of any ORC 
influence. And then again I ran the tests. All tests pass as expected and the 
binary size is much smaller as we need.**
 
 Shall raise a PR with my rough draft soon and we can review it further there.
 



https://github.com/llvm/llvm-project/pull/175448
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to