blob: a281bb30f497059ec0de85567938999c57b80053 [file] [log] [blame]
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +01001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "stack_map.h"
Mathieu Chartiere5d80f82015-10-15 17:47:48 -070018
Nicolas Geoffray5d37c152017-01-12 13:25:19 +000019#include "art_method.h"
Mathieu Chartiere5d80f82015-10-15 17:47:48 -070020#include "base/arena_bit_vector.h"
David Sehr3215fff2018-04-03 17:10:12 -070021#include "base/malloc_arena_pool.h"
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010022#include "stack_map_stream.h"
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010023
24#include "gtest/gtest.h"
25
26namespace art {
27
David Srbecky09ed0982016-02-12 21:58:43 +000028// Check that the stack mask of given stack map is identical
29// to the given bit vector. Returns true if they are same.
30static bool CheckStackMask(
David Srbecky45aa5982016-03-18 02:15:09 +000031 const CodeInfo& code_info,
David Srbecky09ed0982016-02-12 21:58:43 +000032 const StackMap& stack_map,
David Srbecky09ed0982016-02-12 21:58:43 +000033 const BitVector& bit_vector) {
David Srbecky052f8ca2018-04-26 15:42:54 +010034 BitMemoryRegion stack_mask = code_info.GetStackMaskOf(stack_map);
David Srbecky4b59d102018-05-29 21:46:10 +000035 if (bit_vector.GetNumberOfBits() > stack_mask.size_in_bits()) {
David Srbecky09ed0982016-02-12 21:58:43 +000036 return false;
37 }
David Srbecky4b59d102018-05-29 21:46:10 +000038 for (size_t i = 0; i < stack_mask.size_in_bits(); ++i) {
David Srbecky45aa5982016-03-18 02:15:09 +000039 if (stack_mask.LoadBit(i) != bit_vector.IsBitSet(i)) {
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010040 return false;
41 }
42 }
43 return true;
44}
45
Roland Levillaina552e1c2015-03-26 15:01:03 +000046using Kind = DexRegisterLocation::Kind;
47
David Srbeckyd775f962018-05-30 18:12:52 +010048constexpr static uint32_t kPcAlign = GetInstructionSetInstructionAlignment(kRuntimeISA);
49
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010050TEST(StackMapTest, Test1) {
David Sehr3215fff2018-04-03 17:10:12 -070051 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +010052 ArenaStack arena_stack(&pool);
53 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +010054 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +010055 stream.BeginMethod(32, 0, 0, 2);
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010056
Vladimir Marko69d310e2017-10-09 14:12:23 +010057 ArenaBitVector sp_mask(&allocator, 0, false);
Roland Levillain12baf472015-03-05 12:41:42 +000058 size_t number_of_dex_registers = 2;
David Srbeckyf6ba5b32018-06-23 22:05:49 +010059 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +010060 stream.AddDexRegisterEntry(Kind::kInStack, 0); // Short location.
61 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Short location.
Calin Juravle4f46ac52015-04-23 18:47:21 +010062 stream.EndStackMapEntry();
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010063
David Srbeckyf6ba5b32018-06-23 22:05:49 +010064 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +010065 ScopedArenaVector<uint8_t> memory = stream.Encode();
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010066
David Srbeckye7a91942018-08-01 17:23:53 +010067 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +010068 ASSERT_EQ(1u, code_info.GetNumberOfStackMaps());
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010069
David Srbecky052f8ca2018-04-26 15:42:54 +010070 uint32_t number_of_catalog_entries = code_info.GetNumberOfLocationCatalogEntries();
David Srbecky09ed0982016-02-12 21:58:43 +000071 ASSERT_EQ(2u, number_of_catalog_entries);
Roland Levillaina552e1c2015-03-26 15:01:03 +000072
David Srbecky052f8ca2018-04-26 15:42:54 +010073 StackMap stack_map = code_info.GetStackMapAt(0);
74 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
David Srbeckyd775f962018-05-30 18:12:52 +010075 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +010076 ASSERT_EQ(0u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +010077 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +010078 ASSERT_EQ(0x3u, code_info.GetRegisterMaskOf(stack_map));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010079
David Srbecky052f8ca2018-04-26 15:42:54 +010080 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +010081
David Srbecky052f8ca2018-04-26 15:42:54 +010082 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +010083 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
84 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +010085 ASSERT_TRUE(dex_register_map[0].IsLive());
86 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +010087 ASSERT_EQ(2u, dex_register_map.GetNumberOfLiveDexRegisters());
Roland Levillaina552e1c2015-03-26 15:01:03 +000088
David Srbeckye1402122018-06-13 18:20:45 +010089 ASSERT_EQ(Kind::kInStack, dex_register_map[0].GetKind());
90 ASSERT_EQ(Kind::kConstant, dex_register_map[1].GetKind());
91 ASSERT_EQ(0, dex_register_map[0].GetStackOffsetInBytes());
92 ASSERT_EQ(-2, dex_register_map[1].GetConstant());
Roland Levillaina552e1c2015-03-26 15:01:03 +000093
David Srbecky71ec1cc2018-05-18 15:57:25 +010094 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(0);
95 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(1);
Roland Levillaina552e1c2015-03-26 15:01:03 +000096 ASSERT_EQ(Kind::kInStack, location0.GetKind());
97 ASSERT_EQ(Kind::kConstant, location1.GetKind());
Roland Levillaina2d8ec62015-03-12 15:25:29 +000098 ASSERT_EQ(0, location0.GetValue());
99 ASSERT_EQ(-2, location1.GetValue());
Roland Levillain12baf472015-03-05 12:41:42 +0000100
David Srbecky052f8ca2018-04-26 15:42:54 +0100101 ASSERT_FALSE(stack_map.HasInlineInfo());
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100102}
103
104TEST(StackMapTest, Test2) {
David Sehr3215fff2018-04-03 17:10:12 -0700105 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100106 ArenaStack arena_stack(&pool);
107 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100108 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100109 stream.BeginMethod(32, 0, 0, 2);
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000110 ArtMethod art_method;
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100111
Vladimir Marko69d310e2017-10-09 14:12:23 +0100112 ArenaBitVector sp_mask1(&allocator, 0, true);
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100113 sp_mask1.SetBit(2);
114 sp_mask1.SetBit(4);
Roland Levillain12baf472015-03-05 12:41:42 +0000115 size_t number_of_dex_registers = 2;
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100116 size_t number_of_dex_registers_in_inline_info = 0;
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100117 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100118 stream.AddDexRegisterEntry(Kind::kInStack, 0); // Short location.
119 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000120 stream.BeginInlineInfoEntry(&art_method, 3, number_of_dex_registers_in_inline_info);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100121 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000122 stream.BeginInlineInfoEntry(&art_method, 2, number_of_dex_registers_in_inline_info);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100123 stream.EndInlineInfoEntry();
Calin Juravle4f46ac52015-04-23 18:47:21 +0100124 stream.EndStackMapEntry();
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100125
Vladimir Marko69d310e2017-10-09 14:12:23 +0100126 ArenaBitVector sp_mask2(&allocator, 0, true);
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100127 sp_mask2.SetBit(3);
David Brazdilf10a25f2015-06-02 14:29:52 +0100128 sp_mask2.SetBit(8);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100129 stream.BeginStackMapEntry(1, 128 * kPcAlign, 0xFF, &sp_mask2);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100130 stream.AddDexRegisterEntry(Kind::kInRegister, 18); // Short location.
131 stream.AddDexRegisterEntry(Kind::kInFpuRegister, 3); // Short location.
Calin Juravle4f46ac52015-04-23 18:47:21 +0100132 stream.EndStackMapEntry();
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100133
Vladimir Marko69d310e2017-10-09 14:12:23 +0100134 ArenaBitVector sp_mask3(&allocator, 0, true);
David Brazdild9cb68e2015-08-25 13:52:43 +0100135 sp_mask3.SetBit(1);
136 sp_mask3.SetBit(5);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100137 stream.BeginStackMapEntry(2, 192 * kPcAlign, 0xAB, &sp_mask3);
David Brazdild9cb68e2015-08-25 13:52:43 +0100138 stream.AddDexRegisterEntry(Kind::kInRegister, 6); // Short location.
139 stream.AddDexRegisterEntry(Kind::kInRegisterHigh, 8); // Short location.
140 stream.EndStackMapEntry();
141
Vladimir Marko69d310e2017-10-09 14:12:23 +0100142 ArenaBitVector sp_mask4(&allocator, 0, true);
David Brazdild9cb68e2015-08-25 13:52:43 +0100143 sp_mask4.SetBit(6);
144 sp_mask4.SetBit(7);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100145 stream.BeginStackMapEntry(3, 256 * kPcAlign, 0xCD, &sp_mask4);
David Brazdild9cb68e2015-08-25 13:52:43 +0100146 stream.AddDexRegisterEntry(Kind::kInFpuRegister, 3); // Short location, same in stack map 2.
147 stream.AddDexRegisterEntry(Kind::kInFpuRegisterHigh, 1); // Short location.
148 stream.EndStackMapEntry();
149
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100150 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100151 ScopedArenaVector<uint8_t> memory = stream.Encode();
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100152
David Srbeckye7a91942018-08-01 17:23:53 +0100153 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +0100154 ASSERT_EQ(4u, code_info.GetNumberOfStackMaps());
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100155
David Srbecky052f8ca2018-04-26 15:42:54 +0100156 uint32_t number_of_catalog_entries = code_info.GetNumberOfLocationCatalogEntries();
David Srbecky09ed0982016-02-12 21:58:43 +0000157 ASSERT_EQ(7u, number_of_catalog_entries);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000158
Roland Levillain12baf472015-03-05 12:41:42 +0000159 // First stack map.
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000160 {
David Srbecky052f8ca2018-04-26 15:42:54 +0100161 StackMap stack_map = code_info.GetStackMapAt(0);
162 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
David Srbeckyd775f962018-05-30 18:12:52 +0100163 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100164 ASSERT_EQ(0u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100165 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100166 ASSERT_EQ(0x3u, code_info.GetRegisterMaskOf(stack_map));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100167
David Srbecky052f8ca2018-04-26 15:42:54 +0100168 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask1));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100169
David Srbecky052f8ca2018-04-26 15:42:54 +0100170 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100171 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
172 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100173 ASSERT_TRUE(dex_register_map[0].IsLive());
174 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100175 ASSERT_EQ(2u, dex_register_map.GetNumberOfLiveDexRegisters());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000176
David Srbeckye1402122018-06-13 18:20:45 +0100177 ASSERT_EQ(Kind::kInStack, dex_register_map[0].GetKind());
178 ASSERT_EQ(Kind::kConstant, dex_register_map[1].GetKind());
179 ASSERT_EQ(0, dex_register_map[0].GetStackOffsetInBytes());
180 ASSERT_EQ(-2, dex_register_map[1].GetConstant());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000181
David Srbecky71ec1cc2018-05-18 15:57:25 +0100182 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(0);
183 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(1);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000184 ASSERT_EQ(Kind::kInStack, location0.GetKind());
185 ASSERT_EQ(Kind::kConstant, location1.GetKind());
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000186 ASSERT_EQ(0, location0.GetValue());
187 ASSERT_EQ(-2, location1.GetValue());
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100188
David Srbecky052f8ca2018-04-26 15:42:54 +0100189 ASSERT_TRUE(stack_map.HasInlineInfo());
David Srbecky93bd3612018-07-02 19:30:18 +0100190 auto inline_infos = code_info.GetInlineInfosOf(stack_map);
191 ASSERT_EQ(2u, inline_infos.size());
192 ASSERT_EQ(3u, inline_infos[0].GetDexPc());
193 ASSERT_EQ(2u, inline_infos[1].GetDexPc());
194 ASSERT_TRUE(inline_infos[0].EncodesArtMethod());
195 ASSERT_TRUE(inline_infos[1].EncodesArtMethod());
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000196 }
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100197
Roland Levillain12baf472015-03-05 12:41:42 +0000198 // Second stack map.
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000199 {
David Srbecky052f8ca2018-04-26 15:42:54 +0100200 StackMap stack_map = code_info.GetStackMapAt(1);
201 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(1u)));
David Srbeckyd775f962018-05-30 18:12:52 +0100202 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(128u * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100203 ASSERT_EQ(1u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100204 ASSERT_EQ(128u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100205 ASSERT_EQ(0xFFu, code_info.GetRegisterMaskOf(stack_map));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100206
David Srbecky052f8ca2018-04-26 15:42:54 +0100207 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask2));
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100208
David Srbecky052f8ca2018-04-26 15:42:54 +0100209 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100210 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
211 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100212 ASSERT_TRUE(dex_register_map[0].IsLive());
213 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100214 ASSERT_EQ(2u, dex_register_map.GetNumberOfLiveDexRegisters());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000215
David Srbeckye1402122018-06-13 18:20:45 +0100216 ASSERT_EQ(Kind::kInRegister, dex_register_map[0].GetKind());
217 ASSERT_EQ(Kind::kInFpuRegister, dex_register_map[1].GetKind());
218 ASSERT_EQ(18, dex_register_map[0].GetMachineRegister());
219 ASSERT_EQ(3, dex_register_map[1].GetMachineRegister());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000220
David Srbecky71ec1cc2018-05-18 15:57:25 +0100221 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(2);
222 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(3);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000223 ASSERT_EQ(Kind::kInRegister, location0.GetKind());
224 ASSERT_EQ(Kind::kInFpuRegister, location1.GetKind());
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000225 ASSERT_EQ(18, location0.GetValue());
226 ASSERT_EQ(3, location1.GetValue());
Roland Levillain12baf472015-03-05 12:41:42 +0000227
David Srbecky052f8ca2018-04-26 15:42:54 +0100228 ASSERT_FALSE(stack_map.HasInlineInfo());
Roland Levillaina2d8ec62015-03-12 15:25:29 +0000229 }
David Brazdild9cb68e2015-08-25 13:52:43 +0100230
231 // Third stack map.
232 {
David Srbecky052f8ca2018-04-26 15:42:54 +0100233 StackMap stack_map = code_info.GetStackMapAt(2);
234 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(2u)));
David Srbeckyd775f962018-05-30 18:12:52 +0100235 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(192u * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100236 ASSERT_EQ(2u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100237 ASSERT_EQ(192u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100238 ASSERT_EQ(0xABu, code_info.GetRegisterMaskOf(stack_map));
David Brazdild9cb68e2015-08-25 13:52:43 +0100239
David Srbecky052f8ca2018-04-26 15:42:54 +0100240 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask3));
David Brazdild9cb68e2015-08-25 13:52:43 +0100241
David Srbecky052f8ca2018-04-26 15:42:54 +0100242 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100243 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
244 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100245 ASSERT_TRUE(dex_register_map[0].IsLive());
246 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100247 ASSERT_EQ(2u, dex_register_map.GetNumberOfLiveDexRegisters());
David Brazdild9cb68e2015-08-25 13:52:43 +0100248
David Srbeckye1402122018-06-13 18:20:45 +0100249 ASSERT_EQ(Kind::kInRegister, dex_register_map[0].GetKind());
250 ASSERT_EQ(Kind::kInRegisterHigh, dex_register_map[1].GetKind());
251 ASSERT_EQ(6, dex_register_map[0].GetMachineRegister());
252 ASSERT_EQ(8, dex_register_map[1].GetMachineRegister());
David Brazdild9cb68e2015-08-25 13:52:43 +0100253
David Srbecky71ec1cc2018-05-18 15:57:25 +0100254 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(4);
255 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(5);
David Brazdild9cb68e2015-08-25 13:52:43 +0100256 ASSERT_EQ(Kind::kInRegister, location0.GetKind());
257 ASSERT_EQ(Kind::kInRegisterHigh, location1.GetKind());
David Brazdild9cb68e2015-08-25 13:52:43 +0100258 ASSERT_EQ(6, location0.GetValue());
259 ASSERT_EQ(8, location1.GetValue());
260
David Srbecky052f8ca2018-04-26 15:42:54 +0100261 ASSERT_FALSE(stack_map.HasInlineInfo());
David Brazdild9cb68e2015-08-25 13:52:43 +0100262 }
263
264 // Fourth stack map.
265 {
David Srbecky052f8ca2018-04-26 15:42:54 +0100266 StackMap stack_map = code_info.GetStackMapAt(3);
267 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(3u)));
David Srbeckyd775f962018-05-30 18:12:52 +0100268 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(256u * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100269 ASSERT_EQ(3u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100270 ASSERT_EQ(256u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100271 ASSERT_EQ(0xCDu, code_info.GetRegisterMaskOf(stack_map));
David Brazdild9cb68e2015-08-25 13:52:43 +0100272
David Srbecky052f8ca2018-04-26 15:42:54 +0100273 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask4));
David Brazdild9cb68e2015-08-25 13:52:43 +0100274
David Srbecky052f8ca2018-04-26 15:42:54 +0100275 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100276 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
277 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100278 ASSERT_TRUE(dex_register_map[0].IsLive());
279 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100280 ASSERT_EQ(2u, dex_register_map.GetNumberOfLiveDexRegisters());
David Brazdild9cb68e2015-08-25 13:52:43 +0100281
David Srbeckye1402122018-06-13 18:20:45 +0100282 ASSERT_EQ(Kind::kInFpuRegister, dex_register_map[0].GetKind());
283 ASSERT_EQ(Kind::kInFpuRegisterHigh, dex_register_map[1].GetKind());
284 ASSERT_EQ(3, dex_register_map[0].GetMachineRegister());
285 ASSERT_EQ(1, dex_register_map[1].GetMachineRegister());
David Brazdild9cb68e2015-08-25 13:52:43 +0100286
David Srbecky71ec1cc2018-05-18 15:57:25 +0100287 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(3);
288 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(6);
David Brazdild9cb68e2015-08-25 13:52:43 +0100289 ASSERT_EQ(Kind::kInFpuRegister, location0.GetKind());
290 ASSERT_EQ(Kind::kInFpuRegisterHigh, location1.GetKind());
David Brazdild9cb68e2015-08-25 13:52:43 +0100291 ASSERT_EQ(3, location0.GetValue());
292 ASSERT_EQ(1, location1.GetValue());
293
David Srbecky052f8ca2018-04-26 15:42:54 +0100294 ASSERT_FALSE(stack_map.HasInlineInfo());
David Brazdild9cb68e2015-08-25 13:52:43 +0100295 }
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100296}
297
Mathieu Chartier32289082017-02-09 15:57:37 -0800298TEST(StackMapTest, TestDeduplicateInlineInfoDexRegisterMap) {
David Sehr3215fff2018-04-03 17:10:12 -0700299 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100300 ArenaStack arena_stack(&pool);
301 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100302 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100303 stream.BeginMethod(32, 0, 0, 2);
Mathieu Chartier32289082017-02-09 15:57:37 -0800304 ArtMethod art_method;
305
Vladimir Marko69d310e2017-10-09 14:12:23 +0100306 ArenaBitVector sp_mask1(&allocator, 0, true);
Mathieu Chartier32289082017-02-09 15:57:37 -0800307 sp_mask1.SetBit(2);
308 sp_mask1.SetBit(4);
309 const size_t number_of_dex_registers = 2;
310 const size_t number_of_dex_registers_in_inline_info = 2;
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100311 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask1);
Mathieu Chartier32289082017-02-09 15:57:37 -0800312 stream.AddDexRegisterEntry(Kind::kInStack, 0); // Short location.
313 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
314 stream.BeginInlineInfoEntry(&art_method, 3, number_of_dex_registers_in_inline_info);
315 stream.AddDexRegisterEntry(Kind::kInStack, 0); // Short location.
316 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
317 stream.EndInlineInfoEntry();
318 stream.EndStackMapEntry();
319
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100320 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100321 ScopedArenaVector<uint8_t> memory = stream.Encode();
Mathieu Chartier32289082017-02-09 15:57:37 -0800322
David Srbeckye7a91942018-08-01 17:23:53 +0100323 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +0100324 ASSERT_EQ(1u, code_info.GetNumberOfStackMaps());
Mathieu Chartier32289082017-02-09 15:57:37 -0800325
David Srbecky052f8ca2018-04-26 15:42:54 +0100326 uint32_t number_of_catalog_entries = code_info.GetNumberOfLocationCatalogEntries();
Mathieu Chartier32289082017-02-09 15:57:37 -0800327 ASSERT_EQ(2u, number_of_catalog_entries);
Mathieu Chartier32289082017-02-09 15:57:37 -0800328
329 // First stack map.
330 {
David Srbecky052f8ca2018-04-26 15:42:54 +0100331 StackMap stack_map = code_info.GetStackMapAt(0);
332 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
David Srbeckyd775f962018-05-30 18:12:52 +0100333 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100334 ASSERT_EQ(0u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100335 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100336 ASSERT_EQ(0x3u, code_info.GetRegisterMaskOf(stack_map));
Mathieu Chartier32289082017-02-09 15:57:37 -0800337
David Srbecky052f8ca2018-04-26 15:42:54 +0100338 ASSERT_TRUE(CheckStackMask(code_info, stack_map, sp_mask1));
Mathieu Chartier32289082017-02-09 15:57:37 -0800339
David Srbecky052f8ca2018-04-26 15:42:54 +0100340 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100341 DexRegisterMap map(code_info.GetDexRegisterMapOf(stack_map));
342 ASSERT_EQ(number_of_dex_registers, map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100343 ASSERT_TRUE(map[0].IsLive());
344 ASSERT_TRUE(map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100345 ASSERT_EQ(2u, map.GetNumberOfLiveDexRegisters());
Mathieu Chartier32289082017-02-09 15:57:37 -0800346
David Srbeckye1402122018-06-13 18:20:45 +0100347 ASSERT_EQ(Kind::kInStack, map[0].GetKind());
348 ASSERT_EQ(Kind::kConstant, map[1].GetKind());
349 ASSERT_EQ(0, map[0].GetStackOffsetInBytes());
350 ASSERT_EQ(-2, map[1].GetConstant());
Mathieu Chartier32289082017-02-09 15:57:37 -0800351
David Srbecky71ec1cc2018-05-18 15:57:25 +0100352 DexRegisterLocation location0 = code_info.GetDexRegisterCatalogEntry(0);
353 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(1);
Mathieu Chartier32289082017-02-09 15:57:37 -0800354 ASSERT_EQ(Kind::kInStack, location0.GetKind());
355 ASSERT_EQ(Kind::kConstant, location1.GetKind());
Mathieu Chartier32289082017-02-09 15:57:37 -0800356 ASSERT_EQ(0, location0.GetValue());
357 ASSERT_EQ(-2, location1.GetValue());
Mathieu Chartier32289082017-02-09 15:57:37 -0800358 }
359}
360
Nicolas Geoffrayfead4e42015-03-13 14:39:40 +0000361TEST(StackMapTest, TestNonLiveDexRegisters) {
David Sehr3215fff2018-04-03 17:10:12 -0700362 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100363 ArenaStack arena_stack(&pool);
364 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100365 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100366 stream.BeginMethod(32, 0, 0, 2);
Nicolas Geoffrayfead4e42015-03-13 14:39:40 +0000367
Vladimir Marko69d310e2017-10-09 14:12:23 +0100368 ArenaBitVector sp_mask(&allocator, 0, false);
Nicolas Geoffrayfead4e42015-03-13 14:39:40 +0000369 uint32_t number_of_dex_registers = 2;
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100370 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100371 stream.AddDexRegisterEntry(Kind::kNone, 0); // No location.
372 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
Calin Juravle4f46ac52015-04-23 18:47:21 +0100373 stream.EndStackMapEntry();
Nicolas Geoffrayfead4e42015-03-13 14:39:40 +0000374
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100375 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100376 ScopedArenaVector<uint8_t> memory = stream.Encode();
Nicolas Geoffrayfead4e42015-03-13 14:39:40 +0000377
David Srbeckye7a91942018-08-01 17:23:53 +0100378 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +0100379 ASSERT_EQ(1u, code_info.GetNumberOfStackMaps());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000380
David Srbecky052f8ca2018-04-26 15:42:54 +0100381 uint32_t number_of_catalog_entries = code_info.GetNumberOfLocationCatalogEntries();
David Srbecky09ed0982016-02-12 21:58:43 +0000382 ASSERT_EQ(1u, number_of_catalog_entries);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000383
David Srbecky052f8ca2018-04-26 15:42:54 +0100384 StackMap stack_map = code_info.GetStackMapAt(0);
385 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
David Srbeckyd775f962018-05-30 18:12:52 +0100386 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100387 ASSERT_EQ(0u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100388 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100389 ASSERT_EQ(0x3u, code_info.GetRegisterMaskOf(stack_map));
Roland Levillaina552e1c2015-03-26 15:01:03 +0000390
David Srbecky052f8ca2018-04-26 15:42:54 +0100391 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbeckyfd89b072018-06-03 12:00:22 +0100392 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
393 ASSERT_EQ(number_of_dex_registers, dex_register_map.size());
David Srbeckye1402122018-06-13 18:20:45 +0100394 ASSERT_FALSE(dex_register_map[0].IsLive());
395 ASSERT_TRUE(dex_register_map[1].IsLive());
David Srbecky71ec1cc2018-05-18 15:57:25 +0100396 ASSERT_EQ(1u, dex_register_map.GetNumberOfLiveDexRegisters());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000397
David Srbeckye1402122018-06-13 18:20:45 +0100398 ASSERT_EQ(Kind::kNone, dex_register_map[0].GetKind());
399 ASSERT_EQ(Kind::kConstant, dex_register_map[1].GetKind());
400 ASSERT_EQ(-2, dex_register_map[1].GetConstant());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000401
David Srbecky71ec1cc2018-05-18 15:57:25 +0100402 DexRegisterLocation location1 = code_info.GetDexRegisterCatalogEntry(0);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000403 ASSERT_EQ(Kind::kConstant, location1.GetKind());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000404 ASSERT_EQ(-2, location1.GetValue());
405
David Srbecky052f8ca2018-04-26 15:42:54 +0100406 ASSERT_FALSE(stack_map.HasInlineInfo());
Nicolas Geoffray004c2302015-03-20 10:06:38 +0000407}
408
Calin Juravle6ae70962015-03-18 16:31:28 +0000409TEST(StackMapTest, TestShareDexRegisterMap) {
David Sehr3215fff2018-04-03 17:10:12 -0700410 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100411 ArenaStack arena_stack(&pool);
412 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100413 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100414 stream.BeginMethod(32, 0, 0, 2);
Calin Juravle6ae70962015-03-18 16:31:28 +0000415
Vladimir Marko69d310e2017-10-09 14:12:23 +0100416 ArenaBitVector sp_mask(&allocator, 0, false);
Calin Juravle6ae70962015-03-18 16:31:28 +0000417 uint32_t number_of_dex_registers = 2;
418 // First stack map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100419 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100420 stream.AddDexRegisterEntry(Kind::kInRegister, 0); // Short location.
421 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
Calin Juravle4f46ac52015-04-23 18:47:21 +0100422 stream.EndStackMapEntry();
Calin Juravle6ae70962015-03-18 16:31:28 +0000423 // Second stack map, which should share the same dex register map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100424 stream.BeginStackMapEntry(0, 65 * kPcAlign, 0x3, &sp_mask);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100425 stream.AddDexRegisterEntry(Kind::kInRegister, 0); // Short location.
426 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
Calin Juravle4f46ac52015-04-23 18:47:21 +0100427 stream.EndStackMapEntry();
Calin Juravle6ae70962015-03-18 16:31:28 +0000428 // Third stack map (doesn't share the dex register map).
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100429 stream.BeginStackMapEntry(0, 66 * kPcAlign, 0x3, &sp_mask);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100430 stream.AddDexRegisterEntry(Kind::kInRegister, 2); // Short location.
431 stream.AddDexRegisterEntry(Kind::kConstant, -2); // Large location.
Calin Juravle4f46ac52015-04-23 18:47:21 +0100432 stream.EndStackMapEntry();
Calin Juravle6ae70962015-03-18 16:31:28 +0000433
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100434 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100435 ScopedArenaVector<uint8_t> memory = stream.Encode();
Calin Juravle6ae70962015-03-18 16:31:28 +0000436
David Srbeckye7a91942018-08-01 17:23:53 +0100437 CodeInfo ci(memory.data());
David Brazdilf677ebf2015-05-29 16:29:43 +0100438
Calin Juravle6ae70962015-03-18 16:31:28 +0000439 // Verify first stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100440 StackMap sm0 = ci.GetStackMapAt(0);
David Srbeckyfd89b072018-06-03 12:00:22 +0100441 DexRegisterMap dex_registers0 = ci.GetDexRegisterMapOf(sm0);
442 ASSERT_EQ(number_of_dex_registers, dex_registers0.size());
David Srbeckye1402122018-06-13 18:20:45 +0100443 ASSERT_EQ(0, dex_registers0[0].GetMachineRegister());
444 ASSERT_EQ(-2, dex_registers0[1].GetConstant());
Calin Juravle6ae70962015-03-18 16:31:28 +0000445
446 // Verify second stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100447 StackMap sm1 = ci.GetStackMapAt(1);
David Srbeckyfd89b072018-06-03 12:00:22 +0100448 DexRegisterMap dex_registers1 = ci.GetDexRegisterMapOf(sm1);
449 ASSERT_EQ(number_of_dex_registers, dex_registers1.size());
David Srbeckye1402122018-06-13 18:20:45 +0100450 ASSERT_EQ(0, dex_registers1[0].GetMachineRegister());
451 ASSERT_EQ(-2, dex_registers1[1].GetConstant());
Calin Juravle6ae70962015-03-18 16:31:28 +0000452
453 // Verify third stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100454 StackMap sm2 = ci.GetStackMapAt(2);
David Srbeckyfd89b072018-06-03 12:00:22 +0100455 DexRegisterMap dex_registers2 = ci.GetDexRegisterMapOf(sm2);
456 ASSERT_EQ(number_of_dex_registers, dex_registers2.size());
David Srbeckye1402122018-06-13 18:20:45 +0100457 ASSERT_EQ(2, dex_registers2[0].GetMachineRegister());
458 ASSERT_EQ(-2, dex_registers2[1].GetConstant());
Calin Juravle6ae70962015-03-18 16:31:28 +0000459
David Srbecky6de88332018-06-03 12:00:11 +0100460 // Verify dex register mask offsets.
461 ASSERT_FALSE(sm1.HasDexRegisterMaskIndex()); // No delta.
462 ASSERT_TRUE(sm2.HasDexRegisterMaskIndex()); // Has delta.
Calin Juravle6ae70962015-03-18 16:31:28 +0000463}
464
Roland Levillaina552e1c2015-03-26 15:01:03 +0000465TEST(StackMapTest, TestNoDexRegisterMap) {
David Sehr3215fff2018-04-03 17:10:12 -0700466 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100467 ArenaStack arena_stack(&pool);
468 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100469 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100470 stream.BeginMethod(32, 0, 0, 1);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000471
Vladimir Marko69d310e2017-10-09 14:12:23 +0100472 ArenaBitVector sp_mask(&allocator, 0, false);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000473 uint32_t number_of_dex_registers = 0;
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100474 stream.BeginStackMapEntry(0, 64 * kPcAlign, 0x3, &sp_mask);
Calin Juravle4f46ac52015-04-23 18:47:21 +0100475 stream.EndStackMapEntry();
Roland Levillaina552e1c2015-03-26 15:01:03 +0000476
Nicolas Geoffray012fc4e2016-01-08 15:58:19 +0000477 number_of_dex_registers = 1;
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100478 stream.BeginStackMapEntry(1, 68 * kPcAlign, 0x4, &sp_mask);
David Srbecky71ec1cc2018-05-18 15:57:25 +0100479 stream.AddDexRegisterEntry(Kind::kNone, 0);
Nicolas Geoffray012fc4e2016-01-08 15:58:19 +0000480 stream.EndStackMapEntry();
481
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100482 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100483 ScopedArenaVector<uint8_t> memory = stream.Encode();
Roland Levillaina552e1c2015-03-26 15:01:03 +0000484
David Srbeckye7a91942018-08-01 17:23:53 +0100485 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +0100486 ASSERT_EQ(2u, code_info.GetNumberOfStackMaps());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000487
David Srbecky052f8ca2018-04-26 15:42:54 +0100488 uint32_t number_of_catalog_entries = code_info.GetNumberOfLocationCatalogEntries();
David Srbecky09ed0982016-02-12 21:58:43 +0000489 ASSERT_EQ(0u, number_of_catalog_entries);
Roland Levillaina552e1c2015-03-26 15:01:03 +0000490
David Srbecky052f8ca2018-04-26 15:42:54 +0100491 StackMap stack_map = code_info.GetStackMapAt(0);
492 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
David Srbeckyd775f962018-05-30 18:12:52 +0100493 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100494 ASSERT_EQ(0u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100495 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100496 ASSERT_EQ(0x3u, code_info.GetRegisterMaskOf(stack_map));
Roland Levillaina552e1c2015-03-26 15:01:03 +0000497
David Srbecky052f8ca2018-04-26 15:42:54 +0100498 ASSERT_FALSE(stack_map.HasDexRegisterMap());
499 ASSERT_FALSE(stack_map.HasInlineInfo());
Nicolas Geoffray012fc4e2016-01-08 15:58:19 +0000500
David Srbecky052f8ca2018-04-26 15:42:54 +0100501 stack_map = code_info.GetStackMapAt(1);
502 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(1)));
David Srbeckyd775f962018-05-30 18:12:52 +0100503 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(68 * kPcAlign)));
David Srbecky052f8ca2018-04-26 15:42:54 +0100504 ASSERT_EQ(1u, stack_map.GetDexPc());
David Srbeckyd775f962018-05-30 18:12:52 +0100505 ASSERT_EQ(68u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
David Srbecky052f8ca2018-04-26 15:42:54 +0100506 ASSERT_EQ(0x4u, code_info.GetRegisterMaskOf(stack_map));
Nicolas Geoffray012fc4e2016-01-08 15:58:19 +0000507
David Srbecky71ec1cc2018-05-18 15:57:25 +0100508 ASSERT_TRUE(stack_map.HasDexRegisterMap());
David Srbecky052f8ca2018-04-26 15:42:54 +0100509 ASSERT_FALSE(stack_map.HasInlineInfo());
Roland Levillaina552e1c2015-03-26 15:01:03 +0000510}
511
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100512TEST(StackMapTest, InlineTest) {
David Sehr3215fff2018-04-03 17:10:12 -0700513 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100514 ArenaStack arena_stack(&pool);
515 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100516 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100517 stream.BeginMethod(32, 0, 0, 2);
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000518 ArtMethod art_method;
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100519
Vladimir Marko69d310e2017-10-09 14:12:23 +0100520 ArenaBitVector sp_mask1(&allocator, 0, true);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100521 sp_mask1.SetBit(2);
522 sp_mask1.SetBit(4);
523
524 // First stack map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100525 stream.BeginStackMapEntry(0, 10 * kPcAlign, 0x3, &sp_mask1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100526 stream.AddDexRegisterEntry(Kind::kInStack, 0);
527 stream.AddDexRegisterEntry(Kind::kConstant, 4);
528
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000529 stream.BeginInlineInfoEntry(&art_method, 2, 1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100530 stream.AddDexRegisterEntry(Kind::kInStack, 8);
531 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000532 stream.BeginInlineInfoEntry(&art_method, 3, 3);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100533 stream.AddDexRegisterEntry(Kind::kInStack, 16);
534 stream.AddDexRegisterEntry(Kind::kConstant, 20);
535 stream.AddDexRegisterEntry(Kind::kInRegister, 15);
536 stream.EndInlineInfoEntry();
537
538 stream.EndStackMapEntry();
539
540 // Second stack map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100541 stream.BeginStackMapEntry(2, 22 * kPcAlign, 0x3, &sp_mask1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100542 stream.AddDexRegisterEntry(Kind::kInStack, 56);
543 stream.AddDexRegisterEntry(Kind::kConstant, 0);
544
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000545 stream.BeginInlineInfoEntry(&art_method, 2, 1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100546 stream.AddDexRegisterEntry(Kind::kInStack, 12);
547 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000548 stream.BeginInlineInfoEntry(&art_method, 3, 3);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100549 stream.AddDexRegisterEntry(Kind::kInStack, 80);
550 stream.AddDexRegisterEntry(Kind::kConstant, 10);
551 stream.AddDexRegisterEntry(Kind::kInRegister, 5);
552 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000553 stream.BeginInlineInfoEntry(&art_method, 5, 0);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100554 stream.EndInlineInfoEntry();
555
556 stream.EndStackMapEntry();
557
558 // Third stack map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100559 stream.BeginStackMapEntry(4, 56 * kPcAlign, 0x3, &sp_mask1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100560 stream.AddDexRegisterEntry(Kind::kNone, 0);
561 stream.AddDexRegisterEntry(Kind::kConstant, 4);
562 stream.EndStackMapEntry();
563
564 // Fourth stack map.
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100565 stream.BeginStackMapEntry(6, 78 * kPcAlign, 0x3, &sp_mask1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100566 stream.AddDexRegisterEntry(Kind::kInStack, 56);
567 stream.AddDexRegisterEntry(Kind::kConstant, 0);
568
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000569 stream.BeginInlineInfoEntry(&art_method, 2, 0);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100570 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000571 stream.BeginInlineInfoEntry(&art_method, 5, 1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100572 stream.AddDexRegisterEntry(Kind::kInRegister, 2);
573 stream.EndInlineInfoEntry();
Nicolas Geoffray5d37c152017-01-12 13:25:19 +0000574 stream.BeginInlineInfoEntry(&art_method, 10, 2);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100575 stream.AddDexRegisterEntry(Kind::kNone, 0);
576 stream.AddDexRegisterEntry(Kind::kInRegister, 3);
577 stream.EndInlineInfoEntry();
578
579 stream.EndStackMapEntry();
580
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100581 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100582 ScopedArenaVector<uint8_t> memory = stream.Encode();
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100583
David Srbeckye7a91942018-08-01 17:23:53 +0100584 CodeInfo ci(memory.data());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100585
586 {
587 // Verify first stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100588 StackMap sm0 = ci.GetStackMapAt(0);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100589
David Srbeckyfd89b072018-06-03 12:00:22 +0100590 DexRegisterMap dex_registers0 = ci.GetDexRegisterMapOf(sm0);
591 ASSERT_EQ(2u, dex_registers0.size());
David Srbeckye1402122018-06-13 18:20:45 +0100592 ASSERT_EQ(0, dex_registers0[0].GetStackOffsetInBytes());
593 ASSERT_EQ(4, dex_registers0[1].GetConstant());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100594
David Srbecky93bd3612018-07-02 19:30:18 +0100595 auto inline_infos = ci.GetInlineInfosOf(sm0);
596 ASSERT_EQ(2u, inline_infos.size());
597 ASSERT_EQ(2u, inline_infos[0].GetDexPc());
598 ASSERT_TRUE(inline_infos[0].EncodesArtMethod());
599 ASSERT_EQ(3u, inline_infos[1].GetDexPc());
600 ASSERT_TRUE(inline_infos[1].EncodesArtMethod());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100601
David Srbecky93bd3612018-07-02 19:30:18 +0100602 DexRegisterMap dex_registers1 = ci.GetInlineDexRegisterMapOf(sm0, inline_infos[0]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100603 ASSERT_EQ(1u, dex_registers1.size());
David Srbeckye1402122018-06-13 18:20:45 +0100604 ASSERT_EQ(8, dex_registers1[0].GetStackOffsetInBytes());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100605
David Srbecky93bd3612018-07-02 19:30:18 +0100606 DexRegisterMap dex_registers2 = ci.GetInlineDexRegisterMapOf(sm0, inline_infos[1]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100607 ASSERT_EQ(3u, dex_registers2.size());
David Srbeckye1402122018-06-13 18:20:45 +0100608 ASSERT_EQ(16, dex_registers2[0].GetStackOffsetInBytes());
609 ASSERT_EQ(20, dex_registers2[1].GetConstant());
610 ASSERT_EQ(15, dex_registers2[2].GetMachineRegister());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100611 }
612
613 {
614 // Verify second stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100615 StackMap sm1 = ci.GetStackMapAt(1);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100616
David Srbeckyfd89b072018-06-03 12:00:22 +0100617 DexRegisterMap dex_registers0 = ci.GetDexRegisterMapOf(sm1);
618 ASSERT_EQ(2u, dex_registers0.size());
David Srbeckye1402122018-06-13 18:20:45 +0100619 ASSERT_EQ(56, dex_registers0[0].GetStackOffsetInBytes());
620 ASSERT_EQ(0, dex_registers0[1].GetConstant());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100621
David Srbecky93bd3612018-07-02 19:30:18 +0100622 auto inline_infos = ci.GetInlineInfosOf(sm1);
623 ASSERT_EQ(3u, inline_infos.size());
624 ASSERT_EQ(2u, inline_infos[0].GetDexPc());
625 ASSERT_TRUE(inline_infos[0].EncodesArtMethod());
626 ASSERT_EQ(3u, inline_infos[1].GetDexPc());
627 ASSERT_TRUE(inline_infos[1].EncodesArtMethod());
628 ASSERT_EQ(5u, inline_infos[2].GetDexPc());
629 ASSERT_TRUE(inline_infos[2].EncodesArtMethod());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100630
David Srbecky93bd3612018-07-02 19:30:18 +0100631 DexRegisterMap dex_registers1 = ci.GetInlineDexRegisterMapOf(sm1, inline_infos[0]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100632 ASSERT_EQ(1u, dex_registers1.size());
David Srbeckye1402122018-06-13 18:20:45 +0100633 ASSERT_EQ(12, dex_registers1[0].GetStackOffsetInBytes());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100634
David Srbecky93bd3612018-07-02 19:30:18 +0100635 DexRegisterMap dex_registers2 = ci.GetInlineDexRegisterMapOf(sm1, inline_infos[1]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100636 ASSERT_EQ(3u, dex_registers2.size());
David Srbeckye1402122018-06-13 18:20:45 +0100637 ASSERT_EQ(80, dex_registers2[0].GetStackOffsetInBytes());
638 ASSERT_EQ(10, dex_registers2[1].GetConstant());
639 ASSERT_EQ(5, dex_registers2[2].GetMachineRegister());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100640 }
641
642 {
643 // Verify third stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100644 StackMap sm2 = ci.GetStackMapAt(2);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100645
David Srbeckyfd89b072018-06-03 12:00:22 +0100646 DexRegisterMap dex_registers0 = ci.GetDexRegisterMapOf(sm2);
647 ASSERT_EQ(2u, dex_registers0.size());
David Srbeckye1402122018-06-13 18:20:45 +0100648 ASSERT_FALSE(dex_registers0[0].IsLive());
649 ASSERT_EQ(4, dex_registers0[1].GetConstant());
David Srbecky052f8ca2018-04-26 15:42:54 +0100650 ASSERT_FALSE(sm2.HasInlineInfo());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100651 }
652
653 {
654 // Verify fourth stack map.
David Srbecky052f8ca2018-04-26 15:42:54 +0100655 StackMap sm3 = ci.GetStackMapAt(3);
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100656
David Srbeckyfd89b072018-06-03 12:00:22 +0100657 DexRegisterMap dex_registers0 = ci.GetDexRegisterMapOf(sm3);
658 ASSERT_EQ(2u, dex_registers0.size());
David Srbeckye1402122018-06-13 18:20:45 +0100659 ASSERT_EQ(56, dex_registers0[0].GetStackOffsetInBytes());
660 ASSERT_EQ(0, dex_registers0[1].GetConstant());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100661
David Srbecky93bd3612018-07-02 19:30:18 +0100662 auto inline_infos = ci.GetInlineInfosOf(sm3);
663 ASSERT_EQ(3u, inline_infos.size());
664 ASSERT_EQ(2u, inline_infos[0].GetDexPc());
665 ASSERT_TRUE(inline_infos[0].EncodesArtMethod());
666 ASSERT_EQ(5u, inline_infos[1].GetDexPc());
667 ASSERT_TRUE(inline_infos[1].EncodesArtMethod());
668 ASSERT_EQ(10u, inline_infos[2].GetDexPc());
669 ASSERT_TRUE(inline_infos[2].EncodesArtMethod());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100670
David Srbecky93bd3612018-07-02 19:30:18 +0100671 DexRegisterMap dex_registers1 = ci.GetInlineDexRegisterMapOf(sm3, inline_infos[1]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100672 ASSERT_EQ(1u, dex_registers1.size());
David Srbeckye1402122018-06-13 18:20:45 +0100673 ASSERT_EQ(2, dex_registers1[0].GetMachineRegister());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100674
David Srbecky93bd3612018-07-02 19:30:18 +0100675 DexRegisterMap dex_registers2 = ci.GetInlineDexRegisterMapOf(sm3, inline_infos[2]);
David Srbeckyfd89b072018-06-03 12:00:22 +0100676 ASSERT_EQ(2u, dex_registers2.size());
David Srbeckye1402122018-06-13 18:20:45 +0100677 ASSERT_FALSE(dex_registers2[0].IsLive());
678 ASSERT_EQ(3, dex_registers2[1].GetMachineRegister());
Nicolas Geoffrayb1d0f3f2015-05-14 12:41:51 +0100679 }
680}
681
David Srbeckyd02b23f2018-05-29 23:27:22 +0100682TEST(StackMapTest, PackedNativePcTest) {
David Srbecky71ec1cc2018-05-18 15:57:25 +0100683 // Test minimum alignments, and decoding.
David Srbeckyd02b23f2018-05-29 23:27:22 +0100684 uint32_t packed_thumb2 =
685 StackMap::PackNativePc(kThumb2InstructionAlignment, InstructionSet::kThumb2);
686 uint32_t packed_arm64 =
687 StackMap::PackNativePc(kArm64InstructionAlignment, InstructionSet::kArm64);
688 uint32_t packed_x86 =
689 StackMap::PackNativePc(kX86InstructionAlignment, InstructionSet::kX86);
690 uint32_t packed_x86_64 =
691 StackMap::PackNativePc(kX86_64InstructionAlignment, InstructionSet::kX86_64);
692 uint32_t packed_mips =
693 StackMap::PackNativePc(kMipsInstructionAlignment, InstructionSet::kMips);
694 uint32_t packed_mips64 =
695 StackMap::PackNativePc(kMips64InstructionAlignment, InstructionSet::kMips64);
696 EXPECT_EQ(StackMap::UnpackNativePc(packed_thumb2, InstructionSet::kThumb2),
697 kThumb2InstructionAlignment);
698 EXPECT_EQ(StackMap::UnpackNativePc(packed_arm64, InstructionSet::kArm64),
699 kArm64InstructionAlignment);
700 EXPECT_EQ(StackMap::UnpackNativePc(packed_x86, InstructionSet::kX86),
701 kX86InstructionAlignment);
702 EXPECT_EQ(StackMap::UnpackNativePc(packed_x86_64, InstructionSet::kX86_64),
703 kX86_64InstructionAlignment);
704 EXPECT_EQ(StackMap::UnpackNativePc(packed_mips, InstructionSet::kMips),
705 kMipsInstructionAlignment);
706 EXPECT_EQ(StackMap::UnpackNativePc(packed_mips64, InstructionSet::kMips64),
707 kMips64InstructionAlignment);
Mathieu Chartiera2f526f2017-01-19 14:48:48 -0800708}
709
David Srbecky45aa5982016-03-18 02:15:09 +0000710TEST(StackMapTest, TestDeduplicateStackMask) {
David Sehr3215fff2018-04-03 17:10:12 -0700711 MallocArenaPool pool;
Vladimir Marko174b2e22017-10-12 13:34:49 +0100712 ArenaStack arena_stack(&pool);
713 ScopedArenaAllocator allocator(&arena_stack);
Vladimir Marko69d310e2017-10-09 14:12:23 +0100714 StackMapStream stream(&allocator, kRuntimeISA);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100715 stream.BeginMethod(32, 0, 0, 0);
David Srbecky45aa5982016-03-18 02:15:09 +0000716
Vladimir Marko69d310e2017-10-09 14:12:23 +0100717 ArenaBitVector sp_mask(&allocator, 0, true);
David Srbecky45aa5982016-03-18 02:15:09 +0000718 sp_mask.SetBit(1);
719 sp_mask.SetBit(4);
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100720 stream.BeginStackMapEntry(0, 4 * kPcAlign, 0x3, &sp_mask);
David Srbecky45aa5982016-03-18 02:15:09 +0000721 stream.EndStackMapEntry();
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100722 stream.BeginStackMapEntry(0, 8 * kPcAlign, 0x3, &sp_mask);
David Srbecky45aa5982016-03-18 02:15:09 +0000723 stream.EndStackMapEntry();
724
David Srbeckyf6ba5b32018-06-23 22:05:49 +0100725 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100726 ScopedArenaVector<uint8_t> memory = stream.Encode();
David Srbecky45aa5982016-03-18 02:15:09 +0000727
David Srbeckye7a91942018-08-01 17:23:53 +0100728 CodeInfo code_info(memory.data());
David Srbecky052f8ca2018-04-26 15:42:54 +0100729 ASSERT_EQ(2u, code_info.GetNumberOfStackMaps());
David Srbecky45aa5982016-03-18 02:15:09 +0000730
David Srbeckyd775f962018-05-30 18:12:52 +0100731 StackMap stack_map1 = code_info.GetStackMapForNativePcOffset(4 * kPcAlign);
732 StackMap stack_map2 = code_info.GetStackMapForNativePcOffset(8 * kPcAlign);
David Srbecky052f8ca2018-04-26 15:42:54 +0100733 EXPECT_EQ(stack_map1.GetStackMaskIndex(),
734 stack_map2.GetStackMaskIndex());
David Srbecky45aa5982016-03-18 02:15:09 +0000735}
736
David Srbeckyb73323c2018-07-15 23:58:44 +0100737TEST(StackMapTest, TestDedupeBitTables) {
738 MallocArenaPool pool;
739 ArenaStack arena_stack(&pool);
740 ScopedArenaAllocator allocator(&arena_stack);
741 StackMapStream stream(&allocator, kRuntimeISA);
742 stream.BeginMethod(32, 0, 0, 2);
743
744 stream.BeginStackMapEntry(0, 64 * kPcAlign);
745 stream.AddDexRegisterEntry(Kind::kInStack, 0);
746 stream.AddDexRegisterEntry(Kind::kConstant, -2);
747 stream.EndStackMapEntry();
748
749 stream.EndMethod();
David Srbeckye7a91942018-08-01 17:23:53 +0100750 ScopedArenaVector<uint8_t> memory = stream.Encode();
David Srbeckyb73323c2018-07-15 23:58:44 +0100751
752 std::vector<uint8_t> out;
753 CodeInfo::DedupeMap dedupe_map;
754 size_t deduped1 = CodeInfo::Dedupe(&out, memory.data(), &dedupe_map);
755 size_t deduped2 = CodeInfo::Dedupe(&out, memory.data(), &dedupe_map);
756
757 for (size_t deduped : { deduped1, deduped2 }) {
758 CodeInfo code_info(out.data() + deduped);
759 ASSERT_EQ(1u, code_info.GetNumberOfStackMaps());
760
761 StackMap stack_map = code_info.GetStackMapAt(0);
762 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0)));
763 ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign)));
764 ASSERT_EQ(0u, stack_map.GetDexPc());
765 ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA));
766
767 ASSERT_TRUE(stack_map.HasDexRegisterMap());
768 DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map);
769
770 ASSERT_EQ(Kind::kInStack, dex_register_map[0].GetKind());
771 ASSERT_EQ(Kind::kConstant, dex_register_map[1].GetKind());
772 ASSERT_EQ(0, dex_register_map[0].GetStackOffsetInBytes());
773 ASSERT_EQ(-2, dex_register_map[1].GetConstant());
774 }
775
776 ASSERT_GT(memory.size() * 2, out.size());
777}
778
Nicolas Geoffray99ea58c2014-07-02 15:08:17 +0100779} // namespace art