oat_quick_method_header.h revision cbcedbf9382bc773713cd3552ed96f417bf1daeb
1524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray/* 2524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * Copyright (C) 2011 The Android Open Source Project 3524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * 4524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 5524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * you may not use this file except in compliance with the License. 6524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * You may obtain a copy of the License at 7524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * 8524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 9524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * 10524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 11524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 12524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * See the License for the specific language governing permissions and 14524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray * limitations under the License. 15524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray */ 16524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 17524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#ifndef ART_RUNTIME_OAT_QUICK_METHOD_HEADER_H_ 18524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#define ART_RUNTIME_OAT_QUICK_METHOD_HEADER_H_ 19524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 20524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#include "arch/instruction_set.h" 21524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#include "base/macros.h" 22524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#include "quick/quick_method_frame_info.h" 23cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier#include "method_info.h" 24524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#include "stack_map.h" 251dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray#include "utils.h" 26524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 27524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffraynamespace art { 28524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 29524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffrayclass ArtMethod; 30524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 31524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray// OatQuickMethodHeader precedes the raw code chunk generated by the compiler. 32524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffrayclass PACKED(4) OatQuickMethodHeader { 33524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray public: 34cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier OatQuickMethodHeader() = default; 35cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier explicit OatQuickMethodHeader(uint32_t vmap_table_offset, 36cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t method_info_offset, 37cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t frame_size_in_bytes, 38cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t core_spill_mask, 39cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t fp_spill_mask, 40cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t code_size); 41524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 42524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray ~OatQuickMethodHeader(); 43524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 441dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray static OatQuickMethodHeader* FromCodePointer(const void* code_ptr) { 451dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray uintptr_t code = reinterpret_cast<uintptr_t>(code_ptr); 461dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray uintptr_t header = code - OFFSETOF_MEMBER(OatQuickMethodHeader, code_); 47562ff44698fc75f82e1f6cb0b71ce21df4328959Vladimir Marko DCHECK(IsAlignedParam(code, GetInstructionSetAlignment(kRuntimeISA)) || 48dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao IsAlignedParam(header, GetInstructionSetAlignment(kRuntimeISA))) 49dcdc85bbd569f0ee66c331b4219c19304a616214Jeff Hao << std::hex << code << " " << std::hex << header; 501dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray return reinterpret_cast<OatQuickMethodHeader*>(header); 511dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray } 521dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray 531dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray static OatQuickMethodHeader* FromEntryPoint(const void* entry_point) { 541dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray return FromCodePointer(EntryPointToCodePointer(entry_point)); 551dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray } 561dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray 57524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray OatQuickMethodHeader& operator=(const OatQuickMethodHeader&) = default; 58524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 59524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uintptr_t NativeQuickPcOffset(const uintptr_t pc) const { 60524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return pc - reinterpret_cast<uintptr_t>(GetEntryPoint()); 61524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 62524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 63524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray bool IsOptimized() const { 64063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return GetCodeSize() != 0 && vmap_table_offset_ != 0; 65524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 66524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 675d950769b607b4f76413212db640a32d796911deDavid Srbecky const void* GetOptimizedCodeInfoPtr() const { 68524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray DCHECK(IsOptimized()); 69cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return reinterpret_cast<const void*>(code_ - vmap_table_offset_); 705d950769b607b4f76413212db640a32d796911deDavid Srbecky } 715d950769b607b4f76413212db640a32d796911deDavid Srbecky 72132d8363bf8cb043d910836672192ec8c36649b6Nicolas Geoffray uint8_t* GetOptimizedCodeInfoPtr() { 73132d8363bf8cb043d910836672192ec8c36649b6Nicolas Geoffray DCHECK(IsOptimized()); 74132d8363bf8cb043d910836672192ec8c36649b6Nicolas Geoffray return code_ - vmap_table_offset_; 75132d8363bf8cb043d910836672192ec8c36649b6Nicolas Geoffray } 76132d8363bf8cb043d910836672192ec8c36649b6Nicolas Geoffray 775d950769b607b4f76413212db640a32d796911deDavid Srbecky CodeInfo GetOptimizedCodeInfo() const { 785d950769b607b4f76413212db640a32d796911deDavid Srbecky return CodeInfo(GetOptimizedCodeInfoPtr()); 79524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 80524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 81cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier const void* GetOptimizedMethodInfoPtr() const { 82cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier DCHECK(IsOptimized()); 83cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return reinterpret_cast<const void*>(code_ - method_info_offset_); 84cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 85cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 86cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint8_t* GetOptimizedMethodInfoPtr() { 87cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier DCHECK(IsOptimized()); 88cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return code_ - method_info_offset_; 89cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 90cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 91cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier MethodInfo GetOptimizedMethodInfo() const { 92cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return MethodInfo(reinterpret_cast<const uint8_t*>(GetOptimizedMethodInfoPtr())); 93cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 94cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 95524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray const uint8_t* GetCode() const { 96524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return code_; 97524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 98524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 995d950769b607b4f76413212db640a32d796911deDavid Srbecky uint32_t GetCodeSize() const { 100063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return code_size_ & kCodeSizeMask; 101063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 102063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 103063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang const uint32_t* GetCodeSizeAddr() const { 104063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return &code_size_; 105063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 106063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 107063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang uint32_t GetVmapTableOffset() const { 108063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return vmap_table_offset_; 109063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 110063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 111063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang void SetVmapTableOffset(uint32_t offset) { 112063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang vmap_table_offset_ = offset; 113063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 114063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 115063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang const uint32_t* GetVmapTableOffsetAddr() const { 116063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return &vmap_table_offset_; 1175d950769b607b4f76413212db640a32d796911deDavid Srbecky } 1185d950769b607b4f76413212db640a32d796911deDavid Srbecky 119cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t GetMethodInfoOffset() const { 120cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return method_info_offset_; 121cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 122cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 123cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier void SetMethodInfoOffset(uint32_t offset) { 124cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier method_info_offset_ = offset; 125cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 126cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 127cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier const uint32_t* GetMethodInfoOffsetAddr() const { 128cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier return &method_info_offset_; 129cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier } 130cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 131524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray const uint8_t* GetVmapTable() const { 132524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray CHECK(!IsOptimized()) << "Unimplemented vmap table for optimizing compiler"; 133524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return (vmap_table_offset_ == 0) ? nullptr : code_ - vmap_table_offset_; 134524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 135524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 136524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray bool Contains(uintptr_t pc) const { 137524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uintptr_t code_start = reinterpret_cast<uintptr_t>(code_); 1381dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray static_assert(kRuntimeISA != kThumb2, "kThumb2 cannot be a runtime ISA"); 1391dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray if (kRuntimeISA == kArm) { 1401dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray // On Thumb-2, the pc is offset by one. 1411dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray code_start++; 1421dad3f68b7f5a4a4cb2b281413357adc2309a8fdNicolas Geoffray } 143063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return code_start <= pc && pc <= (code_start + GetCodeSize()); 144524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 145524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 146524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray const uint8_t* GetEntryPoint() const { 147524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // When the runtime architecture is ARM, `kRuntimeISA` is set to `kArm` 148524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // (not `kThumb2`), *but* we always generate code for the Thumb-2 149524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // instruction set anyway. Thumb-2 requires the entrypoint to be of 150524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // offset 1. 151524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray static_assert(kRuntimeISA != kThumb2, "kThumb2 cannot be a runtime ISA"); 152524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return (kRuntimeISA == kArm) 153524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray ? reinterpret_cast<uint8_t*>(reinterpret_cast<uintptr_t>(code_) | 1) 154524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray : code_; 155524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 156524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 157524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray template <bool kCheckFrameSize = true> 158b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray uint32_t GetFrameSizeInBytes() const { 159524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uint32_t result = frame_info_.FrameSizeInBytes(); 160524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray if (kCheckFrameSize) { 1616832fbe366dd4fc79daa8976f8edbe78d4591649David Srbecky DCHECK_ALIGNED(result, kStackAlignment); 162524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 163524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return result; 164524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 165524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 166524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray QuickMethodFrameInfo GetFrameInfo() const { 167524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray return frame_info_; 168524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray } 169524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 170524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uintptr_t ToNativeQuickPc(ArtMethod* method, 171524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray const uint32_t dex_pc, 172524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray bool is_for_catch_handler, 173524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray bool abort_on_failure = true) const; 174524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 175524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uint32_t ToDexPc(ArtMethod* method, const uintptr_t pc, bool abort_on_failure = true) const; 176524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 177063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang void SetHasShouldDeoptimizeFlag() { 178063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang DCHECK_EQ(code_size_ & kShouldDeoptimizeMask, 0u); 179063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang code_size_ |= kShouldDeoptimizeMask; 180063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 181063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 182063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang bool HasShouldDeoptimizeFlag() const { 183063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang return (code_size_ & kShouldDeoptimizeMask) != 0; 184063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang } 185063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 186063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang private: 187063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang static constexpr uint32_t kShouldDeoptimizeMask = 0x80000000; 188063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang static constexpr uint32_t kCodeSizeMask = ~kShouldDeoptimizeMask; 189063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang 190524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // The offset in bytes from the start of the vmap table to the end of the header. 191cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t vmap_table_offset_ = 0u; 192cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier // The offset in bytes from the start of the method info to the end of the header. 193cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier // The method info offset is not in the CodeInfo since CodeInfo has good dedupe properties that 194cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier // would be lost from doing so. The method info memory region contains method indices since they 195cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier // are hard to dedupe. 196cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier 197cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t method_info_offset_ = 0u; 198524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // The stack frame information. 199524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray QuickMethodFrameInfo frame_info_; 200063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang // The code size in bytes. The highest bit is used to signify if the compiled 201063fc772b5b8aed7d769cd7cccb6ddc7619326eeMingyao Yang // code with the method header has should_deoptimize flag. 202cbcedbf9382bc773713cd3552ed96f417bf1daebMathieu Chartier uint32_t code_size_ = 0u; 203524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray // The actual code. 204524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray uint8_t code_[0]; 205524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray}; 206524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 207524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray} // namespace art 208524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray 209524e7ea8cd17bad17bd9f3e0ccbb19ad0d4d9c02Nicolas Geoffray#endif // ART_RUNTIME_OAT_QUICK_METHOD_HEADER_H_ 210