[llvm-commits] [llvm] r129328 - in /llvm/trunk: include/llvm/ExecutionEngine/RuntimeDyld.h lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp tools/llvm-rtdyld/llvm-rtdyld.cpp
Jim Grosbach
grosbach at apple.com
Mon Apr 11 17:23:32 PDT 2011
Author: grosbach
Date: Mon Apr 11 19:23:32 2011
New Revision: 129328
URL: http://llvm.org/viewvc/llvm-project?rev=129328&view=rev
Log:
Tidy up a bit now that we're using the MemoryManager interface.
Modified:
llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=129328&r1=129327&r2=129328&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Mon Apr 11 19:23:32 2011
@@ -63,9 +63,6 @@
// and resolve relocatons based on where they put it).
void *getSymbolAddress(StringRef Name);
void reassignSymbolAddress(StringRef Name, uint64_t Addr);
- // FIXME: Should be parameterized to get the memory block associated with
- // a particular loaded object.
- sys::MemoryBlock getMemoryBlock();
StringRef getErrorString();
};
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=129328&r1=129327&r2=129328&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Apr 11 19:23:32 2011
@@ -51,7 +51,7 @@
// FIXME: Should have multiple data blocks, one for each loaded chunk of
// compiled code.
- sys::MemoryBlock Data;
+// sys::MemoryBlock Data;
bool HasError;
std::string ErrorStr;
@@ -91,8 +91,6 @@
return Functions.lookup(Name).base();
}
- sys::MemoryBlock getMemoryBlock() { return Data; }
-
// Is the linker in an error state?
bool hasError() { return HasError; }
@@ -528,10 +526,6 @@
return Dyld->getSymbolAddress(Name);
}
-sys::MemoryBlock RuntimeDyld::getMemoryBlock() {
- return Dyld->getMemoryBlock();
-}
-
StringRef RuntimeDyld::getErrorString() {
return Dyld->getErrorString();
}
Modified: llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp?rev=129328&r1=129327&r2=129328&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp (original)
+++ llvm/trunk/tools/llvm-rtdyld/llvm-rtdyld.cpp Mon Apr 11 19:23:32 2011
@@ -44,9 +44,11 @@
// support library allocation routines directly.
class TrivialMemoryManager : public RTDyldMemoryManager {
public:
+ SmallVector<sys::MemoryBlock, 16> FunctionMemory;
+
uint8_t *startFunctionBody(const char *Name, uintptr_t &Size);
void endFunctionBody(const char *Name, uint8_t *FunctionStart,
- uint8_t *FunctionEnd) {}
+ uint8_t *FunctionEnd);
};
uint8_t *TrivialMemoryManager::startFunctionBody(const char *Name,
@@ -54,6 +56,13 @@
return (uint8_t*)sys::Memory::AllocateRWX(Size, 0, 0).base();
}
+void TrivialMemoryManager::endFunctionBody(const char *Name,
+ uint8_t *FunctionStart,
+ uint8_t *FunctionEnd) {
+ uintptr_t Size = FunctionEnd - FunctionStart + 1;
+ FunctionMemory.push_back(sys::MemoryBlock(FunctionStart, Size));
+}
+
static const char *ProgramName;
static void Message(const char *Type, const Twine &Msg) {
@@ -74,7 +83,8 @@
return Error("unable to read input: '" + ec.message() + "'");
// Instantiate a dynamic linker.
- RuntimeDyld Dyld(new TrivialMemoryManager);
+ TrivialMemoryManager *MemMgr = new TrivialMemoryManager;
+ RuntimeDyld Dyld(MemMgr);
// Load the object file into it.
if (Dyld.loadObject(InputBuffer.take())) {
@@ -86,14 +96,16 @@
if (MainAddress == 0)
return Error("no definition for '_main'");
- // Invalidate the instruction cache.
- sys::MemoryBlock Data = Dyld.getMemoryBlock();
- sys::Memory::InvalidateInstructionCache(Data.base(), Data.size());
-
- // Make sure the memory is executable.
- std::string ErrorStr;
- if (!sys::Memory::setExecutable(Data, &ErrorStr))
- return Error("unable to mark function executable: '" + ErrorStr + "'");
+ // Invalidate the instruction cache for each loaded function.
+ for (unsigned i = 0, e = MemMgr->FunctionMemory.size(); i != e; ++i) {
+ sys::MemoryBlock &Data = MemMgr->FunctionMemory[i];
+ // Make sure the memory is executable.
+ std::string ErrorStr;
+ sys::Memory::InvalidateInstructionCache(Data.base(), Data.size());
+ if (!sys::Memory::setExecutable(Data, &ErrorStr))
+ return Error("unable to mark function executable: '" + ErrorStr + "'");
+ }
+
// Dispatch to _main().
errs() << "loaded '_main' at: " << (void*)MainAddress << "\n";
More information about the llvm-commits
mailing list