| Index: courgette/disassembler.cc
|
| diff --git a/courgette/disassembler.cc b/courgette/disassembler.cc
|
| index 9b58ba0815736a89e2ea8ff12e8f47e17fc07dee..baa3b1f8c780338f4750d63e8cbda29fb6e66d8b 100644
|
| --- a/courgette/disassembler.cc
|
| +++ b/courgette/disassembler.cc
|
| @@ -4,10 +4,35 @@
|
|
|
| #include "courgette/disassembler.h"
|
|
|
| +#include <memory>
|
| +
|
| #include "base/logging.h"
|
| +#include "courgette/assembly_program.h"
|
|
|
| namespace courgette {
|
|
|
| +Disassembler::RvaVisitor_Abs32::RvaVisitor_Abs32(
|
| + const std::vector<RVA>& rva_locations,
|
| + const AddressTranslator& translator)
|
| + : VectorRvaVisitor<RVA>(rva_locations), translator_(translator) {
|
| +}
|
| +
|
| +RVA Disassembler::RvaVisitor_Abs32::Get() const {
|
| + // For Abs32 targets, get target RVA from architecture-dependent functions.
|
| + return translator_.PointerToTargetRVA(translator_.RVAToPointer(*it_));
|
| +}
|
| +
|
| +Disassembler::RvaVisitor_Rel32::RvaVisitor_Rel32(
|
| + const std::vector<RVA>& rva_locations,
|
| + const AddressTranslator& translator)
|
| + : VectorRvaVisitor<RVA>(rva_locations), translator_(translator) {
|
| +}
|
| +
|
| +RVA Disassembler::RvaVisitor_Rel32::Get() const {
|
| + // For Rel32 targets, only handle 32-bit offsets.
|
| + return *it_ + 4 + Read32LittleEndian(translator_.RVAToPointer(*it_));
|
| +}
|
| +
|
| Disassembler::Disassembler(const void* start, size_t length)
|
| : failure_reason_("uninitialized") {
|
| start_ = reinterpret_cast<const uint8_t*>(start);
|
| @@ -40,6 +65,12 @@ bool Disassembler::Bad(const char* reason) {
|
| return false;
|
| }
|
|
|
| +void Disassembler::PrecomputeLabels(AssemblyProgram* program) {
|
| + std::unique_ptr<RvaVisitor> abs32_visitor(CreateAbs32TargetRvaVisitor());
|
| + std::unique_ptr<RvaVisitor> rel32_visitor(CreateRel32TargetRvaVisitor());
|
| + program->PrecomputeLabels(abs32_visitor.get(), rel32_visitor.get());
|
| +}
|
| +
|
| void Disassembler::ReduceLength(size_t reduced_length) {
|
| CHECK_LE(reduced_length, length_);
|
| length_ = reduced_length;
|
|
|