| Index: courgette/adjustment_method_2.cc
|
| diff --git a/courgette/adjustment_method_2.cc b/courgette/adjustment_method_2.cc
|
| index d783cdac81079969af84965c1be13cfc2411d58e..358e621e071255ab3dbaf9fd8106eaa0a2625d72 100644
|
| --- a/courgette/adjustment_method_2.cc
|
| +++ b/courgette/adjustment_method_2.cc
|
| @@ -15,6 +15,7 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "base/bind.h"
|
| #include "base/format_macros.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| @@ -1252,16 +1253,17 @@ class Adjuster : public AdjustmentMethod {
|
| void CollectTraces(const AssemblyProgram* program, Trace* abs32, Trace* rel32,
|
| bool is_model) {
|
| label_info_maker_.ResetDebugLabel();
|
| - const InstructionVector& instructions = program->instructions();
|
| - for (size_t i = 0; i < instructions.size(); ++i) {
|
| - Instruction* instruction = instructions[i];
|
| - if (Label* label = program->InstructionAbs32Label(instruction))
|
| - ReferenceLabel(abs32, label, is_model);
|
| - if (Label* label = program->InstructionAbs64Label(instruction))
|
| - ReferenceLabel(abs32, label, is_model);
|
| - if (Label* label = program->InstructionRel32Label(instruction))
|
| - ReferenceLabel(rel32, label, is_model);
|
| - }
|
| +
|
| + AssemblyProgram::LabelHandler abs32_handler = base::Bind(
|
| + &Adjuster::ReferenceLabel, base::Unretained(this), abs32, is_model);
|
| + AssemblyProgram::LabelHandler rel32_handler = base::Bind(
|
| + &Adjuster::ReferenceLabel, base::Unretained(this), rel32, is_model);
|
| +
|
| + program->DispatchInstructionLabels({{ABS32, abs32_handler},
|
| + {ABS64, abs32_handler},
|
| + {REL32, rel32_handler},
|
| + {REL32ARM, rel32_handler}});
|
| +
|
| // TODO(sra): we could simply append all the labels in index order to
|
| // incorporate some costing for entropy (bigger deltas) that will be
|
| // introduced into the label address table by non-monotonic ordering. This
|
| @@ -1277,7 +1279,7 @@ class Adjuster : public AdjustmentMethod {
|
| << (base::Time::Now() - start_time).InSecondsF();
|
| }
|
|
|
| - void ReferenceLabel(Trace* trace, Label* label, bool is_model) {
|
| + void ReferenceLabel(Trace* trace, bool is_model, Label* label) {
|
| trace->push_back(label_info_maker_.MakeLabelInfo(
|
| label, is_model, static_cast<uint32_t>(trace->size())));
|
| }
|
|
|