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