Skip to content

Commit 6824932

Browse files
committed
Add static DefineAbsoluteSymbol to define injected symbols
1 parent dbf6317 commit 6824932

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

lib/CppInterOp/CppInterOp.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@
4848
#include "llvm/ADT/SmallVector.h"
4949
#include "llvm/ADT/StringRef.h"
5050
#include "llvm/Demangle/Demangle.h"
51+
#if CLANG_VERSION_MAJOR >= 20
52+
#include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h"
53+
#include "llvm/ExecutionEngine/Orc/CoreContainers.h"
54+
#endif
55+
#include "llvm/ExecutionEngine/Orc/Core.h"
5156
#include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
5257
#include "llvm/IR/GlobalValue.h"
5358
#include "llvm/Support/Casting.h"
@@ -3175,6 +3180,29 @@ CPPINTEROP_API JitCall MakeFunctionCallable(TCppConstFunction_t func) {
31753180
}
31763181

31773182
namespace {
3183+
#if !defined(CPPINTEROP_USE_CLING) && !defined(EMSCRIPTEN)
3184+
bool DefineAbsoluteSymbol(compat::Interpreter& I,
3185+
const char* linker_mangled_name, uint64_t address) {
3186+
using namespace llvm;
3187+
using namespace llvm::orc;
3188+
3189+
llvm::orc::LLJIT& Jit = *compat::getExecutionEngine(I);
3190+
llvm::orc::ExecutionSession& ES = Jit.getExecutionSession();
3191+
JITDylib& DyLib = *Jit.getProcessSymbolsJITDylib().get();
3192+
3193+
llvm::orc::SymbolMap InjectedSymbols{
3194+
{ES.intern(linker_mangled_name),
3195+
ExecutorSymbolDef(ExecutorAddr(address), JITSymbolFlags::Exported)}};
3196+
3197+
if (Error Err = DyLib.define(absoluteSymbols(InjectedSymbols))) {
3198+
logAllUnhandledErrors(std::move(Err), errs(),
3199+
"DefineAbsoluteSymbol error: ");
3200+
return true;
3201+
}
3202+
return false;
3203+
}
3204+
#endif
3205+
31783206
static std::string MakeResourcesPath() {
31793207
StringRef Dir;
31803208
#ifdef LLVM_BINARY_DIR

0 commit comments

Comments
 (0)