Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Side by Side Diff: courgette/disassembler.cc

Issue 2854113002: [Courgette] Reduce AssemblyProgram to reduce Courgette-apply RAM floor and disk churn. (Closed)
Patch Set: Update courgette_fuzzer in libfuzzer. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « courgette/disassembler.h ('k') | courgette/disassembler_elf_32_x86_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "courgette/disassembler.h" 5 #include "courgette/disassembler.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "courgette/assembly_program.h" 9 #include "courgette/assembly_program.h"
10 #include "courgette/encoded_program.h"
10 11
11 namespace courgette { 12 namespace courgette {
12 13
13 Disassembler::RvaVisitor_Abs32::RvaVisitor_Abs32( 14 Disassembler::RvaVisitor_Abs32::RvaVisitor_Abs32(
14 const std::vector<RVA>& rva_locations, 15 const std::vector<RVA>& rva_locations,
15 const AddressTranslator& translator) 16 const AddressTranslator& translator)
16 : VectorRvaVisitor<RVA>(rva_locations), translator_(translator) { 17 : VectorRvaVisitor<RVA>(rva_locations), translator_(translator) {
17 } 18 }
18 19
19 RVA Disassembler::RvaVisitor_Abs32::Get() const { 20 RVA Disassembler::RvaVisitor_Abs32::Get() const {
(...skipping 27 matching lines...) Expand all
47 } 48 }
48 49
49 const uint8_t* Disassembler::RVAToPointer(RVA rva) const { 50 const uint8_t* Disassembler::RVAToPointer(RVA rva) const {
50 FileOffset file_offset = RVAToFileOffset(rva); 51 FileOffset file_offset = RVAToFileOffset(rva);
51 if (file_offset == kNoFileOffset) 52 if (file_offset == kNoFileOffset)
52 return nullptr; 53 return nullptr;
53 54
54 return FileOffsetToPointer(file_offset); 55 return FileOffsetToPointer(file_offset);
55 } 56 }
56 57
57 std::unique_ptr<AssemblyProgram> Disassembler::Disassemble( 58 std::unique_ptr<AssemblyProgram> Disassembler::CreateProgram(bool annotate) {
58 bool annotate_labels) {
59 if (!ok() || !ExtractAbs32Locations() || !ExtractRel32Locations()) 59 if (!ok() || !ExtractAbs32Locations() || !ExtractRel32Locations())
60 return nullptr; 60 return nullptr;
61 61
62 std::unique_ptr<AssemblyProgram> program = 62 std::unique_ptr<AssemblyProgram> program =
63 base::MakeUnique<AssemblyProgram>(kind(), image_base()); 63 base::MakeUnique<AssemblyProgram>(kind(), image_base());
64 64
65 PrecomputeLabels(program.get()); 65 PrecomputeLabels(program.get());
66 RemoveUnusedRel32Locations(program.get()); 66 RemoveUnusedRel32Locations(program.get());
67 program->DefaultAssignIndexes();
67 68
68 if (!program->GenerateInstructions(GetInstructionGenerator(program.get()), 69 if (annotate) {
69 annotate_labels)) { 70 if (!program->AnnotateLabels(GetInstructionGenerator(program.get())))
70 return nullptr; 71 return nullptr;
71 } 72 }
72 73
73 program->DefaultAssignIndexes();
74 return program; 74 return program;
75 } 75 }
76 76
77 Status Disassembler::DisassembleAndEncode(AssemblyProgram* program,
78 EncodedProgram* encoded) {
79 program->PrepareEncodedProgram(encoded);
80 return encoded->GenerateInstructions(program->kind(),
81 GetInstructionGenerator(program))
82 ? C_OK
83 : C_DISASSEMBLY_FAILED;
84 }
85
77 bool Disassembler::Good() { 86 bool Disassembler::Good() {
78 failure_reason_ = nullptr; 87 failure_reason_ = nullptr;
79 return true; 88 return true;
80 } 89 }
81 90
82 bool Disassembler::Bad(const char* reason) { 91 bool Disassembler::Bad(const char* reason) {
83 failure_reason_ = reason; 92 failure_reason_ = reason;
84 return false; 93 return false;
85 } 94 }
86 95
87 void Disassembler::PrecomputeLabels(AssemblyProgram* program) { 96 void Disassembler::PrecomputeLabels(AssemblyProgram* program) {
88 std::unique_ptr<RvaVisitor> abs32_visitor(CreateAbs32TargetRvaVisitor()); 97 std::unique_ptr<RvaVisitor> abs32_visitor(CreateAbs32TargetRvaVisitor());
89 std::unique_ptr<RvaVisitor> rel32_visitor(CreateRel32TargetRvaVisitor()); 98 std::unique_ptr<RvaVisitor> rel32_visitor(CreateRel32TargetRvaVisitor());
90 program->PrecomputeLabels(abs32_visitor.get(), rel32_visitor.get()); 99 program->PrecomputeLabels(abs32_visitor.get(), rel32_visitor.get());
91 } 100 }
92 101
93 void Disassembler::ReduceLength(size_t reduced_length) { 102 void Disassembler::ReduceLength(size_t reduced_length) {
94 CHECK_LE(reduced_length, length_); 103 CHECK_LE(reduced_length, length_);
95 length_ = reduced_length; 104 length_ = reduced_length;
96 end_ = start_ + length_; 105 end_ = start_ + length_;
97 } 106 }
98 107
99 } // namespace courgette 108 } // namespace courgette
OLDNEW
« no previous file with comments | « courgette/disassembler.h ('k') | courgette/disassembler_elf_32_x86_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698