|
90 | 90 | #include <unistd.h>
|
91 | 91 | #endif // WIN32
|
92 | 92 |
|
| 93 | +extern "C" void __clang_Interpreter_SetValueNoAlloc(void* This, void* OutVal, |
| 94 | + void* OpaqueType, ...); |
| 95 | + |
93 | 96 | namespace Cpp {
|
94 | 97 |
|
95 | 98 | using namespace clang;
|
@@ -3330,6 +3333,37 @@ CPPINTEROP_API JitCall MakeFunctionCallable(TCppConstFunction_t func) {
|
3330 | 3333 | }
|
3331 | 3334 |
|
3332 | 3335 | namespace {
|
| 3336 | +#ifndef CPPINTEROP_USE_CLING |
| 3337 | +static bool DefineAbsoluteSymbol(compat::Interpreter& I, |
| 3338 | + const char* linker_mangled_name, |
| 3339 | + uint64_t address) { |
| 3340 | + using namespace llvm; |
| 3341 | + using namespace llvm::orc; |
| 3342 | + |
| 3343 | + llvm::orc::LLJIT& Jit = *compat::getExecutionEngine(I); |
| 3344 | + llvm::orc::ExecutionSession& ES = Jit.getExecutionSession(); |
| 3345 | + JITDylib& DyLib = *Jit.getProcessSymbolsJITDylib().get(); |
| 3346 | + |
| 3347 | + llvm::orc::SymbolMap InjectedSymbols; |
| 3348 | + auto& DL = compat::getExecutionEngine(I)->getDataLayout(); |
| 3349 | + char GlobalPrefix = DL.getGlobalPrefix(); |
| 3350 | + std::string tmp(linker_mangled_name); |
| 3351 | + if (GlobalPrefix != '\0') { |
| 3352 | + tmp = std::string(1, GlobalPrefix) + tmp; |
| 3353 | + } |
| 3354 | + auto Name = ES.intern(tmp); |
| 3355 | + InjectedSymbols[Name] = |
| 3356 | + ExecutorSymbolDef(ExecutorAddr(address), JITSymbolFlags::Exported); |
| 3357 | + |
| 3358 | + if (Error Err = DyLib.define(absoluteSymbols(InjectedSymbols))) { |
| 3359 | + logAllUnhandledErrors(std::move(Err), errs(), |
| 3360 | + "DefineAbsoluteSymbol error: "); |
| 3361 | + return true; |
| 3362 | + } |
| 3363 | + return false; |
| 3364 | +} |
| 3365 | +#endif |
| 3366 | + |
3333 | 3367 | static std::string MakeResourcesPath() {
|
3334 | 3368 | StringRef Dir;
|
3335 | 3369 | #ifdef LLVM_BINARY_DIR
|
@@ -3442,6 +3476,11 @@ TInterp_t CreateInterpreter(const std::vector<const char*>& Args /*={}*/,
|
3442 | 3476 | sInterpreters->back().get()});
|
3443 | 3477 |
|
3444 | 3478 | assert(sInterpreters->size() == sInterpreterASTMap->size());
|
| 3479 | +// define __clang_Interpreter_SetValueNoAlloc in the JIT dylib for clang-repl |
| 3480 | +#ifndef CPPINTEROP_USE_CLING |
| 3481 | + DefineAbsoluteSymbol(*I, "__clang_Interpreter_SetValueNoAlloc", |
| 3482 | + (uint64_t)&__clang_Interpreter_SetValueNoAlloc); |
| 3483 | +#endif |
3445 | 3484 | return I;
|
3446 | 3485 | }
|
3447 | 3486 |
|
|
0 commit comments