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

Unified Diff: courgette/assembly_program.cc

Issue 1935203002: [Courgette] Using LabelManager to reduce Courgette-apply peak RAM by 25%. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync. Created 4 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/assembly_program.h ('k') | courgette/courgette.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: courgette/assembly_program.cc
diff --git a/courgette/assembly_program.cc b/courgette/assembly_program.cc
index 5344cff95f84868f83c670b143b88f9fef736564..f20ed67ea3fa3e6a462f7d99e49153b7eec3d22c 100644
--- a/courgette/assembly_program.cc
+++ b/courgette/assembly_program.cc
@@ -111,11 +111,6 @@ AssemblyProgram::AssemblyProgram(ExecutableType kind)
: kind_(kind), image_base_(0) {
}
-static void DeleteContainedLabels(const RVAToLabel& labels) {
- for (RVAToLabel::const_iterator p = labels.begin(); p != labels.end(); ++p)
- UncheckedDelete(p->second);
-}
-
AssemblyProgram::~AssemblyProgram() {
for (size_t i = 0; i < instructions_.size(); ++i) {
Instruction* instruction = instructions_[i];
@@ -126,8 +121,6 @@ AssemblyProgram::~AssemblyProgram() {
for (size_t i = 0; i < 256; ++i)
UncheckedDelete(byte_instruction_cache_[i]);
}
- DeleteContainedLabels(rel32_labels_);
- DeleteContainedLabels(abs32_labels_);
}
CheckBool AssemblyProgram::EmitPeRelocsInstruction() {
@@ -178,27 +171,50 @@ CheckBool AssemblyProgram::EmitAbs64(Label* label) {
ScopedInstruction(UncheckedNew<InstructionWithLabel>(ABS64, label)));
}
-Label* AssemblyProgram::FindOrMakeAbs32Label(RVA rva) {
- return FindLabel(rva, &abs32_labels_);
+void AssemblyProgram::PrecomputeLabels(RvaVisitor* abs32_visitor,
+ RvaVisitor* rel32_visitor) {
+ abs32_label_manager_.Read(abs32_visitor);
+ rel32_label_manager_.Read(rel32_visitor);
+ TrimLabels();
}
-Label* AssemblyProgram::FindOrMakeRel32Label(RVA rva) {
- return FindLabel(rva, &rel32_labels_);
-}
+// Chosen empirically to give the best reduction in payload size for
+// an update from daisy_3701.98.0 to daisy_4206.0.0.
+const int AssemblyProgram::kLabelLowerLimit = 5;
-void AssemblyProgram::DefaultAssignIndexes() {
- DefaultAssignIndexes(&abs32_labels_);
- DefaultAssignIndexes(&rel32_labels_);
+void AssemblyProgram::TrimLabels() {
+ // For now only trim for ARM binaries.
+ if (kind() != EXE_ELF_32_ARM)
+ return;
+
+ int lower_limit = kLabelLowerLimit;
+
+ VLOG(1) << "TrimLabels: threshold " << lower_limit;
+
+ rel32_label_manager_.RemoveUnderusedLabels(lower_limit);
}
void AssemblyProgram::UnassignIndexes() {
- UnassignIndexes(&abs32_labels_);
- UnassignIndexes(&rel32_labels_);
+ abs32_label_manager_.UnassignIndexes();
+ rel32_label_manager_.UnassignIndexes();
+}
+
+void AssemblyProgram::DefaultAssignIndexes() {
+ abs32_label_manager_.DefaultAssignIndexes();
+ rel32_label_manager_.DefaultAssignIndexes();
}
void AssemblyProgram::AssignRemainingIndexes() {
- AssignRemainingIndexes(&abs32_labels_);
- AssignRemainingIndexes(&rel32_labels_);
+ abs32_label_manager_.AssignRemainingIndexes();
+ rel32_label_manager_.AssignRemainingIndexes();
+}
+
+Label* AssemblyProgram::FindAbs32Label(RVA rva) {
+ return abs32_label_manager_.Find(rva);
+}
+
+Label* AssemblyProgram::FindRel32Label(RVA rva) {
+ return rel32_label_manager_.Find(rva);
}
Label* AssemblyProgram::InstructionAbs32Label(
@@ -238,17 +254,6 @@ CheckBool AssemblyProgram::EmitShared(Instruction* instruction) {
return instruction && instructions_.push_back(instruction);
}
-Label* AssemblyProgram::FindLabel(RVA rva, RVAToLabel* labels) {
- Label*& slot = (*labels)[rva];
- if (slot == NULL) {
- slot = UncheckedNew<Label>(rva);
- if (slot == NULL)
- return NULL;
- }
- slot->count_++;
- return slot;
-}
-
void AssemblyProgram::UnassignIndexes(RVAToLabel* labels) {
for (RVAToLabel::iterator p = labels->begin(); p != labels->end(); ++p) {
Label* current = p->second;
@@ -367,7 +372,7 @@ std::unique_ptr<EncodedProgram> AssemblyProgram::Encode() const {
encoded->set_image_base(image_base_);
- if (!encoded->DefineLabels(abs32_labels_, rel32_labels_))
+ if (!encoded->ImportLabels(abs32_label_manager_, rel32_label_manager_))
return nullptr;
for (size_t i = 0; i < instructions_.size(); ++i) {
@@ -470,61 +475,6 @@ Instruction* AssemblyProgram::GetByteInstruction(uint8_t byte) {
return byte_instruction_cache_[byte];
}
-// Chosen empirically to give the best reduction in payload size for
-// an update from daisy_3701.98.0 to daisy_4206.0.0.
-const int AssemblyProgram::kLabelLowerLimit = 5;
-
-CheckBool AssemblyProgram::TrimLabels() {
- // For now only trim for ARM binaries.
- if (kind() != EXE_ELF_32_ARM)
- return true;
-
- int lower_limit = kLabelLowerLimit;
-
- VLOG(1) << "TrimLabels: threshold " << lower_limit;
-
- // Walk through the list of instructions, replacing trimmed labels
- // with the original machine instruction.
- for (size_t i = 0; i < instructions_.size(); ++i) {
- Instruction* instruction = instructions_[i];
- switch (instruction->op()) {
- case REL32ARM: {
- Label* label =
- static_cast<InstructionWithLabelARM*>(instruction)->label();
- if (label->count_ <= lower_limit) {
- const uint8_t* arm_op =
- static_cast<InstructionWithLabelARM*>(instruction)->arm_op();
- uint16_t op_size =
- static_cast<InstructionWithLabelARM*>(instruction)->op_size();
-
- if (op_size < 1)
- return false;
- UncheckedDelete(instruction);
- instructions_[i] = UncheckedNew<BytesInstruction>(arm_op, op_size);
- if (!instructions_[i])
- return false;
- }
- break;
- }
- default:
- break;
- }
- }
-
- // Remove and deallocate underused Labels.
- RVAToLabel::iterator it = rel32_labels_.begin();
- while (it != rel32_labels_.end()) {
- if (it->second->count_ <= lower_limit) {
- UncheckedDelete(it->second);
- rel32_labels_.erase(it++);
- } else {
- ++it;
- }
- }
-
- return true;
-}
-
////////////////////////////////////////////////////////////////////////////////
Status Encode(const AssemblyProgram& program,
« no previous file with comments | « courgette/assembly_program.h ('k') | courgette/courgette.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698