mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
daf061cf05
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213698 91177308-0d34-0410-b5e6-96231b3b80d8
77 lines
2.7 KiB
C++
77 lines
2.7 KiB
C++
//===---- ObjectImage.h - Format independent executuable object image -----===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares a file format independent ObjectImage class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_EXECUTIONENGINE_OBJECTIMAGE_H
|
|
#define LLVM_EXECUTIONENGINE_OBJECTIMAGE_H
|
|
|
|
#include "llvm/ExecutionEngine/ObjectBuffer.h"
|
|
#include "llvm/Object/ObjectFile.h"
|
|
|
|
namespace llvm {
|
|
|
|
|
|
/// ObjectImage - A container class that represents an ObjectFile that has been
|
|
/// or is in the process of being loaded into memory for execution.
|
|
class ObjectImage {
|
|
ObjectImage() LLVM_DELETED_FUNCTION;
|
|
ObjectImage(const ObjectImage &other) LLVM_DELETED_FUNCTION;
|
|
virtual void anchor();
|
|
|
|
protected:
|
|
std::unique_ptr<ObjectBuffer> Buffer;
|
|
|
|
public:
|
|
ObjectImage(ObjectBuffer *Input) : Buffer(Input) {}
|
|
virtual ~ObjectImage() {}
|
|
|
|
virtual object::symbol_iterator begin_symbols() const = 0;
|
|
virtual object::symbol_iterator end_symbols() const = 0;
|
|
iterator_range<object::symbol_iterator> symbols() const {
|
|
return iterator_range<object::symbol_iterator>(begin_symbols(),
|
|
end_symbols());
|
|
}
|
|
|
|
virtual object::section_iterator begin_sections() const = 0;
|
|
virtual object::section_iterator end_sections() const = 0;
|
|
iterator_range<object::section_iterator> sections() const {
|
|
return iterator_range<object::section_iterator>(begin_sections(),
|
|
end_sections());
|
|
}
|
|
|
|
virtual /* Triple::ArchType */ unsigned getArch() const = 0;
|
|
|
|
// Return the name associated with this ObjectImage.
|
|
// This is usually the name of the file or MemoryBuffer that the the
|
|
// ObjectBuffer was constructed from.
|
|
StringRef getImageName() const { return Buffer->getBufferIdentifier(); }
|
|
|
|
// Subclasses can override these methods to update the image with loaded
|
|
// addresses for sections and common symbols
|
|
virtual void updateSectionAddress(const object::SectionRef &Sec,
|
|
uint64_t Addr) = 0;
|
|
virtual void updateSymbolAddress(const object::SymbolRef &Sym,
|
|
uint64_t Addr) = 0;
|
|
|
|
virtual StringRef getData() const = 0;
|
|
|
|
virtual object::ObjectFile* getObjectFile() const = 0;
|
|
|
|
// Subclasses can override these methods to provide JIT debugging support
|
|
virtual void registerWithDebugger() = 0;
|
|
virtual void deregisterWithDebugger() = 0;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_EXECUTIONENGINE_OBJECTIMAGE_H
|