summaryrefslogtreecommitdiff
path: root/runtime/stack_map.cc
diff options
context:
space:
mode:
author David Srbecky <dsrbecky@google.com> 2018-08-10 10:24:01 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2018-08-10 10:24:01 +0000
commit971a80e5aa36955d9fee6b479a5cbd554f50ca08 (patch)
treea30f7befba047b9dc4e73b46a7d469798f6c3037 /runtime/stack_map.cc
parentc5a319ca5f4c136770fa5c8931d9ee7f48bc6a0f (diff)
parentd1606417eac35d4842f607b63eda48e868e8db1d (diff)
Merge "Cleanup BitMemoryReader/Writer api."
Diffstat (limited to 'runtime/stack_map.cc')
-rw-r--r--runtime/stack_map.cc87
1 files changed, 50 insertions, 37 deletions
diff --git a/runtime/stack_map.cc b/runtime/stack_map.cc
index d1000c5375..b0c59a67dd 100644
--- a/runtime/stack_map.cc
+++ b/runtime/stack_map.cc
@@ -34,15 +34,10 @@ CodeInfo::CodeInfo(const OatQuickMethodHeader* header, DecodeFlags flags)
template<typename Accessor>
ALWAYS_INLINE static void DecodeTable(BitTable<Accessor>& table,
BitMemoryReader& reader,
- const uint8_t* data) {
- bool is_deduped = reader.ReadBit();
- if (is_deduped) {
- // 'data' points to the start of the reader's data.
- uint32_t current_bit_offset = reader.GetBitOffset();
- uint32_t bit_offset_backwards = DecodeVarintBits(reader) - current_bit_offset;
- uint32_t byte_offset_backwards = BitsToBytesRoundUp(bit_offset_backwards);
- BitMemoryReader reader2(data - byte_offset_backwards,
- byte_offset_backwards * kBitsPerByte - bit_offset_backwards);
+ const uint8_t* reader_data) {
+ if (reader.ReadBit() /* is_deduped */) {
+ ssize_t bit_offset = reader.NumberOfReadBits() - DecodeVarintBits(reader);
+ BitMemoryReader reader2(reader_data, bit_offset); // The offset is negative.
table.Decode(reader2);
} else {
table.Decode(reader);
@@ -69,45 +64,63 @@ void CodeInfo::Decode(const uint8_t* data, DecodeFlags flags) {
DecodeTable(dex_register_masks_, reader, data);
DecodeTable(dex_register_maps_, reader, data);
DecodeTable(dex_register_catalog_, reader, data);
- size_in_bits_ = reader.GetBitOffset();
+ size_in_bits_ = reader.NumberOfReadBits();
}
template<typename Accessor>
-ALWAYS_INLINE static void DedupeTable(BitMemoryWriter<std::vector<uint8_t>>& writer,
- BitMemoryReader& reader,
- CodeInfo::DedupeMap* dedupe_map) {
+ALWAYS_INLINE void CodeInfo::Deduper::DedupeTable(BitMemoryReader& reader) {
bool is_deduped = reader.ReadBit();
DCHECK(!is_deduped);
+ size_t bit_table_start = reader.NumberOfReadBits();
BitTable<Accessor> bit_table(reader);
- BitMemoryRegion region = reader.Tail(bit_table.BitSize());
- auto it = dedupe_map->insert(std::make_pair(region, writer.GetBitOffset() + 1 /* dedupe bit */));
+ BitMemoryRegion region = reader.GetReadRegion().Subregion(bit_table_start);
+ auto it = dedupe_map_.insert(std::make_pair(region, /* placeholder */ 0));
if (it.second /* new bit table */ || region.size_in_bits() < 32) {
- writer.WriteBit(false); // Is not deduped.
- writer.WriteRegion(region);
+ writer_.WriteBit(false); // Is not deduped.
+ it.first->second = writer_.NumberOfWrittenBits();
+ writer_.WriteRegion(region);
} else {
- writer.WriteBit(true); // Is deduped.
- EncodeVarintBits(writer, writer.GetBitOffset() - it.first->second);
+ writer_.WriteBit(true); // Is deduped.
+ size_t bit_offset = writer_.NumberOfWrittenBits();
+ EncodeVarintBits(writer_, bit_offset - it.first->second);
}
}
-size_t CodeInfo::Dedupe(std::vector<uint8_t>* out, const uint8_t* in, DedupeMap* dedupe_map) {
- // Remember the current offset in the output buffer so that we can return it later.
- const size_t result = out->size();
- BitMemoryReader reader(in);
- BitMemoryWriter<std::vector<uint8_t>> writer(out, /* bit_offset */ out->size() * kBitsPerByte);
- EncodeVarintBits(writer, DecodeVarintBits(reader)); // packed_frame_size_.
- EncodeVarintBits(writer, DecodeVarintBits(reader)); // core_spill_mask_.
- EncodeVarintBits(writer, DecodeVarintBits(reader)); // fp_spill_mask_.
- EncodeVarintBits(writer, DecodeVarintBits(reader)); // number_of_dex_registers_.
- DedupeTable<StackMap>(writer, reader, dedupe_map);
- DedupeTable<RegisterMask>(writer, reader, dedupe_map);
- DedupeTable<MaskInfo>(writer, reader, dedupe_map);
- DedupeTable<InlineInfo>(writer, reader, dedupe_map);
- DedupeTable<MethodInfo>(writer, reader, dedupe_map);
- DedupeTable<MaskInfo>(writer, reader, dedupe_map);
- DedupeTable<DexRegisterMapInfo>(writer, reader, dedupe_map);
- DedupeTable<DexRegisterInfo>(writer, reader, dedupe_map);
- return result;
+size_t CodeInfo::Deduper::Dedupe(const uint8_t* code_info) {
+ writer_.ByteAlign();
+ size_t deduped_offset = writer_.NumberOfWrittenBits() / kBitsPerByte;
+ BitMemoryReader reader(code_info);
+ EncodeVarintBits(writer_, DecodeVarintBits(reader)); // packed_frame_size_.
+ EncodeVarintBits(writer_, DecodeVarintBits(reader)); // core_spill_mask_.
+ EncodeVarintBits(writer_, DecodeVarintBits(reader)); // fp_spill_mask_.
+ EncodeVarintBits(writer_, DecodeVarintBits(reader)); // number_of_dex_registers_.
+ DedupeTable<StackMap>(reader);
+ DedupeTable<RegisterMask>(reader);
+ DedupeTable<MaskInfo>(reader);
+ DedupeTable<InlineInfo>(reader);
+ DedupeTable<MethodInfo>(reader);
+ DedupeTable<MaskInfo>(reader);
+ DedupeTable<DexRegisterMapInfo>(reader);
+ DedupeTable<DexRegisterInfo>(reader);
+
+ if (kIsDebugBuild) {
+ CodeInfo old_code_info(code_info);
+ CodeInfo new_code_info(writer_.data() + deduped_offset);
+ DCHECK_EQ(old_code_info.packed_frame_size_, new_code_info.packed_frame_size_);
+ DCHECK_EQ(old_code_info.core_spill_mask_, new_code_info.core_spill_mask_);
+ DCHECK_EQ(old_code_info.fp_spill_mask_, new_code_info.fp_spill_mask_);
+ DCHECK_EQ(old_code_info.number_of_dex_registers_, new_code_info.number_of_dex_registers_);
+ DCHECK(old_code_info.stack_maps_.Equals(new_code_info.stack_maps_));
+ DCHECK(old_code_info.register_masks_.Equals(new_code_info.register_masks_));
+ DCHECK(old_code_info.stack_masks_.Equals(new_code_info.stack_masks_));
+ DCHECK(old_code_info.inline_infos_.Equals(new_code_info.inline_infos_));
+ DCHECK(old_code_info.method_infos_.Equals(new_code_info.method_infos_));
+ DCHECK(old_code_info.dex_register_masks_.Equals(new_code_info.dex_register_masks_));
+ DCHECK(old_code_info.dex_register_maps_.Equals(new_code_info.dex_register_maps_));
+ DCHECK(old_code_info.dex_register_catalog_.Equals(new_code_info.dex_register_catalog_));
+ }
+
+ return deduped_offset;
}
BitTable<StackMap>::const_iterator CodeInfo::BinarySearchNativePc(uint32_t packed_pc) const {