Author: Anutosh Bhat
Date: 2026-09-22T07:41:55Z
New Revision: 1833848c3e6ddc1d670cc0adea027867b9ed742b

URL: 
https://github.com/llvm/llvm-project/commit/1833848c3e6ddc1d670cc0adea027867b9ed742b
DIFF: 
https://github.com/llvm/llvm-project/commit/1833848c3e6ddc1d670cc0adea027867b9ed742b.diff

LOG: [clang-repl] Support wasm64 execution (#225311)

Emscripten-forge is adding wasm64 builds on its emscripten 6-x branch
which exposed two wasm32 hardcoded assumptions in clang-repl's
WebAssembly execution path.

`IncrementalCompilerBuilder::CreateCpp()` currently hardcodes
`wasm32-unknown-emscripten`, even when clang-repl itself is built for
wasm64.

Once Clang emits a wasm64 object, the in-process linker must also select
the correct emulation. `wasm-ld` defaults to wasm32 and otherwise fails
in `InputFile::checkArch()` with:

```text
must specify -mwasm64 to process wasm64 object files
```

The pipeline is this 
```
lldMain
  → lld::wasm::link
  → LinkerDriver::linkerMain
  → createFiles
  → addFile
  → createObjectFile
  → ObjFile::ObjFile
  → InputFile::checkArch
  → fatal: must specify -mwasm64 to process wasm64 object files
```

This patch introduces 2 atomic patches fixing the only 2 buggy sources !

Added: 
    

Modified: 
    clang/lib/Interpreter/Interpreter.cpp
    clang/lib/Interpreter/Wasm.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Interpreter/Interpreter.cpp 
b/clang/lib/Interpreter/Interpreter.cpp
index 092f3ede771f6..512b28be5a544 100644
--- a/clang/lib/Interpreter/Interpreter.cpp
+++ b/clang/lib/Interpreter/Interpreter.cpp
@@ -288,17 +288,18 @@ IncrementalCompilerBuilder::create(std::string TT,
 
 llvm::Expected<std::unique_ptr<CompilerInstance>>
 IncrementalCompilerBuilder::CreateCpp() {
+  std::string TT = TargetTriple ? *TargetTriple : 
llvm::sys::getProcessTriple();
+
   std::vector<const char *> Argv;
   Argv.reserve(5 + 1 + UserArgs.size());
   Argv.push_back("-xc++");
 #ifdef __EMSCRIPTEN__
   Argv.push_back("-target");
-  Argv.push_back("wasm32-unknown-emscripten");
+  Argv.push_back(TT.c_str());
   Argv.push_back("-fvisibility=default");
 #endif
   llvm::append_range(Argv, UserArgs);
 
-  std::string TT = TargetTriple ? *TargetTriple : 
llvm::sys::getProcessTriple();
   return IncrementalCompilerBuilder::create(TT, Argv);
 }
 

diff  --git a/clang/lib/Interpreter/Wasm.cpp b/clang/lib/Interpreter/Wasm.cpp
index a36a7f7b027e8..573c8910d3a41 100644
--- a/clang/lib/Interpreter/Wasm.cpp
+++ b/clang/lib/Interpreter/Wasm.cpp
@@ -18,6 +18,7 @@
 #include <llvm/IR/Module.h>
 #include <llvm/MC/TargetRegistry.h>
 #include <llvm/Target/TargetMachine.h>
+#include <llvm/TargetParser/Triple.h>
 
 #include <clang/Interpreter/Interpreter.h>
 
@@ -117,7 +118,11 @@ llvm::Error 
WasmIncrementalExecutor::addModule(PartialTranslationUnit &PTU) {
 
   ObjectFileOutput.close();
 
+  std::string Emulation = "-m";
+  Emulation +=
+      llvm::Triple(PTU.TheModule->getTargetTriple()).getArchName().str();
   std::vector<const char *> LinkerArgs = {"wasm-ld",
+                                          Emulation.c_str(),
                                           "-shared",
                                           "--import-memory",
                                           "--stack-first",


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

Reply via email to