Simplify DexRegisterMap API.
Store some of the needed decoding state explicitly to avoid passing it
around all the time. The DexRegisterMap class is rewritten in next CL.
Test: test-art-host-gtest-stack_map_test
Change-Id: Ie268dff2a1c1da2e08f0e6799ae51c30e11f350b
diff --git a/runtime/stack_map.h b/runtime/stack_map.h
index 363884a..9d66b31 100644
--- a/runtime/stack_map.h
+++ b/runtime/stack_map.h
@@ -445,53 +445,39 @@
*/
class DexRegisterMap {
public:
- explicit DexRegisterMap(MemoryRegion region) : region_(region) {}
- DexRegisterMap() {}
+ DexRegisterMap(MemoryRegion region, uint16_t number_of_dex_registers, const CodeInfo& code_info)
+ : region_(region),
+ number_of_dex_registers_(number_of_dex_registers),
+ code_info_(code_info) {}
bool IsValid() const { return region_.IsValid(); }
// Get the surface kind of Dex register `dex_register_number`.
- DexRegisterLocation::Kind GetLocationKind(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const {
- return DexRegisterLocation::ConvertToSurfaceKind(
- GetLocationInternalKind(dex_register_number, number_of_dex_registers, code_info));
+ DexRegisterLocation::Kind GetLocationKind(uint16_t dex_register_number) const {
+ return DexRegisterLocation::ConvertToSurfaceKind(GetLocationInternalKind(dex_register_number));
}
// Get the internal kind of Dex register `dex_register_number`.
- DexRegisterLocation::Kind GetLocationInternalKind(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const;
+ DexRegisterLocation::Kind GetLocationInternalKind(uint16_t dex_register_number) const;
// Get the Dex register location `dex_register_number`.
- DexRegisterLocation GetDexRegisterLocation(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const;
+ DexRegisterLocation GetDexRegisterLocation(uint16_t dex_register_number) const;
- int32_t GetStackOffsetInBytes(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const {
- DexRegisterLocation location =
- GetDexRegisterLocation(dex_register_number, number_of_dex_registers, code_info);
+ int32_t GetStackOffsetInBytes(uint16_t dex_register_number) const {
+ DexRegisterLocation location = GetDexRegisterLocation(dex_register_number);
DCHECK(location.GetKind() == DexRegisterLocation::Kind::kInStack);
// GetDexRegisterLocation returns the offset in bytes.
return location.GetValue();
}
- int32_t GetConstant(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const {
- DexRegisterLocation location =
- GetDexRegisterLocation(dex_register_number, number_of_dex_registers, code_info);
+ int32_t GetConstant(uint16_t dex_register_number) const {
+ DexRegisterLocation location = GetDexRegisterLocation(dex_register_number);
DCHECK_EQ(location.GetKind(), DexRegisterLocation::Kind::kConstant);
return location.GetValue();
}
- int32_t GetMachineRegister(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
- const CodeInfo& code_info) const {
- DexRegisterLocation location =
- GetDexRegisterLocation(dex_register_number, number_of_dex_registers, code_info);
+ int32_t GetMachineRegister(uint16_t dex_register_number) const {
+ DexRegisterLocation location = GetDexRegisterLocation(dex_register_number);
DCHECK(location.GetInternalKind() == DexRegisterLocation::Kind::kInRegister ||
location.GetInternalKind() == DexRegisterLocation::Kind::kInRegisterHigh ||
location.GetInternalKind() == DexRegisterLocation::Kind::kInFpuRegister ||
@@ -503,7 +489,6 @@
// Get the index of the entry in the Dex register location catalog
// corresponding to `dex_register_number`.
size_t GetLocationCatalogEntryIndex(uint16_t dex_register_number,
- uint16_t number_of_dex_registers,
size_t number_of_location_catalog_entries) const {
if (!IsDexRegisterLive(dex_register_number)) {
return DexRegisterLocationCatalog::kNoLocationEntryIndex;
@@ -518,9 +503,9 @@
// The bit offset of the beginning of the map locations.
size_t map_locations_offset_in_bits =
- GetLocationMappingDataOffset(number_of_dex_registers) * kBitsPerByte;
+ GetLocationMappingDataOffset(number_of_dex_registers_) * kBitsPerByte;
size_t index_in_dex_register_map = GetIndexInDexRegisterMap(dex_register_number);
- DCHECK_LT(index_in_dex_register_map, GetNumberOfLiveDexRegisters(number_of_dex_registers));
+ DCHECK_LT(index_in_dex_register_map, GetNumberOfLiveDexRegisters());
// The bit size of an entry.
size_t map_entry_size_in_bits = SingleEntrySizeInBits(number_of_location_catalog_entries);
// The bit offset where `index_in_dex_register_map` is located.
@@ -535,9 +520,8 @@
// Map entry at `index_in_dex_register_map` to `location_catalog_entry_index`.
void SetLocationCatalogEntryIndex(size_t index_in_dex_register_map,
size_t location_catalog_entry_index,
- uint16_t number_of_dex_registers,
size_t number_of_location_catalog_entries) {
- DCHECK_LT(index_in_dex_register_map, GetNumberOfLiveDexRegisters(number_of_dex_registers));
+ DCHECK_LT(index_in_dex_register_map, GetNumberOfLiveDexRegisters());
DCHECK_LT(location_catalog_entry_index, number_of_location_catalog_entries);
if (number_of_location_catalog_entries == 1) {
@@ -548,7 +532,7 @@
// The bit offset of the beginning of the map locations.
size_t map_locations_offset_in_bits =
- GetLocationMappingDataOffset(number_of_dex_registers) * kBitsPerByte;
+ GetLocationMappingDataOffset(number_of_dex_registers_) * kBitsPerByte;
// The bit size of an entry.
size_t map_entry_size_in_bits = SingleEntrySizeInBits(number_of_location_catalog_entries);
// The bit offset where `index_in_dex_register_map` is located.
@@ -580,6 +564,10 @@
return number_of_live_dex_registers;
}
+ size_t GetNumberOfLiveDexRegisters() const {
+ return GetNumberOfLiveDexRegisters(number_of_dex_registers_);
+ }
+
static size_t GetLiveBitMaskOffset() {
return kFixedSize;
}
@@ -594,10 +582,9 @@
return GetLiveBitMaskOffset() + GetLiveBitMaskSize(number_of_dex_registers);
}
- size_t GetLocationMappingDataSize(uint16_t number_of_dex_registers,
- size_t number_of_location_catalog_entries) const {
+ size_t GetLocationMappingDataSize(size_t number_of_location_catalog_entries) const {
size_t location_mapping_data_size_in_bits =
- GetNumberOfLiveDexRegisters(number_of_dex_registers)
+ GetNumberOfLiveDexRegisters()
* SingleEntrySizeInBits(number_of_location_catalog_entries);
return RoundUp(location_mapping_data_size_in_bits, kBitsPerByte) / kBitsPerByte;
}
@@ -620,8 +607,7 @@
return BitsToBytesRoundUp(region_.size_in_bits());
}
- void Dump(VariableIndentationOutputStream* vios,
- const CodeInfo& code_info, uint16_t number_of_dex_registers) const;
+ void Dump(VariableIndentationOutputStream* vios) const;
private:
// Return the index in the Dex register map corresponding to the Dex
@@ -641,6 +627,8 @@
static constexpr int kFixedSize = 0;
BitMemoryRegion region_;
+ uint16_t number_of_dex_registers_;
+ const CodeInfo& code_info_;
friend class CodeInfo;
friend class StackMapStream;
@@ -896,11 +884,13 @@
DexRegisterMap GetDexRegisterMapOf(StackMap stack_map,
size_t number_of_dex_registers) const {
if (!stack_map.HasDexRegisterMap()) {
- return DexRegisterMap();
+ return DexRegisterMap(MemoryRegion(), 0, *this);
}
const uint32_t offset = stack_map.GetDexRegisterMapOffset();
size_t size = ComputeDexRegisterMapSizeOf(offset, number_of_dex_registers);
- return DexRegisterMap(dex_register_maps_.Subregion(offset, size));
+ return DexRegisterMap(dex_register_maps_.Subregion(offset, size),
+ number_of_dex_registers,
+ *this);
}
size_t GetDexRegisterMapsSize(uint32_t number_of_dex_registers) const {
@@ -918,11 +908,13 @@
InlineInfo inline_info,
uint32_t number_of_dex_registers) const {
if (!inline_info.HasDexRegisterMapAtDepth(depth)) {
- return DexRegisterMap();
+ return DexRegisterMap(MemoryRegion(), 0, *this);
} else {
uint32_t offset = inline_info.GetDexRegisterMapOffsetAtDepth(depth);
size_t size = ComputeDexRegisterMapSizeOf(offset, number_of_dex_registers);
- return DexRegisterMap(dex_register_maps_.Subregion(offset, size));
+ return DexRegisterMap(dex_register_maps_.Subregion(offset, size),
+ number_of_dex_registers,
+ *this);
}
}
@@ -1036,9 +1028,11 @@
// art::DexRegisterMap::GetNumberOfLiveDexRegisters and
DexRegisterMap dex_register_map_without_locations(
MemoryRegion(dex_register_maps_.Subregion(dex_register_map_offset,
- location_mapping_data_offset_in_dex_register_map)));
+ location_mapping_data_offset_in_dex_register_map)),
+ number_of_dex_registers,
+ *this);
size_t number_of_live_dex_registers =
- dex_register_map_without_locations.GetNumberOfLiveDexRegisters(number_of_dex_registers);
+ dex_register_map_without_locations.GetNumberOfLiveDexRegisters();
size_t location_mapping_data_size_in_bits =
DexRegisterMap::SingleEntrySizeInBits(GetNumberOfLocationCatalogEntries())
* number_of_live_dex_registers;
@@ -1084,6 +1078,7 @@
BitTable<1> stack_masks_;
friend class OatDumper;
+ friend class StackMapStream;
};
#undef ELEMENT_BYTE_OFFSET_AFTER