OLD | NEW |
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/adjustment_method.h" | 5 #include "courgette/adjustment_method.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> |
11 #include <list> | 11 #include <list> |
12 #include <map> | 12 #include <map> |
13 #include <set> | 13 #include <set> |
14 #include <string> | 14 #include <string> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/bind.h" | |
18 #include "base/logging.h" | 17 #include "base/logging.h" |
19 #include "base/macros.h" | 18 #include "base/macros.h" |
20 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
21 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
22 #include "courgette/assembly_program.h" | 21 #include "courgette/assembly_program.h" |
23 #include "courgette/courgette.h" | 22 #include "courgette/courgette.h" |
24 #include "courgette/encoded_program.h" | 23 #include "courgette/encoded_program.h" |
25 | 24 |
26 namespace courgette { | 25 namespace courgette { |
27 | 26 |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 CollectTraces(prog_, &prog_abs32_, &prog_rel32_, false); | 587 CollectTraces(prog_, &prog_abs32_, &prog_rel32_, false); |
589 Solve(model_abs32_, prog_abs32_); | 588 Solve(model_abs32_, prog_abs32_); |
590 Solve(model_rel32_, prog_rel32_); | 589 Solve(model_rel32_, prog_rel32_); |
591 prog_->AssignRemainingIndexes(); | 590 prog_->AssignRemainingIndexes(); |
592 return true; | 591 return true; |
593 } | 592 } |
594 | 593 |
595 private: | 594 private: |
596 void CollectTraces(const AssemblyProgram* program, Trace* abs32, Trace* rel32, | 595 void CollectTraces(const AssemblyProgram* program, Trace* abs32, Trace* rel32, |
597 bool is_model) { | 596 bool is_model) { |
598 AssemblyProgram::LabelHandler abs32_handler = | 597 for (Label* label : program->abs32_label_annotations()) |
599 base::Bind(&GraphAdjuster::ReferenceLabel, base::Unretained(this), | 598 ReferenceLabel(abs32, is_model, label); |
600 abs32, is_model); | 599 for (Label* label : program->rel32_label_annotations()) |
601 AssemblyProgram::LabelHandler rel32_handler = | 600 ReferenceLabel(rel32, is_model, label); |
602 base::Bind(&GraphAdjuster::ReferenceLabel, base::Unretained(this), | |
603 rel32, is_model); | |
604 | |
605 program->HandleInstructionLabels({{ABS32, abs32_handler}, | |
606 {REL32, rel32_handler}, | |
607 {REL32ARM, rel32_handler}}); | |
608 | 601 |
609 // TODO(sra): we could simply append all the labels in index order to | 602 // TODO(sra): we could simply append all the labels in index order to |
610 // incorporate some costing for entropy (bigger deltas) that will be | 603 // incorporate some costing for entropy (bigger deltas) that will be |
611 // introduced into the label address table by non-monotonic ordering. This | 604 // introduced into the label address table by non-monotonic ordering. This |
612 // would have some knock-on effects to parts of the algorithm that work on | 605 // would have some knock-on effects to parts of the algorithm that work on |
613 // single-occurrence labels. | 606 // single-occurrence labels. |
614 } | 607 } |
615 | 608 |
616 void Solve(const Trace& model, const Trace& problem) { | 609 void Solve(const Trace& model, const Trace& problem) { |
617 LinkLabelInfos(model); | 610 LinkLabelInfos(model); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 AdjustmentMethod* method = AdjustmentMethod::MakeProductionAdjustmentMethod(); | 682 AdjustmentMethod* method = AdjustmentMethod::MakeProductionAdjustmentMethod(); |
690 bool ok = method->Adjust(model, program); | 683 bool ok = method->Adjust(model, program); |
691 method->Destroy(); | 684 method->Destroy(); |
692 if (ok) | 685 if (ok) |
693 return C_OK; | 686 return C_OK; |
694 else | 687 else |
695 return C_ADJUSTMENT_FAILED; | 688 return C_ADJUSTMENT_FAILED; |
696 } | 689 } |
697 | 690 |
698 } // namespace courgette | 691 } // namespace courgette |
OLD | NEW |