mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-03 14:31:10 +00:00
[MCJIT] Fix PR20656 by teaching MCJIT to honor ExecutionEngine's global mapping.
This is important for users of the C API who can't supply custom symbol resolvers yet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243589 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6fc1adf9c7
commit
7fe1972500
@ -189,10 +189,17 @@ uint64_t ExecutionEngineState::RemoveMapping(StringRef Name) {
|
||||
}
|
||||
|
||||
std::string ExecutionEngine::getMangledName(const GlobalValue *GV) {
|
||||
assert(GV->hasName() && "Global must have name.");
|
||||
|
||||
MutexGuard locked(lock);
|
||||
Mangler Mang;
|
||||
SmallString<128> FullName;
|
||||
Mang.getNameWithPrefix(FullName, GV, false);
|
||||
|
||||
const DataLayout &DL =
|
||||
GV->getParent()->getDataLayout().isDefault()
|
||||
? getDataLayout()
|
||||
: GV->getParent()->getDataLayout();
|
||||
|
||||
Mangler::getNameWithPrefix(FullName, GV->getName(), DL);
|
||||
return FullName.str();
|
||||
}
|
||||
|
||||
|
@ -270,6 +270,12 @@ void MCJIT::finalizeModule(Module *M) {
|
||||
RuntimeDyld::SymbolInfo MCJIT::findExistingSymbol(const std::string &Name) {
|
||||
SmallString<128> FullName;
|
||||
Mangler::getNameWithPrefix(FullName, Name, getDataLayout());
|
||||
|
||||
if (void *Addr = getPointerToGlobalIfAvailable(FullName))
|
||||
return RuntimeDyld::SymbolInfo(static_cast<uint64_t>(
|
||||
reinterpret_cast<uintptr_t>(Addr)),
|
||||
JITSymbolFlags::Exported);
|
||||
|
||||
return Dyld.getSymbol(FullName);
|
||||
}
|
||||
|
||||
|
@ -488,3 +488,36 @@ TEST_F(MCJITCAPITest, yield) {
|
||||
EXPECT_TRUE(didCallYield);
|
||||
}
|
||||
|
||||
static int localTestFunc() {
|
||||
return 42;
|
||||
}
|
||||
|
||||
TEST_F(MCJITCAPITest, addGlobalMapping) {
|
||||
SKIP_UNSUPPORTED_PLATFORM;
|
||||
|
||||
Module = LLVMModuleCreateWithName("testModule");
|
||||
LLVMTypeRef FunctionType = LLVMFunctionType(LLVMInt32Type(), NULL, 0, 0);
|
||||
LLVMValueRef MappedFn = LLVMAddFunction(Module, "mapped_fn", FunctionType);
|
||||
|
||||
Function = LLVMAddFunction(Module, "test_fn", FunctionType);
|
||||
LLVMBasicBlockRef Entry = LLVMAppendBasicBlock(Function, "");
|
||||
LLVMBuilderRef Builder = LLVMCreateBuilder();
|
||||
LLVMPositionBuilderAtEnd(Builder, Entry);
|
||||
LLVMValueRef RetVal = LLVMBuildCall(Builder, MappedFn, NULL, 0, "");
|
||||
LLVMBuildRet(Builder, RetVal);
|
||||
|
||||
LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
|
||||
LLVMDisposeMessage(Error);
|
||||
|
||||
buildMCJITOptions();
|
||||
buildMCJITEngine();
|
||||
|
||||
LLVMAddGlobalMapping(Engine, MappedFn, reinterpret_cast<void*>(&localTestFunc));
|
||||
|
||||
buildAndRunPasses();
|
||||
|
||||
uint64_t raw = LLVMGetFunctionAddress(Engine, "test_fn");
|
||||
int (*usable)() = (int (*)()) raw;
|
||||
|
||||
EXPECT_EQ(42, usable());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user