Skip to content

Commit

Permalink
[llvm-rtdyld] Don't waste cycles invalidating instruction cache.
Browse files Browse the repository at this point in the history
Now that setExecutable() changed to do all the ground work to make
memory executable on the host, we can remove all (redundant) calls
to invalidate instruction cache here.

As an added bonus, this makes invalidateInstructionCache() dead
code, so it can be removed.

Differential Revision:	http://reviews.llvm.org/D13631

llvm-svn: 253343
  • Loading branch information
dcci committed Nov 17, 2015
1 parent 6689df8 commit af08e1b
Showing 1 changed file with 4 additions and 20 deletions.
24 changes: 4 additions & 20 deletions llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
Expand Up @@ -155,12 +155,6 @@ class TrivialMemoryManager : public RTDyldMemoryManager {

bool finalizeMemory(std::string *ErrMsg) override { return false; }

// 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();

void addDummySymbol(const std::string &Name, uint64_t Addr) {
DummyExterns[Name] = Addr;
}
Expand Down Expand Up @@ -244,14 +238,6 @@ uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
return (uint8_t*)MB.base();
}

void TrivialMemoryManager::invalidateInstructionCache() {
for (auto &FM : FunctionMemory)
sys::Memory::InvalidateInstructionCache(FM.base(), FM.size());

for (auto &DM : DataMemory)
sys::Memory::InvalidateInstructionCache(DM.base(), DM.size());
}

static const char *ProgramName;

static void Message(const char *Type, const Twine &Msg) {
Expand Down Expand Up @@ -424,12 +410,9 @@ static int executeInput() {
}
}

// Resolve all the relocations we can.
Dyld.resolveRelocations();
// Clear instruction cache before code will be executed.
MemMgr.invalidateInstructionCache();

// Resove all the relocations we can.
// FIXME: Error out if there are unresolved relocations.
Dyld.resolveRelocations();

// Get the address of the entry point (_main by default).
void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint);
Expand All @@ -438,9 +421,10 @@ static int executeInput() {

// Invalidate the instruction cache for each loaded function.
for (auto &FM : MemMgr.FunctionMemory) {

// Make sure the memory is executable.
// setExecutable will call InvalidateInstructionCache.
std::string ErrorStr;
sys::Memory::InvalidateInstructionCache(FM.base(), FM.size());
if (!sys::Memory::setExecutable(FM, &ErrorStr))
return Error("unable to mark function executable: '" + ErrorStr + "'");
}
Expand Down

0 comments on commit af08e1b

Please sign in to comment.