199ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray/* 299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * Copyright (C) 2014 The Android Open Source Project 399ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * 499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 599ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * you may not use this file except in compliance with the License. 699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * You may obtain a copy of the License at 799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * 899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * 1099ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * Unless required by applicable law or agreed to in writing, software 1199ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 1299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1399ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * See the License for the specific language governing permissions and 1499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray * limitations under the License. 1599ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray */ 1699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 1799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray#ifndef ART_COMPILER_OPTIMIZING_STACK_MAP_STREAM_H_ 1899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray#define ART_COMPILER_OPTIMIZING_STACK_MAP_STREAM_H_ 1999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 206ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle#include "base/arena_containers.h" 216ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle#include "base/bit_vector-inl.h" 222a5c4681ba19411c1cb22e9a7ab446dab910af1cAndreas Gampe#include "base/hash_map.h" 230279ebb3efd653e6bb255470c99d26949c7bcd95Ian Rogers#include "base/value_object.h" 2499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray#include "memory_region.h" 25fead4e4f397455aa31905b2982d4d861126ab89dNicolas Geoffray#include "nodes.h" 2699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray#include "stack_map.h" 2799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 2899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffraynamespace art { 2999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 30a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain// Helper to build art::StackMapStream::LocationCatalogEntriesIndices. 31a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillainclass LocationCatalogEntriesIndicesEmptyFn { 32a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain public: 33a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain void MakeEmpty(std::pair<DexRegisterLocation, size_t>& item) const { 34a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain item.first = DexRegisterLocation::None(); 35a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain } 36a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain bool IsEmpty(const std::pair<DexRegisterLocation, size_t>& item) const { 37a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain return item.first == DexRegisterLocation::None(); 38a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain } 39a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain}; 40a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain 41a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain// Hash function for art::StackMapStream::LocationCatalogEntriesIndices. 42a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain// This hash function does not create collisions. 43a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillainclass DexRegisterLocationHashFn { 44a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain public: 45a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain size_t operator()(DexRegisterLocation key) const { 46a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain // Concatenate `key`s fields to create a 64-bit value to be hashed. 47a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain int64_t kind_and_value = 48a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain (static_cast<int64_t>(key.kind_) << 32) | static_cast<int64_t>(key.value_); 49a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain return inner_hash_fn_(kind_and_value); 50a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain } 51a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain private: 52a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain std::hash<int64_t> inner_hash_fn_; 53a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain}; 54a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain 55a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain 5699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray/** 573946844c34ad965515f677084b07d663d70ad1b8Nicolas Geoffray * Collects and builds stack maps for a method. All the stack maps 583946844c34ad965515f677084b07d663d70ad1b8Nicolas Geoffray * for a method are placed in a CodeInfo object. 5999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray */ 6099ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffrayclass StackMapStream : public ValueObject { 6199ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray public: 6299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray explicit StackMapStream(ArenaAllocator* allocator) 63fead4e4f397455aa31905b2982d4d861126ab89dNicolas Geoffray : allocator_(allocator), 64225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko stack_maps_(allocator->Adapter(kArenaAllocStackMapStream)), 65225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko location_catalog_entries_(allocator->Adapter(kArenaAllocStackMapStream)), 661f49764f7d62b2f80ce3418234a5036a59b2b762Vladimir Marko location_catalog_entries_indices_(allocator->Adapter(kArenaAllocStackMapStream)), 67225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko dex_register_locations_(allocator->Adapter(kArenaAllocStackMapStream)), 68225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko inline_infos_(allocator->Adapter(kArenaAllocStackMapStream)), 698eddd2a379e1d3c76b22f40d3d4387d12ed1a8d1Andreas Gampe stack_mask_max_(-1), 70004c230b4cfc856690c61faabc41864061813c88Nicolas Geoffray dex_pc_max_(0), 71896f8f7fe562f6e59119cb32531da9f0a5f13d18Nicolas Geoffray register_mask_max_(0), 726ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle number_of_stack_maps_with_inline_info_(0), 73225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko dex_map_hash_to_stack_map_indices_(std::less<uint32_t>(), 74225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko allocator->Adapter(kArenaAllocStackMapStream)), 754f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle current_entry_(), 76b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray current_inline_info_(), 7709ed09866da6d8c7448ef297c148bfa577a247c2David Srbecky code_info_encoding_(allocator->Adapter(kArenaAllocStackMapStream)), 784f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle inline_info_size_(0), 794f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle dex_register_maps_size_(0), 804f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle stack_maps_size_(0), 814f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle dex_register_location_catalog_size_(0), 824f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle dex_register_location_catalog_start_(0), 834f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle dex_register_maps_start_(0), 844f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle inline_infos_start_(0), 85b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray needed_size_(0), 86b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray current_dex_register_(0), 87225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko in_inline_frame_(false) { 88225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko stack_maps_.reserve(10); 89225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko location_catalog_entries_.reserve(4); 90225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko dex_register_locations_.reserve(10 * 4); 91225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko inline_infos_.reserve(2); 9209ed09866da6d8c7448ef297c148bfa577a247c2David Srbecky code_info_encoding_.reserve(16); 93225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko } 9499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 9599ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray // See runtime/stack_map.h to know what these fields contain. 9699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray struct StackMapEntry { 9799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray uint32_t dex_pc; 983946844c34ad965515f677084b07d663d70ad1b8Nicolas Geoffray uint32_t native_pc_offset; 9999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray uint32_t register_mask; 10099ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray BitVector* sp_mask; 10199ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray uint32_t num_dex_registers; 10299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray uint8_t inlining_depth; 103fead4e4f397455aa31905b2982d4d861126ab89dNicolas Geoffray size_t dex_register_locations_start_index; 10499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray size_t inline_infos_start_index; 105fead4e4f397455aa31905b2982d4d861126ab89dNicolas Geoffray BitVector* live_dex_registers_mask; 1066ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle uint32_t dex_register_map_hash; 1074f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t same_dex_register_map_as_; 10899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray }; 10999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 11099ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray struct InlineInfoEntry { 111b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t dex_pc; 11299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray uint32_t method_index; 113b176d7c6c8c01a50317f837a78de5da57ee84fb2Nicolas Geoffray InvokeType invoke_type; 114b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t num_dex_registers; 115b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray BitVector* live_dex_registers_mask; 116b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray size_t dex_register_locations_start_index; 11799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray }; 11899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 1194f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle void BeginStackMapEntry(uint32_t dex_pc, 1204f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle uint32_t native_pc_offset, 1214f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle uint32_t register_mask, 1224f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle BitVector* sp_mask, 1234f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle uint32_t num_dex_registers, 1244f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle uint8_t inlining_depth); 1254f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle void EndStackMapEntry(); 12699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 127b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray void AddDexRegisterEntry(DexRegisterLocation::Kind kind, int32_t value); 128a2d8ec6876325e89e5d82f5dbeca59f96ced3ec1Roland Levillain 129b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray void BeginInlineInfoEntry(uint32_t method_index, 130b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t dex_pc, 131b176d7c6c8c01a50317f837a78de5da57ee84fb2Nicolas Geoffray InvokeType invoke_type, 132b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t num_dex_registers); 133b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray void EndInlineInfoEntry(); 13499ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 135bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko size_t GetNumberOfStackMaps() const { 136225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko return stack_maps_.size(); 137bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko } 138bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko 139bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko const StackMapEntry& GetStackMap(size_t i) const { 140225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko return stack_maps_[i]; 141bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko } 142bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko 143cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko void SetStackMapNativePcOffset(size_t i, uint32_t native_pc_offset) { 144225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko stack_maps_[i].native_pc_offset = native_pc_offset; 145cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko } 146cf93a5cd9c978f59113d42f9f642fab5e2cc8877Vladimir Marko 147bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko uint32_t ComputeMaxNativePcOffset() const; 148bd8c725e465cc7f44062745a6f2b73248f5159edVladimir Marko 1494f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle // Prepares the stream to fill in a memory region. Must be called before FillIn. 1504f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle // Returns the size (in bytes) needed to store this stream. 1514f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t PrepareForFillIn(); 1524f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle void FillIn(MemoryRegion region); 1534f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle 1544f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle private: 155c416d3359179b0ec6152104db8240f4d11c54bc7Calin Juravle size_t ComputeDexRegisterLocationCatalogSize() const; 156b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray size_t ComputeDexRegisterMapSize(uint32_t num_dex_registers, 157225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko const BitVector* live_dex_registers_mask) const; 1584f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t ComputeDexRegisterMapsSize() const; 15961b28a17d9b6e8e998103646e98e4a9772e11927David Srbecky void ComputeInlineInfoEncoding(); 160a2d8ec6876325e89e5d82f5dbeca59f96ced3ec1Roland Levillain 1614f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle // Returns the index of an entry with the same dex register map as the current_entry, 1626ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle // or kNoSameDexMapFound if no such entry exists. 1634f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t FindEntryWithTheSameDexMap(); 164c416d3359179b0ec6152104db8240f4d11c54bc7Calin Juravle bool HaveTheSameDexMaps(const StackMapEntry& a, const StackMapEntry& b) const; 165b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray void FillInDexRegisterMap(DexRegisterMap dex_register_map, 166b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t num_dex_registers, 167b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray const BitVector& live_dex_registers_mask, 168b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t start_index_in_dex_register_locations) const; 1696ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle 1701bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky void CheckDexRegisterMap(const CodeInfo& code_info, 1711bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky const DexRegisterMap& dex_register_map, 1721bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky size_t num_dex_registers, 1731bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky BitVector* live_dex_registers_mask, 1741bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky size_t dex_register_locations_index) const; 1751bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky void CheckCodeInfo(MemoryRegion region) const; 1761bbdfd73a98b149c31f8a80888c7ee9ab2587630David Srbecky 177fead4e4f397455aa31905b2982d4d861126ab89dNicolas Geoffray ArenaAllocator* allocator_; 178225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko ArenaVector<StackMapEntry> stack_maps_; 179a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain 180a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain // A catalog of unique [location_kind, register_value] pairs (per method). 181225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko ArenaVector<DexRegisterLocation> location_catalog_entries_; 182a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain // Map from Dex register location catalog entries to their indices in the 183a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain // location catalog. 1841f49764f7d62b2f80ce3418234a5036a59b2b762Vladimir Marko using LocationCatalogEntriesIndices = ArenaHashMap<DexRegisterLocation, 1851f49764f7d62b2f80ce3418234a5036a59b2b762Vladimir Marko size_t, 1861f49764f7d62b2f80ce3418234a5036a59b2b762Vladimir Marko LocationCatalogEntriesIndicesEmptyFn, 1871f49764f7d62b2f80ce3418234a5036a59b2b762Vladimir Marko DexRegisterLocationHashFn>; 188a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain LocationCatalogEntriesIndices location_catalog_entries_indices_; 189a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillain 190c416d3359179b0ec6152104db8240f4d11c54bc7Calin Juravle // A set of concatenated maps of Dex register locations indices to `location_catalog_entries_`. 191225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko ArenaVector<size_t> dex_register_locations_; 192225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko ArenaVector<InlineInfoEntry> inline_infos_; 19399ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray int stack_mask_max_; 194004c230b4cfc856690c61faabc41864061813c88Nicolas Geoffray uint32_t dex_pc_max_; 195896f8f7fe562f6e59119cb32531da9f0a5f13d18Nicolas Geoffray uint32_t register_mask_max_; 19699ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray size_t number_of_stack_maps_with_inline_info_; 19799ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 198225b6464a58ebe11c156144653f11a1c6607f4ebVladimir Marko ArenaSafeMap<uint32_t, ArenaVector<uint32_t>> dex_map_hash_to_stack_map_indices_; 1996ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle 2004f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle StackMapEntry current_entry_; 201b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray InlineInfoEntry current_inline_info_; 202f677ebfd832c9c614fea5e6735725fec2f7a3f2aDavid Brazdil StackMapEncoding stack_map_encoding_; 20361b28a17d9b6e8e998103646e98e4a9772e11927David Srbecky InlineInfoEncoding inline_info_encoding_; 20409ed09866da6d8c7448ef297c148bfa577a247c2David Srbecky ArenaVector<uint8_t> code_info_encoding_; 2054f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t inline_info_size_; 2064f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t dex_register_maps_size_; 2074f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t stack_maps_size_; 2084f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t dex_register_location_catalog_size_; 2094f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t dex_register_location_catalog_start_; 2104f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t dex_register_maps_start_; 2114f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t inline_infos_start_; 2124f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle size_t needed_size_; 213b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray uint32_t current_dex_register_; 214b1d0f3f7e92fdcc92fe2d4c48cbb1262c005583fNicolas Geoffray bool in_inline_frame_; 2154f46ac5179967dda5966f2dcecf2cf08977951efCalin Juravle 2166ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle static constexpr uint32_t kNoSameDexMapFound = -1; 2176ae70962089e4af9718cc9b7c2b79a0c501c1844Calin Juravle 21899ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray DISALLOW_COPY_AND_ASSIGN(StackMapStream); 21999ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray}; 22099ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 22199ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray} // namespace art 22299ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray 22399ea58cc68b51837c065f4a2a54efbf208dd76faNicolas Geoffray#endif // ART_COMPILER_OPTIMIZING_STACK_MAP_STREAM_H_ 224