summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-03-29 23:23:59 +0000
committerBill Wendling <isanbard@gmail.com>2012-03-29 23:23:59 +0000
commit288967dfac246c8e35dc4f85afb667e74d1d26a8 (patch)
tree7dd4eef16e2e567d38180a3dbdbc01f5e9be3b0c /lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
parent7a4c071cd9f67599eba21e902079d0e85f2abf97 (diff)
downloadllvm-288967dfac246c8e35dc4f85afb667e74d1d26a8.tar.gz
llvm-288967dfac246c8e35dc4f85afb667e74d1d26a8.tar.bz2
llvm-288967dfac246c8e35dc4f85afb667e74d1d26a8.tar.xz
Revert r153694. It was causing failures in the buildbots.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153701 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h')
-rw-r--r--lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h176
1 files changed, 146 insertions, 30 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
index 36566da57a..e0f7d54f43 100644
--- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
+++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
@@ -21,42 +21,158 @@ using namespace llvm;
namespace llvm {
class RuntimeDyldELF : public RuntimeDyldImpl {
-protected:
- void resolveX86_64Relocation(uint8_t *LocalAddress,
- uint64_t FinalAddress,
- uint64_t Value,
- uint32_t Type,
- int64_t Addend);
-
- void resolveX86Relocation(uint8_t *LocalAddress,
- uint32_t FinalAddress,
- uint32_t Value,
- uint32_t Type,
- int32_t Addend);
-
- void resolveARMRelocation(uint8_t *LocalAddress,
- uint32_t FinalAddress,
- uint32_t Value,
- uint32_t Type,
- int32_t Addend);
-
- virtual void resolveRelocation(uint8_t *LocalAddress,
- uint64_t FinalAddress,
- uint64_t Value,
- uint32_t Type,
- int64_t Addend);
-
- virtual void processRelocationRef(const ObjRelocationInfo &Rel,
- const ObjectFile &Obj,
- ObjSectionToIDMap &ObjSectionToID,
- LocalSymbolMap &Symbols, StubMap &Stubs);
+ // For each symbol, keep a list of relocations based on it. Anytime
+ // its address is reassigned (the JIT re-compiled the function, e.g.),
+ // the relocations get re-resolved.
+ struct RelocationEntry {
+ // Function or section this relocation is contained in.
+ std::string Target;
+ // Offset into the target function or section for the relocation.
+ uint32_t Offset;
+ // Relocation type
+ uint32_t Type;
+ // Addend encoded in the instruction itself, if any.
+ int32_t Addend;
+ // Has the relocation been recalcuated as an offset within a function?
+ bool IsFunctionRelative;
+ // Has this relocation been resolved previously?
+ bool isResolved;
+
+ RelocationEntry(StringRef t,
+ uint32_t offset,
+ uint32_t type,
+ int32_t addend,
+ bool isFunctionRelative)
+ : Target(t)
+ , Offset(offset)
+ , Type(type)
+ , Addend(addend)
+ , IsFunctionRelative(isFunctionRelative)
+ , isResolved(false) { }
+ };
+ typedef SmallVector<RelocationEntry, 4> RelocationList;
+ StringMap<RelocationList> Relocations;
+ unsigned Arch;
+
+ void resolveRelocations();
+
+ void resolveX86_64Relocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveX86Relocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveArmRelocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveRelocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+public:
+ RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
+
+ bool loadObject(MemoryBuffer *InputBuffer);
+
+ void reassignSymbolAddress(StringRef Name, uint8_t *Addr);
+ void reassignSectionAddress(unsigned SectionID, uint64_t Addr);
+
+ bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const;
+};
+
+} // end namespace llvm
+
+#endif
+
+//===-- RuntimeDyldELF.h - Run-time dynamic linker for MC-JIT ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// ELF support for MC-JIT runtime dynamic linker.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_RUNTIME_DYLD_ELF_H
+#define LLVM_RUNTIME_DYLD_ELF_H
+
+#include "RuntimeDyldImpl.h"
+
+using namespace llvm;
+
+
+namespace llvm {
+class RuntimeDyldELF : public RuntimeDyldImpl {
+ // For each symbol, keep a list of relocations based on it. Anytime
+ // its address is reassigned (the JIT re-compiled the function, e.g.),
+ // the relocations get re-resolved.
+ struct RelocationEntry {
+ // Function or section this relocation is contained in.
+ std::string Target;
+ // Offset into the target function or section for the relocation.
+ uint32_t Offset;
+ // Relocation type
+ uint32_t Type;
+ // Addend encoded in the instruction itself, if any.
+ int32_t Addend;
+ // Has the relocation been recalcuated as an offset within a function?
+ bool IsFunctionRelative;
+ // Has this relocation been resolved previously?
+ bool isResolved;
+
+ RelocationEntry(StringRef t,
+ uint32_t offset,
+ uint32_t type,
+ int32_t addend,
+ bool isFunctionRelative)
+ : Target(t)
+ , Offset(offset)
+ , Type(type)
+ , Addend(addend)
+ , IsFunctionRelative(isFunctionRelative)
+ , isResolved(false) { }
+ };
+ typedef SmallVector<RelocationEntry, 4> RelocationList;
+ StringMap<RelocationList> Relocations;
+ unsigned Arch;
+
+ void resolveRelocations();
+
+ void resolveX86_64Relocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveX86Relocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveArmRelocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
+
+ void resolveRelocation(StringRef Name,
+ uint8_t *Addr,
+ const RelocationEntry &RE);
public:
RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
+ bool loadObject(MemoryBuffer *InputBuffer);
+
+ void reassignSymbolAddress(StringRef Name, uint8_t *Addr);
+ void reassignSectionAddress(unsigned SectionID, uint64_t Addr);
+
bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const;
};
} // end namespace llvm
-#endif
+#endif
+