| 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" |
| 17 #include "base/logging.h" | 18 #include "base/logging.h" |
| 18 #include "base/macros.h" | 19 #include "base/macros.h" |
| 19 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 21 #include "courgette/assembly_program.h" | 22 #include "courgette/assembly_program.h" |
| 22 #include "courgette/courgette.h" | 23 #include "courgette/courgette.h" |
| 23 #include "courgette/encoded_program.h" | 24 #include "courgette/encoded_program.h" |
| 24 | 25 |
| 25 namespace courgette { | 26 namespace courgette { |
| 26 | 27 |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 prog_->UnassignIndexes(); | 586 prog_->UnassignIndexes(); |
| 586 CollectTraces(model_, &model_abs32_, &model_rel32_, true); | 587 CollectTraces(model_, &model_abs32_, &model_rel32_, true); |
| 587 CollectTraces(prog_, &prog_abs32_, &prog_rel32_, false); | 588 CollectTraces(prog_, &prog_abs32_, &prog_rel32_, false); |
| 588 Solve(model_abs32_, prog_abs32_); | 589 Solve(model_abs32_, prog_abs32_); |
| 589 Solve(model_rel32_, prog_rel32_); | 590 Solve(model_rel32_, prog_rel32_); |
| 590 prog_->AssignRemainingIndexes(); | 591 prog_->AssignRemainingIndexes(); |
| 591 return true; | 592 return true; |
| 592 } | 593 } |
| 593 | 594 |
| 594 private: | 595 private: |
| 595 | |
| 596 void CollectTraces(const AssemblyProgram* program, Trace* abs32, Trace* rel32, | 596 void CollectTraces(const AssemblyProgram* program, Trace* abs32, Trace* rel32, |
| 597 bool is_model) { | 597 bool is_model) { |
| 598 const InstructionVector& instructions = program->instructions(); | 598 AssemblyProgram::LabelHandler abs32_handler = |
| 599 for (size_t i = 0; i < instructions.size(); ++i) { | 599 base::Bind(&GraphAdjuster::ReferenceLabel, base::Unretained(this), |
| 600 Instruction* instruction = instructions[i]; | 600 abs32, is_model); |
| 601 if (Label* label = program->InstructionAbs32Label(instruction)) | 601 AssemblyProgram::LabelHandler rel32_handler = |
| 602 ReferenceLabel(abs32, label, is_model); | 602 base::Bind(&GraphAdjuster::ReferenceLabel, base::Unretained(this), |
| 603 if (Label* label = program->InstructionRel32Label(instruction)) | 603 rel32, is_model); |
| 604 ReferenceLabel(rel32, label, is_model); | 604 |
| 605 } | 605 program->HandleInstructionLabels({{ABS32, abs32_handler}, |
| 606 {REL32, rel32_handler}, |
| 607 {REL32ARM, rel32_handler}}); |
| 608 |
| 606 // TODO(sra): we could simply append all the labels in index order to | 609 // TODO(sra): we could simply append all the labels in index order to |
| 607 // incorporate some costing for entropy (bigger deltas) that will be | 610 // incorporate some costing for entropy (bigger deltas) that will be |
| 608 // introduced into the label address table by non-monotonic ordering. This | 611 // introduced into the label address table by non-monotonic ordering. This |
| 609 // would have some knock-on effects to parts of the algorithm that work on | 612 // would have some knock-on effects to parts of the algorithm that work on |
| 610 // single-occurrence labels. | 613 // single-occurrence labels. |
| 611 } | 614 } |
| 612 | 615 |
| 613 void Solve(const Trace& model, const Trace& problem) { | 616 void Solve(const Trace& model, const Trace& problem) { |
| 614 LinkLabelInfos(model); | 617 LinkLabelInfos(model); |
| 615 LinkLabelInfos(problem); | 618 LinkLabelInfos(problem); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 627 LabelInfo* curr = *p; | 630 LabelInfo* curr = *p; |
| 628 if (prev) prev->next_addr_ = curr; | 631 if (prev) prev->next_addr_ = curr; |
| 629 curr->prev_addr_ = prev; | 632 curr->prev_addr_ = prev; |
| 630 prev = curr; | 633 prev = curr; |
| 631 | 634 |
| 632 if (curr->positions_.size() != curr->refs_) | 635 if (curr->positions_.size() != curr->refs_) |
| 633 NOTREACHED(); | 636 NOTREACHED(); |
| 634 } | 637 } |
| 635 } | 638 } |
| 636 | 639 |
| 637 void ReferenceLabel(Trace* trace, Label* label, bool is_model) { | 640 void ReferenceLabel(Trace* trace, bool is_model, Label* label) { |
| 638 trace->push_back( | 641 trace->push_back( |
| 639 MakeLabelInfo(label, is_model, static_cast<uint32_t>(trace->size()))); | 642 MakeLabelInfo(label, is_model, static_cast<uint32_t>(trace->size()))); |
| 640 } | 643 } |
| 641 | 644 |
| 642 LabelInfo* MakeLabelInfo(Label* label, bool is_model, uint32_t position) { | 645 LabelInfo* MakeLabelInfo(Label* label, bool is_model, uint32_t position) { |
| 643 LabelInfo& slot = label_infos_[label]; | 646 LabelInfo& slot = label_infos_[label]; |
| 644 if (slot.label_ == NULL) { | 647 if (slot.label_ == NULL) { |
| 645 slot.label_ = label; | 648 slot.label_ = label; |
| 646 slot.is_model_ = is_model; | 649 slot.is_model_ = is_model; |
| 647 slot.debug_index_ = ++debug_label_index_gen_; | 650 slot.debug_index_ = ++debug_label_index_gen_; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 AdjustmentMethod* method = AdjustmentMethod::MakeProductionAdjustmentMethod(); | 689 AdjustmentMethod* method = AdjustmentMethod::MakeProductionAdjustmentMethod(); |
| 687 bool ok = method->Adjust(model, program); | 690 bool ok = method->Adjust(model, program); |
| 688 method->Destroy(); | 691 method->Destroy(); |
| 689 if (ok) | 692 if (ok) |
| 690 return C_OK; | 693 return C_OK; |
| 691 else | 694 else |
| 692 return C_ADJUSTMENT_FAILED; | 695 return C_ADJUSTMENT_FAILED; |
| 693 } | 696 } |
| 694 | 697 |
| 695 } // namespace courgette | 698 } // namespace courgette |
| OLD | NEW |