diff options
Diffstat (limited to 'compiler/dex/quick/codegen_util.cc')
-rw-r--r-- | compiler/dex/quick/codegen_util.cc | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index c9780fa537..5f6f3d51e9 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -17,6 +17,7 @@ #include "dex/compiler_internals.h" #include "dex_file-inl.h" #include "gc_map.h" +#include "mapping_table.h" #include "mir_to_lir-inl.h" #include "verifier/dex_gc_map.h" #include "verifier/method_verifier.h" @@ -515,15 +516,35 @@ void Mir2Lir::CreateMappingTables() { } } if (kIsDebugBuild) { - DCHECK(VerifyCatchEntries()); + CHECK(VerifyCatchEntries()); + } + CHECK_EQ(pc2dex_mapping_table_.size() & 1, 0U); + CHECK_EQ(dex2pc_mapping_table_.size() & 1, 0U); + uint32_t total_entries = (pc2dex_mapping_table_.size() + dex2pc_mapping_table_.size()) / 2; + uint32_t pc2dex_entries = pc2dex_mapping_table_.size() / 2; + encoded_mapping_table_.PushBack(total_entries); + encoded_mapping_table_.PushBack(pc2dex_entries); + encoded_mapping_table_.InsertBack(pc2dex_mapping_table_.begin(), pc2dex_mapping_table_.end()); + encoded_mapping_table_.InsertBack(dex2pc_mapping_table_.begin(), dex2pc_mapping_table_.end()); + if (kIsDebugBuild) { + // Verify the encoded table holds the expected data. + MappingTable table(&encoded_mapping_table_.GetData()[0]); + CHECK_EQ(table.TotalSize(), total_entries); + CHECK_EQ(table.PcToDexSize(), pc2dex_entries); + CHECK_EQ(table.DexToPcSize(), dex2pc_mapping_table_.size() / 2); + MappingTable::PcToDexIterator it = table.PcToDexBegin(); + for (uint32_t i = 0; i < pc2dex_mapping_table_.size(); ++i, ++it) { + CHECK_EQ(pc2dex_mapping_table_.at(i), it.NativePcOffset()); + ++i; + CHECK_EQ(pc2dex_mapping_table_.at(i), it.DexPc()); + } + MappingTable::DexToPcIterator it2 = table.DexToPcBegin(); + for (uint32_t i = 0; i < dex2pc_mapping_table_.size(); ++i, ++it2) { + CHECK_EQ(dex2pc_mapping_table_.at(i), it2.NativePcOffset()); + ++i; + CHECK_EQ(dex2pc_mapping_table_.at(i), it2.DexPc()); + } } - combined_mapping_table_.push_back(pc2dex_mapping_table_.size() + - dex2pc_mapping_table_.size()); - combined_mapping_table_.push_back(pc2dex_mapping_table_.size()); - combined_mapping_table_.insert(combined_mapping_table_.end(), pc2dex_mapping_table_.begin(), - pc2dex_mapping_table_.end()); - combined_mapping_table_.insert(combined_mapping_table_.end(), dex2pc_mapping_table_.begin(), - dex2pc_mapping_table_.end()); } class NativePcToReferenceMapBuilder { @@ -980,28 +1001,35 @@ void Mir2Lir::Materialize() { CompiledMethod* Mir2Lir::GetCompiledMethod() { // Combine vmap tables - core regs, then fp regs - into vmap_table - std::vector<uint16_t> vmap_table; + std::vector<uint16_t> raw_vmap_table; // Core regs may have been inserted out of order - sort first std::sort(core_vmap_table_.begin(), core_vmap_table_.end()); for (size_t i = 0 ; i < core_vmap_table_.size(); i++) { // Copy, stripping out the phys register sort key - vmap_table.push_back(~(-1 << VREG_NUM_WIDTH) & core_vmap_table_[i]); + raw_vmap_table.push_back(~(-1 << VREG_NUM_WIDTH) & core_vmap_table_[i]); } // If we have a frame, push a marker to take place of lr if (frame_size_ > 0) { - vmap_table.push_back(INVALID_VREG); + raw_vmap_table.push_back(INVALID_VREG); } else { DCHECK_EQ(__builtin_popcount(core_spill_mask_), 0); DCHECK_EQ(__builtin_popcount(fp_spill_mask_), 0); } // Combine vmap tables - core regs, then fp regs. fp regs already sorted for (uint32_t i = 0; i < fp_vmap_table_.size(); i++) { - vmap_table.push_back(fp_vmap_table_[i]); + raw_vmap_table.push_back(fp_vmap_table_[i]); + } + UnsignedLeb128EncodingVector vmap_encoder; + // Prefix the encoded data with its size. + vmap_encoder.PushBack(raw_vmap_table.size()); + typedef std::vector<uint16_t>::const_iterator It; + for (It cur = raw_vmap_table.begin(), end = raw_vmap_table.end(); cur != end; ++cur) { + vmap_encoder.PushBack(*cur); } CompiledMethod* result = new CompiledMethod(cu_->instruction_set, code_buffer_, frame_size_, core_spill_mask_, fp_spill_mask_, - combined_mapping_table_, vmap_table, native_gc_map_); + encoded_mapping_table_.GetData(), vmap_encoder.GetData(), native_gc_map_); return result; } |