mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +00:00
Added LLIMCJITMemoryManager to the lli. This manager will be used for MCJIT instead of DefaultJIMMemoryManager.
It's more flexible for MCJIT tasks, in addition it's provides a invalidation instruction cache for code sections which will be used before JIT code will be executed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -63,18 +63,37 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Invalidate instruction cache for sections with execute permissions.
|
||||
// Some platforms with separate data cache and instruction cache require
|
||||
// explicit cache flush, otherwise JIT code manipulations (like resolved
|
||||
// relocations) will get to the data cache but not to the instruction cache.
|
||||
virtual void invalidateInstructionCache();
|
||||
};
|
||||
|
||||
uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size,
|
||||
unsigned Alignment,
|
||||
unsigned SectionID) {
|
||||
return (uint8_t*)sys::Memory::AllocateRWX(Size, 0, 0).base();
|
||||
sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, 0, 0);
|
||||
FunctionMemory.push_back(MB);
|
||||
return (uint8_t*)MB.base();
|
||||
}
|
||||
|
||||
uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
|
||||
unsigned Alignment,
|
||||
unsigned SectionID) {
|
||||
return (uint8_t*)sys::Memory::AllocateRWX(Size, 0, 0).base();
|
||||
sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, 0, 0);
|
||||
DataMemory.push_back(MB);
|
||||
return (uint8_t*)MB.base();
|
||||
}
|
||||
|
||||
void TrivialMemoryManager::invalidateInstructionCache() {
|
||||
for (int i = 0, e = FunctionMemory.size(); i != e; ++i)
|
||||
sys::Memory::InvalidateInstructionCache(FunctionMemory[i].base(),
|
||||
FunctionMemory[i].size());
|
||||
|
||||
for (int i = 0, e = DataMemory.size(); i != e; ++i)
|
||||
sys::Memory::InvalidateInstructionCache(DataMemory[i].base(),
|
||||
DataMemory[i].size());
|
||||
}
|
||||
|
||||
static const char *ProgramName;
|
||||
@ -113,6 +132,8 @@ static int executeInput() {
|
||||
|
||||
// Resolve all the relocations we can.
|
||||
Dyld.resolveRelocations();
|
||||
// Clear instruction cache before code will be executed.
|
||||
MemMgr->invalidateInstructionCache();
|
||||
|
||||
// FIXME: Error out if there are unresolved relocations.
|
||||
|
||||
|
Reference in New Issue
Block a user