diff options
author | Vassil Vassilev <v.g.vassilev@gmail.com> | 2024-07-02 13:29:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-02 13:29:31 +0300 |
commit | 9a9546e30cbce764fb96de1ae0b4f8f01f6d223f (patch) | |
tree | 1f21ba60f187673e5290f5f6e752d22174d26e5d /clang/lib/Interpreter/Interpreter.cpp | |
parent | 253a76261901d966cc803077294bf3fc9ef9ea18 (diff) | |
download | llvm-9a9546e30cbce764fb96de1ae0b4f8f01f6d223f.zip llvm-9a9546e30cbce764fb96de1ae0b4f8f01f6d223f.tar.gz llvm-9a9546e30cbce764fb96de1ae0b4f8f01f6d223f.tar.bz2 |
[clang-repl] Support wasm execution (#86402)
This commit introduces support for running clang-repl and executing C++
code interactively inside a Javascript engine using WebAssembly when
built with Emscripten. This is achieved by producing WASM "shared
libraries" that can be loaded by the Emscripten runtime using dlopen()
More discussion is available in https://reviews.llvm.org/D158140
Co-authored-by: Anubhab Ghosh <anubhabghosh.me@gmail.com>
Diffstat (limited to 'clang/lib/Interpreter/Interpreter.cpp')
-rw-r--r-- | clang/lib/Interpreter/Interpreter.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 7a95278..49dc92d 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -15,6 +15,9 @@ #include "IncrementalExecutor.h" #include "IncrementalParser.h" #include "InterpreterUtils.h" +#ifdef __EMSCRIPTEN__ +#include "Wasm.h" +#endif // __EMSCRIPTEN__ #include "clang/AST/ASTContext.h" #include "clang/AST/Mangle.h" @@ -186,6 +189,12 @@ IncrementalCompilerBuilder::CreateCpp() { 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("-pie"); + Argv.push_back("-shared"); +#endif Argv.insert(Argv.end(), UserArgs.begin(), UserArgs.end()); std::string TT = TargetTriple ? *TargetTriple : llvm::sys::getProcessTriple(); @@ -426,8 +435,12 @@ llvm::Error Interpreter::CreateExecutor() { } llvm::Error Err = llvm::Error::success(); +#ifdef __EMSCRIPTEN__ + auto Executor = std::make_unique<WasmIncrementalExecutor>(*TSCtx); +#else auto Executor = std::make_unique<IncrementalExecutor>(*TSCtx, *JITBuilder, Err); +#endif if (!Err) IncrExecutor = std::move(Executor); |