Use `HashMap<>` for code info deduplication.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 181943478
Change-Id: If99f5abfa67617d290a084d900e56355b6b10cdb
diff --git a/dex2oat/linker/oat_writer.cc b/dex2oat/linker/oat_writer.cc
index df95f2a..19e77de 100644
--- a/dex2oat/linker/oat_writer.cc
+++ b/dex2oat/linker/oat_writer.cc
@@ -1514,14 +1514,16 @@
: OatDexMethodVisitor(writer, offset),
dedupe_bit_table_(&writer_->code_info_data_) {
if (kDeduplicate) {
- // Reserve a large buffer for `CodeInfo` bit table deduplication except for
+ // Reserve large buffers for `CodeInfo` and bit table deduplication except for
// multi-image compilation as we do not want to reserve multiple large buffers.
// User devices should not do any multi-image compilation.
const CompilerOptions& compiler_options = writer->GetCompilerOptions();
DCHECK(compiler_options.IsAnyCompilationEnabled());
if (compiler_options.DeduplicateCode() && !compiler_options.IsMultiImage()) {
- dedupe_bit_table_.ReserveDedupeBuffer(
- writer->compiler_driver_->GetCompiledMethodStorage()->UniqueVMapTableEntries());
+ size_t unique_code_infos =
+ writer->compiler_driver_->GetCompiledMethodStorage()->UniqueVMapTableEntries();
+ dedupe_code_info_.reserve(unique_code_infos);
+ dedupe_bit_table_.ReserveDedupeBuffer(unique_code_infos);
}
}
}
@@ -1538,14 +1540,17 @@
ArrayRef<const uint8_t> map = compiled_method->GetVmapTable();
if (map.size() != 0u) {
- size_t offset;
+ size_t offset = offset_ + writer_->code_info_data_.size();
if (kDeduplicate) {
- offset = dedupe_code_info_.GetOrCreate(map.data(), [=]() {
- // Deduplicate the inner BitTable<>s within the CodeInfo.
- return offset_ + dedupe_bit_table_.Dedupe(map.data());
- });
+ auto [it, inserted] = dedupe_code_info_.insert(std::make_pair(map.data(), offset));
+ DCHECK_EQ(inserted, it->second == offset);
+ if (inserted) {
+ size_t dedupe_bit_table_offset = dedupe_bit_table_.Dedupe(map.data());
+ DCHECK_EQ(offset, offset_ + dedupe_bit_table_offset);
+ } else {
+ offset = it->second;
+ }
} else {
- offset = offset_ + writer_->code_info_data_.size();
writer_->code_info_data_.insert(writer_->code_info_data_.end(), map.begin(), map.end());
}
// Code offset is not initialized yet, so set file offset for now.
@@ -1562,7 +1567,7 @@
// Deduplicate at CodeInfo level. The value is byte offset within code_info_data_.
// This deduplicates the whole CodeInfo object without going into the inner tables.
// The compiler already deduplicated the pointers but it did not dedupe the tables.
- SafeMap<const uint8_t*, size_t> dedupe_code_info_;
+ HashMap<const uint8_t*, size_t> dedupe_code_info_;
// Deduplicate at BitTable level.
CodeInfoTableDeduper dedupe_bit_table_;