diff options
author | 2018-08-01 17:23:53 +0100 | |
---|---|---|
committer | 2018-08-03 12:48:49 +0100 | |
commit | e7a9194558379ee24fde82fcaeaee29542df1520 (patch) | |
tree | 30f3c43f2d64f159503bb8c3442aa39cc6cb612e /compiler/optimizing/stack_map_stream.cc | |
parent | f50419eee7290542db07bff23c4f65e693ba037f (diff) |
Simplify StackMapStream encoding.
Test: test-art-host-gtest-stack_map_test
Change-Id: Ife021d03e4e486043ec609f9af8673ace7bde497
Diffstat (limited to 'compiler/optimizing/stack_map_stream.cc')
-rw-r--r-- | compiler/optimizing/stack_map_stream.cc | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/compiler/optimizing/stack_map_stream.cc b/compiler/optimizing/stack_map_stream.cc index b26b53fc9f..8858cbe941 100644 --- a/compiler/optimizing/stack_map_stream.cc +++ b/compiler/optimizing/stack_map_stream.cc @@ -57,6 +57,15 @@ void StackMapStream::BeginMethod(size_t frame_size_in_bytes, void StackMapStream::EndMethod() { DCHECK(in_method_) << "Mismatched Begin/End calls"; in_method_ = false; + + // Read the stack masks now. The compiler might have updated them. + for (size_t i = 0; i < lazy_stack_masks_.size(); i++) { + BitVector* stack_mask = lazy_stack_masks_[i]; + if (stack_mask != nullptr && stack_mask->GetNumberOfBits() != 0) { + stack_maps_[i][StackMap::kStackMaskIndex] = + stack_masks_.Dedup(stack_mask->GetRawStorage(), stack_mask->GetNumberOfBits()); + } + } } void StackMapStream::BeginStackMapEntry(uint32_t dex_pc, @@ -281,19 +290,12 @@ ALWAYS_INLINE static void EncodeTable(Writer& out, const Builder& bit_table) { bit_table.Encode(out); } -size_t StackMapStream::PrepareForFillIn() { - DCHECK_EQ(out_.size(), 0u); - - // Read the stack masks now. The compiler might have updated them. - for (size_t i = 0; i < lazy_stack_masks_.size(); i++) { - BitVector* stack_mask = lazy_stack_masks_[i]; - if (stack_mask != nullptr && stack_mask->GetNumberOfBits() != 0) { - stack_maps_[i][StackMap::kStackMaskIndex] = - stack_masks_.Dedup(stack_mask->GetRawStorage(), stack_mask->GetNumberOfBits()); - } - } +ScopedArenaVector<uint8_t> StackMapStream::Encode() { + DCHECK(in_stack_map_ == false) << "Mismatched Begin/End calls"; + DCHECK(in_inline_info_ == false) << "Mismatched Begin/End calls"; - BitMemoryWriter<ScopedArenaVector<uint8_t>> out(&out_); + ScopedArenaVector<uint8_t> buffer(allocator_->Adapter(kArenaAllocStackMapStream)); + BitMemoryWriter<ScopedArenaVector<uint8_t>> out(&buffer); EncodeVarintBits(out, packed_frame_size_); EncodeVarintBits(out, core_spill_mask_); EncodeVarintBits(out, fp_spill_mask_); @@ -307,20 +309,9 @@ size_t StackMapStream::PrepareForFillIn() { EncodeTable(out, dex_register_maps_); EncodeTable(out, dex_register_catalog_); - return out_.size(); -} - -void StackMapStream::FillInCodeInfo(MemoryRegion region) { - DCHECK(in_stack_map_ == false) << "Mismatched Begin/End calls"; - DCHECK(in_inline_info_ == false) << "Mismatched Begin/End calls"; - DCHECK_NE(0u, out_.size()) << "PrepareForFillIn not called before FillIn"; - DCHECK_EQ(region.size(), out_.size()); - - region.CopyFromVector(0, out_); - // Verify that we can load the CodeInfo and check some essentials. - CodeInfo code_info(region); - CHECK_EQ(code_info.Size(), out_.size()); + CodeInfo code_info(buffer.data()); + CHECK_EQ(code_info.Size(), buffer.size()); CHECK_EQ(code_info.GetNumberOfStackMaps(), stack_maps_.size()); // Verify all written data (usually only in debug builds). @@ -329,6 +320,8 @@ void StackMapStream::FillInCodeInfo(MemoryRegion region) { dcheck(code_info); } } + + return buffer; } } // namespace art |