Use bit-level packing for InlineInfo in stackmaps as well.
Use the same approach as we do for stackmaps to reduce the size.
It saves 4.0 MB from non-debuggable boot.oat (AOSP).
It does not affect debuggable boot.oat.
It saves 3.6 MB (of 96.6 MB) from /system/framework/arm/ (GOOG).
It saves 0.6 MB (of 26.7 MB) from /system/framework/oat/arm/ (GOOG).
Field loads from inline-info get around 5% slower.
(based on the time it takes to load all inline-infos from boot.oat)
Change-Id: I67b0fa5eef74c1fdb013680d0231fd44ea696176
diff --git a/runtime/stack_map.cc b/runtime/stack_map.cc
index b51baf1..a7e7c21 100644
--- a/runtime/stack_map.cc
+++ b/runtime/stack_map.cc
@@ -101,6 +101,17 @@
<< ")\n";
}
+void InlineInfoEncoding::Dump(VariableIndentationOutputStream* vios) const {
+ vios->Stream()
+ << "InlineInfoEncoding"
+ << " (method_index_bit_offset=" << static_cast<uint32_t>(kMethodIndexBitOffset)
+ << ", dex_pc_bit_offset=" << static_cast<uint32_t>(dex_pc_bit_offset_)
+ << ", invoke_type_bit_offset=" << static_cast<uint32_t>(invoke_type_bit_offset_)
+ << ", dex_register_map_bit_offset=" << static_cast<uint32_t>(dex_register_map_bit_offset_)
+ << ", total_bit_size=" << static_cast<uint32_t>(total_bit_size_)
+ << ")\n";
+}
+
void CodeInfo::Dump(VariableIndentationOutputStream* vios,
uint32_t code_offset,
uint16_t number_of_dex_registers,
@@ -113,6 +124,9 @@
<< ")\n";
ScopedIndentation indent1(vios);
encoding.stack_map_encoding.Dump(vios);
+ if (HasInlineInfo(encoding)) {
+ encoding.inline_info_encoding.Dump(vios);
+ }
// Display the Dex register location catalog.
GetDexRegisterLocationCatalog(encoding).Dump(vios, *this);
// Display stack maps along with (live) Dex register maps.
@@ -207,18 +221,22 @@
void InlineInfo::Dump(VariableIndentationOutputStream* vios,
const CodeInfo& code_info,
uint16_t number_of_dex_registers[]) const {
- vios->Stream() << "InlineInfo with depth " << static_cast<uint32_t>(GetDepth()) << "\n";
+ InlineInfoEncoding inline_info_encoding = code_info.ExtractEncoding().inline_info_encoding;
+ vios->Stream() << "InlineInfo with depth "
+ << static_cast<uint32_t>(GetDepth(inline_info_encoding))
+ << "\n";
- for (size_t i = 0; i < GetDepth(); ++i) {
+ for (size_t i = 0; i < GetDepth(inline_info_encoding); ++i) {
vios->Stream()
<< " At depth " << i
<< std::hex
- << " (dex_pc=0x" << GetDexPcAtDepth(i)
+ << " (dex_pc=0x" << GetDexPcAtDepth(inline_info_encoding, i)
<< std::dec
- << ", method_index=" << GetMethodIndexAtDepth(i)
- << ", invoke_type=" << static_cast<InvokeType>(GetInvokeTypeAtDepth(i))
+ << ", method_index=" << GetMethodIndexAtDepth(inline_info_encoding, i)
+ << ", invoke_type=" << static_cast<InvokeType>(GetInvokeTypeAtDepth(inline_info_encoding,
+ i))
<< ")\n";
- if (HasDexRegisterMapAtDepth(i) && (number_of_dex_registers != nullptr)) {
+ if (HasDexRegisterMapAtDepth(inline_info_encoding, i) && (number_of_dex_registers != nullptr)) {
CodeInfoEncoding encoding = code_info.ExtractEncoding();
DexRegisterMap dex_register_map =
code_info.GetDexRegisterMapAtDepth(i, *this, encoding, number_of_dex_registers[i]);