Fix the computation of the size of the stack maps region.

In art::StackMapStream::ComputeStackMapSize, compute the
size of a CodeInfo's stack maps region using the stack
mask size, not the maximum element of the stack mask.
Also, rename this method as
art::StackMapStream::ComputeStackMapsSize to make it clear
it that it covers all the stack maps of the CodeInfo item,
not just one stack map.

Change-Id: Icad21946dbca6e1ade2b82c9c2c535fdfed110a9
diff --git a/compiler/optimizing/stack_map_stream.h b/compiler/optimizing/stack_map_stream.h
index 76ddbf3..8fb58d1 100644
--- a/compiler/optimizing/stack_map_stream.h
+++ b/compiler/optimizing/stack_map_stream.h
@@ -100,13 +100,17 @@
 
   size_t ComputeNeededSize() const {
     return CodeInfo::kFixedSize
-        + ComputeStackMapSize()
+        + ComputeStackMapsSize()
         + ComputeDexRegisterMapsSize()
         + ComputeInlineInfoSize();
   }
 
-  size_t ComputeStackMapSize() const {
-    return stack_maps_.Size() * StackMap::ComputeAlignedStackMapSize(stack_mask_max_);
+  size_t ComputeStackMaskSize() const {
+    return StackMaskEncodingSize(stack_mask_max_);
+  }
+
+  size_t ComputeStackMapsSize() const {
+    return stack_maps_.Size() * StackMap::ComputeAlignedStackMapSize(ComputeStackMaskSize());
   }
 
   // Compute the size of the Dex register map of `entry`.
@@ -141,7 +145,7 @@
   }
 
   size_t ComputeDexRegisterMapsStart() const {
-    return CodeInfo::kFixedSize + ComputeStackMapSize();
+    return CodeInfo::kFixedSize + ComputeStackMapsSize();
   }
 
   size_t ComputeInlineInfoStart() const {
@@ -150,9 +154,10 @@
 
   void FillIn(MemoryRegion region) {
     CodeInfo code_info(region);
+    DCHECK_EQ(region.size(), ComputeNeededSize());
     code_info.SetOverallSize(region.size());
 
-    size_t stack_mask_size = StackMaskEncodingSize(stack_mask_max_);
+    size_t stack_mask_size = ComputeStackMaskSize();
     uint8_t* memory_start = region.start();
 
     MemoryRegion dex_register_maps_region = region.Subregion(
@@ -165,6 +170,7 @@
 
     code_info.SetNumberOfStackMaps(stack_maps_.Size());
     code_info.SetStackMaskSize(stack_mask_size);
+    DCHECK_EQ(code_info.StackMapsSize(), ComputeStackMapsSize());
 
     uintptr_t next_dex_register_map_offset = 0;
     uintptr_t next_inline_info_offset = 0;
diff --git a/runtime/stack_map.h b/runtime/stack_map.h
index e88820f..3856da3 100644
--- a/runtime/stack_map.h
+++ b/runtime/stack_map.h
@@ -606,10 +606,17 @@
     region_.Store<uint32_t>(kNumberOfStackMapsOffset, number_of_stack_maps);
   }
 
+  // Get the size of one stack map of this CodeInfo object, in bytes.
+  // All stack maps of a CodeInfo have the same size.
   size_t StackMapSize() const {
     return StackMap::ComputeAlignedStackMapSize(GetStackMaskSize());
   }
 
+  // Get the size all the stack maps of this CodeInfo object, in bytes.
+  size_t StackMapsSize() const {
+    return StackMapSize() * GetNumberOfStackMaps();
+  }
+
   uint32_t GetStackMapsOffset() const {
     return kFixedSize;
   }
@@ -663,7 +670,7 @@
   MemoryRegion GetStackMaps() const {
     return region_.size() == 0
         ? MemoryRegion()
-        : region_.Subregion(kFixedSize, StackMapSize() * GetNumberOfStackMaps());
+        : region_.Subregion(kFixedSize, StackMapsSize());
   }
 
   // Compute the size of a Dex register map starting at offset `origin` in