mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 00:20:25 +00:00
Make it easier to use DwarfContext with MCJIT
Summary: This supersedes http://reviews.llvm.org/D4010, hopefully properly dealing with the JIT case and also adds an actual test case. DwarfContext was basically already usable for the JIT (and back when we were overwriting ELF files it actually worked out of the box by accident), but in order to resolve relocations correctly it needs to know the load address of the section. Rather than trying to get this out of the ObjectFile or requiring the user to create a new ObjectFile just to get some debug info, this adds the capability to pass in that info directly. As part of this I separated out part of the LoadedObjectInfo struct from RuntimeDyld, since it is now required at a higher layer. Reviewers: lhames, echristo Reviewed By: echristo Subscribers: vtjnash, friss, rafael, llvm-commits Differential Revision: http://reviews.llvm.org/D6961 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237961 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -136,6 +136,43 @@ private:
|
||||
const DIContextKind Kind;
|
||||
};
|
||||
|
||||
/// An inferface for inquiring the load address of a loaded object file
|
||||
/// to be used by the DIContext implementations when applying relocations
|
||||
/// on the fly.
|
||||
class LoadedObjectInfo {
|
||||
public:
|
||||
LoadedObjectInfo() {}
|
||||
virtual ~LoadedObjectInfo() {}
|
||||
|
||||
/// Obtain the Load Address of a section by Name.
|
||||
///
|
||||
/// Calculate the address of the section identified by the passed in Name.
|
||||
/// The section need not be present in the local address space. The addresses
|
||||
/// need to be consistent with the addresses used to query the DIContext and
|
||||
/// the output of this function should be deterministic, i.e. repeated calls with
|
||||
/// the same Name should give the same address.
|
||||
virtual uint64_t getSectionLoadAddress(StringRef Name) const = 0;
|
||||
|
||||
/// If conveniently available, return the content of the given Section.
|
||||
///
|
||||
/// When the section is available in the local address space, in relocated (loaded)
|
||||
/// form, e.g. because it was relocated by a JIT for execution, this function
|
||||
/// should provide the contents of said section in `Data`. If the loaded section
|
||||
/// is not available, or the cost of retrieving it would be prohibitive, this
|
||||
/// function should return false. In that case, relocations will be read from the
|
||||
/// local (unrelocated) object file and applied on the fly. Note that this method
|
||||
/// is used purely for optimzation purposes in the common case of JITting in the
|
||||
/// local address space, so returning false should always be correct.
|
||||
virtual bool getLoadedSectionContents(StringRef Name, StringRef &Data) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Obtain a copy of this LoadedObjectInfo.
|
||||
///
|
||||
/// The caller is responsible for deallocation once the copy is no longer required.
|
||||
virtual LoadedObjectInfo *clone() const = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -255,7 +255,8 @@ class DWARFContextInMemory : public DWARFContext {
|
||||
SmallVector<SmallString<32>, 4> UncompressedSections;
|
||||
|
||||
public:
|
||||
DWARFContextInMemory(const object::ObjectFile &Obj);
|
||||
DWARFContextInMemory(const object::ObjectFile &Obj,
|
||||
const LoadedObjectInfo *L = nullptr);
|
||||
bool isLittleEndian() const override { return IsLittleEndian; }
|
||||
uint8_t getAddressSize() const override { return AddressSize; }
|
||||
const DWARFSection &getInfoSection() override { return InfoSection; }
|
||||
|
||||
Reference in New Issue
Block a user