|
48 | 48 | #include "llvm/ADT/SmallVector.h" |
49 | 49 | #include "llvm/ADT/StringRef.h" |
50 | 50 | #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" |
51 | 56 | #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" |
52 | 57 | #include "llvm/IR/GlobalValue.h" |
53 | 58 | #include "llvm/Support/Casting.h" |
@@ -3175,6 +3180,29 @@ CPPINTEROP_API JitCall MakeFunctionCallable(TCppConstFunction_t func) { |
3175 | 3180 | } |
3176 | 3181 |
|
3177 | 3182 | 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 | + |
3178 | 3206 | static std::string MakeResourcesPath() { |
3179 | 3207 | StringRef Dir; |
3180 | 3208 | #ifdef LLVM_BINARY_DIR |
|
0 commit comments