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

Unified Diff: courgette/assembly_program.cc

Issue 2462993003: [Courgette] Refactor: Add and use Instruction*Receptor classes; call ParseFile() in 2 passes. (Closed)
Patch Set: Make AssemblyProgram::CreateInstruction*Receptor() return CheckBool. Created 4 years, 1 month 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
Index: courgette/assembly_program.cc
diff --git a/courgette/assembly_program.cc b/courgette/assembly_program.cc
index d36556fc67ad4e90496a551ad5f7b32f51a6bedf..259141d2f1ba014b4863f5fd36a003850afda932 100644
--- a/courgette/assembly_program.cc
+++ b/courgette/assembly_program.cc
@@ -107,6 +107,120 @@ class InstructionWithLabelARM : public InstructionWithLabel {
} // namespace
+/******** InstructionReceptor ********/
+
+InstructionReceptor::InstructionReceptor() {}
+
+InstructionReceptor::~InstructionReceptor() {}
+
+/******** InstructionCountReceptor ********/
+
+InstructionCountReceptor::InstructionCountReceptor() : size_(0) {}
+
+InstructionCountReceptor::~InstructionCountReceptor() {}
+
+// TODO(huangs): Populate these with size_ += ...
grt (UTC plus 2) 2016/11/04 09:38:53 TODO when?
huangs 2016/11/04 18:20:39 The follow-up CL, which focuses on AssemblyProgram
+CheckBool InstructionCountReceptor::EmitPeRelocs() {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitElfRelocation() {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitElfARMRelocation() {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitOrigin(RVA rva) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitSingleByte(uint8_t byte) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitMultipleBytes(const uint8_t* value,
+ size_t len) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitRel32(Label* label) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitRel32ARM(uint16_t op,
+ Label* label,
+ const uint8_t* arm_op,
+ uint16_t op_size) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitAbs32(Label* label) {
+ return true;
+}
+
+CheckBool InstructionCountReceptor::EmitAbs64(Label* label) {
+ return true;
+}
+
+/******** InstructionStoreReceptor ********/
+
+// TODO(huangs): Populate these.
grt (UTC plus 2) 2016/11/04 09:38:53 when?
huangs 2016/11/04 18:20:39 Same.
+InstructionStoreReceptor::InstructionStoreReceptor(size_t init_size,
+ AssemblyProgram* program)
+ : program_(program) {
+ CHECK(program_ != nullptr);
grt (UTC plus 2) 2016/11/04 09:38:53 CHECK_NE(program_, nullptr);
huangs 2016/11/04 18:20:39 Should be consistent with later uses (DCHECK). Com
grt (UTC plus 2) 2016/11/07 09:36:17 I like the brief approach as well.
huangs 2016/11/07 19:46:52 Acknowledged.
+}
+
+InstructionStoreReceptor::~InstructionStoreReceptor() {}
+
+CheckBool InstructionStoreReceptor::EmitPeRelocs() {
+ return program_->EmitPeRelocs();
+}
+
+CheckBool InstructionStoreReceptor::EmitElfRelocation() {
+ return program_->EmitElfRelocation();
+}
+
+CheckBool InstructionStoreReceptor::EmitElfARMRelocation() {
+ return program_->EmitElfARMRelocation();
+}
+
+CheckBool InstructionStoreReceptor::EmitOrigin(RVA rva) {
+ return program_->EmitOrigin(rva);
+}
+
+CheckBool InstructionStoreReceptor::EmitSingleByte(uint8_t byte) {
+ return program_->EmitSingleByte(byte);
+}
+
+CheckBool InstructionStoreReceptor::EmitMultipleBytes(const uint8_t* value,
+ size_t len) {
+ return program_->EmitMultipleBytes(value, len);
+}
+
+CheckBool InstructionStoreReceptor::EmitRel32(Label* label) {
+ return program_->EmitRel32(label);
+}
+
+CheckBool InstructionStoreReceptor::EmitRel32ARM(uint16_t op,
+ Label* label,
+ const uint8_t* arm_op,
+ uint16_t op_size) {
+ return program_->EmitRel32ARM(op, label, arm_op, op_size);
+}
+
+CheckBool InstructionStoreReceptor::EmitAbs32(Label* label) {
+ return program_->EmitAbs32(label);
+}
+
+CheckBool InstructionStoreReceptor::EmitAbs64(Label* label) {
+ return program_->EmitAbs64(label);
+}
+
+/******** AssemblyProgram ********/
+
AssemblyProgram::AssemblyProgram(ExecutableType kind)
: kind_(kind), image_base_(0) {
}
@@ -123,28 +237,28 @@ AssemblyProgram::~AssemblyProgram() {
}
}
-CheckBool AssemblyProgram::EmitPeRelocsInstruction() {
+CheckBool AssemblyProgram::EmitPeRelocs() {
return Emit(ScopedInstruction(UncheckedNew<PeRelocsInstruction>()));
}
-CheckBool AssemblyProgram::EmitElfRelocationInstruction() {
+CheckBool AssemblyProgram::EmitElfRelocation() {
return Emit(ScopedInstruction(UncheckedNew<ElfRelocsInstruction>()));
}
-CheckBool AssemblyProgram::EmitElfARMRelocationInstruction() {
+CheckBool AssemblyProgram::EmitElfARMRelocation() {
return Emit(ScopedInstruction(UncheckedNew<ElfARMRelocsInstruction>()));
}
-CheckBool AssemblyProgram::EmitOriginInstruction(RVA rva) {
+CheckBool AssemblyProgram::EmitOrigin(RVA rva) {
return Emit(ScopedInstruction(UncheckedNew<OriginInstruction>(rva)));
}
-CheckBool AssemblyProgram::EmitByteInstruction(uint8_t byte) {
+CheckBool AssemblyProgram::EmitSingleByte(uint8_t byte) {
return EmitShared(GetByteInstruction(byte));
}
-CheckBool AssemblyProgram::EmitBytesInstruction(const uint8_t* values,
- size_t len) {
+CheckBool AssemblyProgram::EmitMultipleBytes(const uint8_t* values,
+ size_t len) {
return Emit(ScopedInstruction(UncheckedNew<BytesInstruction>(values, len)));
}
@@ -228,6 +342,26 @@ void AssemblyProgram::HandleInstructionLabels(
}
}
+CheckBool AssemblyProgram::CreateInstructionCountReceptor(
grt (UTC plus 2) 2016/11/04 09:38:53 why CheckBool rather than returning a pointer sinc
huangs 2016/11/04 18:20:39 For symmetry with CreateInstructionStoreReceptor()
grt (UTC plus 2) 2016/11/07 09:36:17 Ah. May fail in the future in a different CL. I'm
huangs 2016/11/07 19:46:52 Okay, thanks!
+ InstructionCountReceptor** ret) {
+ DCHECK(ret);
+ DCHECK(!count_receptor_);
+ count_receptor_.reset(new InstructionCountReceptor);
+ *ret = count_receptor_.get();
+ return true;
+}
+
+CheckBool AssemblyProgram::CreateInstructionStoreReceptor(
+ InstructionStoreReceptor** ret) {
+ DCHECK(ret);
+ DCHECK(count_receptor_);
+ DCHECK(!store_receptor_);
+ store_receptor_.reset(
+ new InstructionStoreReceptor(count_receptor_->size(), this));
+ *ret = store_receptor_.get();
+ return true;
+}
+
CheckBool AssemblyProgram::Emit(ScopedInstruction instruction) {
if (!instruction || !instructions_.push_back(instruction.get()))
return false;

Powered by Google App Engine
This is Rietveld 408576698