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