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

Side by Side Diff: courgette/encoded_program.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/encoded_program.h ('k') | courgette/encoded_program_fuzz_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/encoded_program.h" 5 #include "courgette/encoded_program.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 120
121 items->clear(); 121 items->clear();
122 bool ok = items->resize(count, 0); 122 bool ok = items->resize(count, 0);
123 if (ok && count != 0) { 123 if (ok && count != 0) {
124 size_t byte_count = count * sizeof(typename V::value_type); 124 size_t byte_count = count * sizeof(typename V::value_type);
125 return buffer->Read(static_cast<void*>(&((*items)[0])), byte_count); 125 return buffer->Read(static_cast<void*>(&((*items)[0])), byte_count);
126 } 126 }
127 return ok; 127 return ok;
128 } 128 }
129 129
130 /******** InstructionStoreReceptor ********/
131
132 // An InstructionReceptor that stores emitted instructions.
133 class InstructionStoreReceptor : public InstructionReceptor {
134 public:
135 explicit InstructionStoreReceptor(ExecutableType exe_type,
136 EncodedProgram* encoded)
137 : exe_type_(exe_type), encoded_(encoded) {
138 CHECK(encoded_);
139 }
140
141 CheckBool EmitPeRelocs() override {
142 return encoded_->AddPeMakeRelocs(exe_type_);
143 }
144 CheckBool EmitElfRelocation() override {
145 return encoded_->AddElfMakeRelocs();
146 }
147 CheckBool EmitElfARMRelocation() override {
148 return encoded_->AddElfARMMakeRelocs();
149 }
150 CheckBool EmitOrigin(RVA rva) override { return encoded_->AddOrigin(rva); }
151 CheckBool EmitSingleByte(uint8_t byte) override {
152 return encoded_->AddCopy(1, &byte);
153 }
154 CheckBool EmitMultipleBytes(const uint8_t* bytes, size_t len) override {
155 return encoded_->AddCopy(len, bytes);
156 }
157 CheckBool EmitRel32(Label* label) override {
158 return encoded_->AddRel32(label->index_);
159 }
160 CheckBool EmitRel32ARM(uint16_t op,
161 Label* label,
162 const uint8_t* arm_op,
163 uint16_t op_size) override {
164 return encoded_->AddRel32ARM(op, label->index_);
165 }
166 CheckBool EmitAbs32(Label* label) override {
167 return encoded_->AddAbs32(label->index_);
168 }
169 CheckBool EmitAbs64(Label* label) override {
170 return encoded_->AddAbs64(label->index_);
171 }
172
173 private:
174 ExecutableType exe_type_;
175 EncodedProgram* encoded_;
176
177 DISALLOW_COPY_AND_ASSIGN(InstructionStoreReceptor);
178 };
179
130 } // namespace 180 } // namespace
131 181
132 //////////////////////////////////////////////////////////////////////////////// 182 ////////////////////////////////////////////////////////////////////////////////
133 183
134 // Constructor is here rather than in the header. Although the constructor 184 // Constructor is here rather than in the header. Although the constructor
135 // appears to do nothing it is fact quite large because of the implicit calls to 185 // appears to do nothing it is fact quite large because of the implicit calls to
136 // field constructors. Ditto for the destructor. 186 // field constructors. Ditto for the destructor.
137 EncodedProgram::EncodedProgram() {} 187 EncodedProgram::EncodedProgram() {}
138 EncodedProgram::~EncodedProgram() {} 188 EncodedProgram::~EncodedProgram() {}
139 189
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 if (ix_copy_bytes != copy_bytes_.size()) 716 if (ix_copy_bytes != copy_bytes_.size())
667 return false; 717 return false;
668 if (ix_abs32_ix != abs32_ix_.size()) 718 if (ix_abs32_ix != abs32_ix_.size())
669 return false; 719 return false;
670 if (ix_rel32_ix != rel32_ix_.size()) 720 if (ix_rel32_ix != rel32_ix_.size())
671 return false; 721 return false;
672 722
673 return true; 723 return true;
674 } 724 }
675 725
726 CheckBool EncodedProgram::GenerateInstructions(
727 ExecutableType exe_type,
728 const InstructionGenerator& gen) {
729 InstructionStoreReceptor store_receptor(exe_type, this);
730 return gen.Run(&store_receptor);
731 }
732
676 // RelocBlock has the layout of a block of relocations in the base relocation 733 // RelocBlock has the layout of a block of relocations in the base relocation
677 // table file format. 734 // table file format.
678 struct RelocBlockPOD { 735 struct RelocBlockPOD {
679 uint32_t page_rva; 736 uint32_t page_rva;
680 uint32_t block_size; 737 uint32_t block_size;
681 uint16_t relocs[4096]; // Allow up to one relocation per byte of a 4k page. 738 uint16_t relocs[4096]; // Allow up to one relocation per byte of a 4k page.
682 }; 739 };
683 740
684 static_assert(offsetof(RelocBlockPOD, relocs) == 8, "reloc block header size"); 741 static_assert(offsetof(RelocBlockPOD, relocs) == 8, "reloc block header size");
685 742
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 } 862 }
806 863
807 Status Assemble(EncodedProgram* encoded, SinkStream* buffer) { 864 Status Assemble(EncodedProgram* encoded, SinkStream* buffer) {
808 bool assembled = encoded->AssembleTo(buffer); 865 bool assembled = encoded->AssembleTo(buffer);
809 if (assembled) 866 if (assembled)
810 return C_OK; 867 return C_OK;
811 return C_ASSEMBLY_FAILED; 868 return C_ASSEMBLY_FAILED;
812 } 869 }
813 870
814 } // namespace courgette 871 } // namespace courgette
OLDNEW
« no previous file with comments | « courgette/encoded_program.h ('k') | courgette/encoded_program_fuzz_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698