[llvm-rtdyld] Don't waste cycles invalidating instruction cache.
authorDavide Italiano <davide@freebsd.org>
Tue, 17 Nov 2015 16:37:52 +0000 (16:37 +0000)
committerDavide Italiano <davide@freebsd.org>
Tue, 17 Nov 2015 16:37:52 +0000 (16:37 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253343 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-rtdyld/llvm-rtdyld.cpp

index e55932fcea6d7c5bd46d21865ccf2dfb231dbf3f..315c50fd9efd0e91afcd35ce0f92c13b8fa3128a 100644 (file)
@@ -155,12 +155,6 @@ public:
 
   bool finalizeMemory(std::string *ErrMsg) override { return false; }
 
 
   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;
   }
   void addDummySymbol(const std::string &Name, uint64_t Addr) {
     DummyExterns[Name] = Addr;
   }
@@ -244,14 +238,6 @@ uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
   return (uint8_t*)MB.base();
 }
 
   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) {
 static const char *ProgramName;
 
 static void Message(const char *Type, const Twine &Msg) {
@@ -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.
   // 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);
 
   // Get the address of the entry point (_main by default).
   void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint);
@@ -438,9 +421,10 @@ static int executeInput() {
 
   // Invalidate the instruction cache for each loaded function.
   for (auto &FM : MemMgr.FunctionMemory) {
 
   // Invalidate the instruction cache for each loaded function.
   for (auto &FM : MemMgr.FunctionMemory) {
+
     // Make sure the memory is executable.
     // Make sure the memory is executable.
+    // setExecutable will call InvalidateInstructionCache.
     std::string ErrorStr;
     std::string ErrorStr;
-    sys::Memory::InvalidateInstructionCache(FM.base(), FM.size());
     if (!sys::Memory::setExecutable(FM, &ErrorStr))
       return Error("unable to mark function executable: '" + ErrorStr + "'");
   }
     if (!sys::Memory::setExecutable(FM, &ErrorStr))
       return Error("unable to mark function executable: '" + ErrorStr + "'");
   }