Index: courgette/disassembler.cc |
diff --git a/courgette/disassembler.cc b/courgette/disassembler.cc |
index 9407f6dae6a871e06319b9ac3e0d77e86ba33d99..31c23f1f64020c67c78abccf011103517922b76a 100644 |
--- a/courgette/disassembler.cc |
+++ b/courgette/disassembler.cc |
@@ -4,9 +4,8 @@ |
#include "courgette/disassembler.h" |
-#include <memory> |
- |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "courgette/assembly_program.h" |
namespace courgette { |
@@ -38,9 +37,9 @@ Disassembler::Disassembler(const uint8_t* start, size_t length) |
start_ = start; |
length_ = length; |
end_ = start_ + length_; |
-}; |
+} |
-Disassembler::~Disassembler() {}; |
+Disassembler::~Disassembler() {} |
const uint8_t* Disassembler::FileOffsetToPointer(FileOffset file_offset) const { |
CHECK_LE(file_offset, static_cast<FileOffset>(end_ - start_)); |
@@ -55,6 +54,23 @@ const uint8_t* Disassembler::RVAToPointer(RVA rva) const { |
return FileOffsetToPointer(file_offset); |
} |
+std::unique_ptr<AssemblyProgram> Disassembler::Disassemble() { |
+ if (!ok() || !ExtractAbs32Locations() || !ExtractRel32Locations()) |
+ return nullptr; |
+ |
+ std::unique_ptr<AssemblyProgram> program = |
+ base::MakeUnique<AssemblyProgram>(kind(), image_base()); |
+ |
+ PrecomputeLabels(program.get()); |
+ RemoveUnusedRel32Locations(program.get()); |
+ |
+ if (!program->GenerateInstructions(GetInstructionGenerator(program.get()))) |
+ return nullptr; |
+ |
+ program->DefaultAssignIndexes(); |
+ return program; |
+} |
+ |
bool Disassembler::Good() { |
failure_reason_ = nullptr; |
return true; |