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; |