diff options
author | huangs <huangs@chromium.org> | 2016-01-19 14:09:03 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-19 22:11:12 +0000 |
commit | bb4b8a90a34d7a36b9a83cb663e9f29f12d16a3e (patch) | |
tree | 67781fd3df79bd04ed728c2555bcce6a574d609f /courgette/label_manager.cc | |
parent | 7f6dad4f0bdb435323452ba420d34b2e7ee536cc (diff) | |
download | chromium_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.cc | 29 |
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; |