[llvm-branch-commits] [clang] release/20.x: [clang-repl] Implement LoadDynamicLibrary for clang-repl wasm use cases (#133037) (PR #137616)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Apr 29 15:54:30 PDT 2025
https://github.com/llvmbot updated https://github.com/llvm/llvm-project/pull/137616
>From 8c2dc1b5aa7fc25d2083b60f04687f307bfc4e37 Mon Sep 17 00:00:00 2001
From: Anutosh Bhat <andersonbhat491 at gmail.com>
Date: Tue, 1 Apr 2025 18:03:45 +0530
Subject: [PATCH] [clang-repl] Implement LoadDynamicLibrary for clang-repl wasm
use cases (#133037)
**Currently we don't make use of the JIT for the wasm use cases so the
approach using the execution engine won't work in these cases.**
Rather if we use dlopen. We should be able to do the following
(demonstrating through a toy project)
1) Make use of LoadDynamicLibrary through the given implementation
```
extern "C" EMSCRIPTEN_KEEPALIVE int load_library(const char *name) {
auto Err = Interp->LoadDynamicLibrary(name);
if (Err) {
llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "load_library error: ");
return -1;
}
return 0;
}
```
2) Add a button to call load_library once the library has been added in
our MEMFS (currently we have symengine built as a SIDE MODULE and we are
loading it)
(cherry picked from commit 8f56394487a4d454be0637667267ad37bd636d0f)
---
clang/lib/Interpreter/IncrementalExecutor.h | 2 +-
clang/lib/Interpreter/Interpreter.cpp | 10 ++++++++++
clang/lib/Interpreter/Wasm.cpp | 13 +++++++++++++
clang/lib/Interpreter/Wasm.h | 3 +++
4 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Interpreter/IncrementalExecutor.h b/clang/lib/Interpreter/IncrementalExecutor.h
index dbd61f0b8b1eb..71d71bc3883e2 100644
--- a/clang/lib/Interpreter/IncrementalExecutor.h
+++ b/clang/lib/Interpreter/IncrementalExecutor.h
@@ -57,7 +57,7 @@ class IncrementalExecutor {
virtual llvm::Error removeModule(PartialTranslationUnit &PTU);
virtual llvm::Error runCtors() const;
virtual llvm::Error cleanUp();
- llvm::Expected<llvm::orc::ExecutorAddr>
+ virtual llvm::Expected<llvm::orc::ExecutorAddr>
getSymbolAddress(llvm::StringRef Name, SymbolNameKind NameKind) const;
llvm::orc::LLJIT &GetExecutionEngine() { return *Jit; }
diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp
index bd21f82081712..f91563dd0378c 100644
--- a/clang/lib/Interpreter/Interpreter.cpp
+++ b/clang/lib/Interpreter/Interpreter.cpp
@@ -18,6 +18,7 @@
#include "llvm/Support/VirtualFileSystem.h"
#ifdef __EMSCRIPTEN__
#include "Wasm.h"
+#include <dlfcn.h>
#endif // __EMSCRIPTEN__
#include "clang/AST/ASTConsumer.h"
@@ -737,6 +738,14 @@ llvm::Error Interpreter::Undo(unsigned N) {
}
llvm::Error Interpreter::LoadDynamicLibrary(const char *name) {
+#ifdef __EMSCRIPTEN__
+ void *handle = dlopen(name, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle) {
+ llvm::errs() << dlerror() << '\n';
+ return llvm::make_error<llvm::StringError>("Failed to load dynamic library",
+ llvm::inconvertibleErrorCode());
+ }
+#else
auto EE = getExecutionEngine();
if (!EE)
return EE.takeError();
@@ -748,6 +757,7 @@ llvm::Error Interpreter::LoadDynamicLibrary(const char *name) {
EE->getMainJITDylib().addGenerator(std::move(*DLSG));
else
return DLSG.takeError();
+#endif
return llvm::Error::success();
}
diff --git a/clang/lib/Interpreter/Wasm.cpp b/clang/lib/Interpreter/Wasm.cpp
index aa10b160ccf84..74c83169ced6c 100644
--- a/clang/lib/Interpreter/Wasm.cpp
+++ b/clang/lib/Interpreter/Wasm.cpp
@@ -144,6 +144,19 @@ llvm::Error WasmIncrementalExecutor::cleanUp() {
return llvm::Error::success();
}
+llvm::Expected<llvm::orc::ExecutorAddr>
+WasmIncrementalExecutor::getSymbolAddress(llvm::StringRef Name,
+ SymbolNameKind NameKind) const {
+ void *Sym = dlsym(RTLD_DEFAULT, Name.str().c_str());
+ if (!Sym) {
+ return llvm::make_error<llvm::StringError>("dlsym failed for symbol: " +
+ Name.str(),
+ llvm::inconvertibleErrorCode());
+ }
+
+ return llvm::orc::ExecutorAddr::fromPtr(Sym);
+}
+
WasmIncrementalExecutor::~WasmIncrementalExecutor() = default;
} // namespace clang
\ No newline at end of file
diff --git a/clang/lib/Interpreter/Wasm.h b/clang/lib/Interpreter/Wasm.h
index 4632613326d39..9a752934e3185 100644
--- a/clang/lib/Interpreter/Wasm.h
+++ b/clang/lib/Interpreter/Wasm.h
@@ -29,6 +29,9 @@ class WasmIncrementalExecutor : public IncrementalExecutor {
llvm::Error removeModule(PartialTranslationUnit &PTU) override;
llvm::Error runCtors() const override;
llvm::Error cleanUp() override;
+ llvm::Expected<llvm::orc::ExecutorAddr>
+ getSymbolAddress(llvm::StringRef Name,
+ SymbolNameKind NameKind) const override;
~WasmIncrementalExecutor() override;
};
More information about the llvm-branch-commits
mailing list