diff options
Diffstat (limited to 'runtime/stack_map.h')
-rw-r--r-- | runtime/stack_map.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/runtime/stack_map.h b/runtime/stack_map.h index 13886f2109..28c4b88fb0 100644 --- a/runtime/stack_map.h +++ b/runtime/stack_map.h @@ -17,6 +17,7 @@ #ifndef ART_RUNTIME_STACK_MAP_H_ #define ART_RUNTIME_STACK_MAP_H_ +#include "arch/code_offset.h" #include "base/bit_vector.h" #include "base/bit_utils.h" #include "dex_file.h" @@ -805,12 +806,16 @@ class StackMap { encoding.GetDexPcEncoding().Store(region_, dex_pc); } - ALWAYS_INLINE uint32_t GetNativePcOffset(const StackMapEncoding& encoding) const { - return encoding.GetNativePcEncoding().Load(region_); + ALWAYS_INLINE uint32_t GetNativePcOffset(const StackMapEncoding& encoding, + InstructionSet instruction_set) const { + CodeOffset offset( + CodeOffset::FromCompressedOffset(encoding.GetNativePcEncoding().Load(region_))); + return offset.Uint32Value(instruction_set); } - ALWAYS_INLINE void SetNativePcOffset(const StackMapEncoding& encoding, uint32_t native_pc_offset) { - encoding.GetNativePcEncoding().Store(region_, native_pc_offset); + ALWAYS_INLINE void SetNativePcCodeOffset(const StackMapEncoding& encoding, + CodeOffset native_pc_offset) { + encoding.GetNativePcEncoding().Store(region_, native_pc_offset.CompressedValue()); } ALWAYS_INLINE uint32_t GetDexRegisterMapOffset(const StackMapEncoding& encoding) const { @@ -866,6 +871,7 @@ class StackMap { const CodeInfoEncoding& encoding, uint32_t code_offset, uint16_t number_of_dex_registers, + InstructionSet instruction_set, const std::string& header_suffix = "") const; // Special (invalid) offset for the DexRegisterMapOffset field meaning @@ -1234,15 +1240,16 @@ class CodeInfo { if (stack_map.GetDexPc(stack_map_encoding) == dex_pc) { StackMap other = GetStackMapAt(i + 1, encoding); if (other.GetDexPc(stack_map_encoding) == dex_pc && - other.GetNativePcOffset(stack_map_encoding) == - stack_map.GetNativePcOffset(stack_map_encoding)) { + other.GetNativePcOffset(stack_map_encoding, kRuntimeISA) == + stack_map.GetNativePcOffset(stack_map_encoding, kRuntimeISA)) { DCHECK_EQ(other.GetDexRegisterMapOffset(stack_map_encoding), stack_map.GetDexRegisterMapOffset(stack_map_encoding)); DCHECK(!stack_map.HasInlineInfo(stack_map_encoding)); if (i < e - 2) { // Make sure there are not three identical stack maps following each other. - DCHECK_NE(stack_map.GetNativePcOffset(stack_map_encoding), - GetStackMapAt(i + 2, encoding).GetNativePcOffset(stack_map_encoding)); + DCHECK_NE( + stack_map.GetNativePcOffset(stack_map_encoding, kRuntimeISA), + GetStackMapAt(i + 2, encoding).GetNativePcOffset(stack_map_encoding, kRuntimeISA)); } return stack_map; } @@ -1258,7 +1265,8 @@ class CodeInfo { // we could do binary search. for (size_t i = 0, e = GetNumberOfStackMaps(encoding); i < e; ++i) { StackMap stack_map = GetStackMapAt(i, encoding); - if (stack_map.GetNativePcOffset(encoding.stack_map_encoding) == native_pc_offset) { + if (stack_map.GetNativePcOffset(encoding.stack_map_encoding, kRuntimeISA) == + native_pc_offset) { return stack_map; } } @@ -1273,7 +1281,8 @@ class CodeInfo { void Dump(VariableIndentationOutputStream* vios, uint32_t code_offset, uint16_t number_of_dex_registers, - bool dump_stack_maps) const; + bool dump_stack_maps, + InstructionSet instruction_set) const; // Check that the code info has valid stack map and abort if it does not. void AssertValidStackMap(const CodeInfoEncoding& encoding) const { |