summaryrefslogtreecommitdiffstats
path: root/courgette/label_manager.cc
diff options
context:
space:
mode:
authorhuangs <huangs@chromium.org>2016-01-19 14:09:03 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-19 22:11:12 +0000
commitbb4b8a90a34d7a36b9a83cb663e9f29f12d16a3e (patch)
tree67781fd3df79bd04ed728c2555bcce6a574d609f /courgette/label_manager.cc
parent7f6dad4f0bdb435323452ba420d34b2e7ee536cc (diff)
downloadchromium_src-bb4b8a90a34d7a36b9a83cb663e9f29f12d16a3e.zip
chromium_src-bb4b8a90a34d7a36b9a83cb663e9f29f12d16a3e.tar.gz
chromium_src-bb4b8a90a34d7a36b9a83cb663e9f29f12d16a3e.tar.bz2
[Courgette] Simplify EncodedProgram Label addition code; removed "1.01 x" memory fix.
This CL simplifies how Labels get flattened to a list of RVAs. In the past EncodedProgram used DefineAbs32Label() / DefineRel32Label(), which let callers add one Label at a time. Complexity arose from: - Function pointer usage to avoid duplicate code for abs32 and rel32. - Need for EncodedProgram to dynamically adjust size of RVA list. This led to inefficient array resizing, which was fixed by the "1.01 x" memory growth. Change: We now pass the collection of abs32 and rel32 Labels to EncodedProgram. This simplifies the interface, and allows EncodedProgram to find the max indexes and preallocated buffers. The trade-off is increased test code complexity, since we'd need to create Label collection. Other changes: - Update namespace{} for EncodedProgram and its tests. - Add more Label constructors (for testing). - Add LabelManager::GetIndexBound(), for LabelVector and RVAToLabel. - Add kUnassignedRVA in image_utils.h, with checks for its absence in images. Review URL: https://codereview.chromium.org/1571913003 Cr-Commit-Position: refs/heads/master@{#370200}
Diffstat (limited to 'courgette/label_manager.cc')
-rw-r--r--courgette/label_manager.cc29
1 files changed, 22 insertions, 7 deletions
diff --git a/courgette/label_manager.cc b/courgette/label_manager.cc
index 268bda2..bd568b0 100644
--- a/courgette/label_manager.cc
+++ b/courgette/label_manager.cc
@@ -20,21 +20,34 @@ LabelManager::LabelManager() {}
LabelManager::~LabelManager() {}
-LabelManagerImpl::RvaVisitor::~RvaVisitor() {}
+// static
+int LabelManager::GetIndexBound(const LabelVector& labels) {
+ int max_index = -1;
+ for (const Label& label : labels) {
+ if (label.index_ != Label::kNoIndex)
+ max_index = std::max(max_index, label.index_);
+ }
+ return max_index + 1;
+}
-LabelManagerImpl::SimpleIndexAssigner::SimpleIndexAssigner(LabelVector* labels)
- : labels_(labels) {
- // Find the maximum assigned index. Not bounded by |labels_| size.
+// static
+int LabelManager::GetIndexBound(const RVAToLabel& labels_map) {
int max_index = -1;
- for (const Label& label : *labels_) {
+ for (const auto& rva_and_label : labels_map) {
+ const Label& label = *rva_and_label.second;
if (label.index_ != Label::kNoIndex)
max_index = std::max(max_index, label.index_);
}
+ return max_index + 1;
+}
+
+LabelManagerImpl::RvaVisitor::~RvaVisitor() {}
+LabelManagerImpl::SimpleIndexAssigner::SimpleIndexAssigner(LabelVector* labels)
+ : labels_(labels) {
// Initialize |num_index_| and |available_|.
- CHECK_GE(max_index + 1, 0);
num_index_ = std::max(base::checked_cast<int>(labels_->size()),
- max_index + 1);
+ LabelManager::GetIndexBound(*labels_));
available_.resize(num_index_, true);
size_t used = 0;
for (const Label& label : *labels_) {
@@ -129,6 +142,8 @@ void LabelManagerImpl::Read(RvaVisitor* rva_visitor) {
// Sort |rvas|, then count the number of distinct values.
using CRV = ConsecutiveRangeVisitor<std::vector<RVA>::iterator>;
std::sort(rvas.begin(), rvas.end());
+ DCHECK(rvas.empty() || rvas.back() != kUnassignedRVA);
+
size_t num_distinct_rva = 0;
for (CRV it(rvas.begin(), rvas.end()); it.has_more(); it.advance())
++num_distinct_rva;