diff options
author | Lang Hames <lhames@gmail.com> | 2014-07-22 22:47:39 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-07-22 22:47:39 +0000 |
commit | f7acddde5b0c9a32371ace1084949e9224a516d8 (patch) | |
tree | 4c09c5fb587c591d24cf972bc013cba4af6822bc /llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h | |
parent | d0a480a6f2dd591405a5e6e8b0d41c5d85b70234 (diff) | |
download | bcm5719-llvm-f7acddde5b0c9a32371ace1084949e9224a516d8.tar.gz bcm5719-llvm-f7acddde5b0c9a32371ace1084949e9224a516d8.zip |
[MCJIT] Refactor and add stub inspection to the RuntimeDyldChecker framework.
This patch introduces a 'stub_addr' builtin that can be used to find the address
of the stub for a given (<file>, <section>, <symbol>) tuple. This address can be
used both to verify the contents of stubs (by loading from the returned address)
and to verify references to stubs (by comparing against the returned address).
Example (1) - Verifying stub contents:
Load 8 bytes (assuming a 64-bit target) from the stub for 'x' in the __text
section of f.o, and compare that value against the addres of 'x'.
# rtdyld-check: *{8}(stub_addr(f.o, __text, x) = x
Example (2) - Verifying references to stubs:
Decode the immediate of the instruction at label 'l', and verify that it's
equal to the offset from the next instruction's PC to the stub for 'y' in the
__text section of f.o (i.e. it's the correct PC-rel difference).
# rtdyld-check: decode_operand(l, 4) = stub_addr(f.o, __text, y) - next_pc(l)
l:
movq y@GOTPCREL(%rip), %rax
Since stub inspection requires cooperation with RuntimeDyldImpl this patch
pimpl-ifies RuntimeDyldChecker. Its implementation is moved in to a new class,
RuntimeDyldCheckerImpl, that has access to the definition of RuntimeDyldImpl.
llvm-svn: 213698
Diffstat (limited to 'llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h')
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index 0211d2bbbb0..3fabf5ebd6d 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -159,7 +159,7 @@ public: }; class RuntimeDyldImpl { - friend class RuntimeDyldChecker; + friend class RuntimeDyldCheckerImpl; private: uint64_t getAnySymbolRemoteAddress(StringRef Symbol) { @@ -172,6 +172,9 @@ protected: // The MemoryManager to load objects into. RTDyldMemoryManager *MemMgr; + // Attached RuntimeDyldChecker instance. Null if no instance attached. + RuntimeDyldCheckerImpl *Checker; + // A list of all sections emitted by the dynamic linker. These sections are // referenced in the code by means of their index in this list - SectionID. typedef SmallVector<SectionEntry, 64> SectionList; @@ -211,6 +214,7 @@ protected: // modules. This map is indexed by symbol name. StringMap<RelocationList> ExternalSymbolRelocations; + typedef std::map<RelocationValueRef, uintptr_t> StubMap; Triple::ArchType Arch; @@ -349,7 +353,7 @@ protected: public: RuntimeDyldImpl(RTDyldMemoryManager *mm) - : MemMgr(mm), ProcessAllSections(false), HasError(false) { + : MemMgr(mm), Checker(nullptr), ProcessAllSections(false), HasError(false) { } virtual ~RuntimeDyldImpl(); @@ -358,6 +362,10 @@ public: this->ProcessAllSections = ProcessAllSections; } + void setRuntimeDyldChecker(RuntimeDyldCheckerImpl *Checker) { + this->Checker = Checker; + } + ObjectImage *loadObject(ObjectImage *InputObject); uint8_t* getSymbolAddress(StringRef Name) { |