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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « courgette/encoded_program.h ('k') | courgette/encoded_program_fuzz_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: courgette/encoded_program.cc
diff --git a/courgette/encoded_program.cc b/courgette/encoded_program.cc
index 5e84ec34074ae1715fc28e2286e267b9b3b9bb2d..c50297829fea2e799ac2289471d8045ad2eaae85 100644
--- a/courgette/encoded_program.cc
+++ b/courgette/encoded_program.cc
@@ -127,6 +127,56 @@ bool ReadVectorU8(V* items, SourceStream* buffer) {
return ok;
}
+/******** InstructionStoreReceptor ********/
+
+// An InstructionReceptor that stores emitted instructions.
+class InstructionStoreReceptor : public InstructionReceptor {
+ public:
+ explicit InstructionStoreReceptor(ExecutableType exe_type,
+ EncodedProgram* encoded)
+ : exe_type_(exe_type), encoded_(encoded) {
+ CHECK(encoded_);
+ }
+
+ CheckBool EmitPeRelocs() override {
+ return encoded_->AddPeMakeRelocs(exe_type_);
+ }
+ CheckBool EmitElfRelocation() override {
+ return encoded_->AddElfMakeRelocs();
+ }
+ CheckBool EmitElfARMRelocation() override {
+ return encoded_->AddElfARMMakeRelocs();
+ }
+ CheckBool EmitOrigin(RVA rva) override { return encoded_->AddOrigin(rva); }
+ CheckBool EmitSingleByte(uint8_t byte) override {
+ return encoded_->AddCopy(1, &byte);
+ }
+ CheckBool EmitMultipleBytes(const uint8_t* bytes, size_t len) override {
+ return encoded_->AddCopy(len, bytes);
+ }
+ CheckBool EmitRel32(Label* label) override {
+ return encoded_->AddRel32(label->index_);
+ }
+ CheckBool EmitRel32ARM(uint16_t op,
+ Label* label,
+ const uint8_t* arm_op,
+ uint16_t op_size) override {
+ return encoded_->AddRel32ARM(op, label->index_);
+ }
+ CheckBool EmitAbs32(Label* label) override {
+ return encoded_->AddAbs32(label->index_);
+ }
+ CheckBool EmitAbs64(Label* label) override {
+ return encoded_->AddAbs64(label->index_);
+ }
+
+ private:
+ ExecutableType exe_type_;
+ EncodedProgram* encoded_;
+
+ DISALLOW_COPY_AND_ASSIGN(InstructionStoreReceptor);
+};
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -673,6 +723,13 @@ CheckBool EncodedProgram::AssembleTo(SinkStream* final_buffer) {
return true;
}
+CheckBool EncodedProgram::GenerateInstructions(
+ ExecutableType exe_type,
+ const InstructionGenerator& gen) {
+ InstructionStoreReceptor store_receptor(exe_type, this);
+ return gen.Run(&store_receptor);
+}
+
// RelocBlock has the layout of a block of relocations in the base relocation
// table file format.
struct RelocBlockPOD {
« 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