1f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko/*
2f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * Copyright (C) 2014 The Android Open Source Project
3f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko *
4f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
5f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * you may not use this file except in compliance with the License.
6f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * You may obtain a copy of the License at
7f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko *
8f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
9f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko *
10f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * Unless required by applicable law or agreed to in writing, software
11f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
12f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * See the License for the specific language governing permissions and
14f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko * limitations under the License.
15f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko */
16f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
17f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#ifndef ART_COMPILER_DEX_MIR_METHOD_INFO_H_
18f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#define ART_COMPILER_DEX_MIR_METHOD_INFO_H_
19f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
20f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "base/logging.h"
21f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "base/macros.h"
22f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "base/mutex.h"
23f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "invoke_type.h"
24f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "method_reference.h"
25f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
26f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markonamespace art {
27f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
28f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markoclass CompilerDriver;
29f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markoclass DexCompilationUnit;
30f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markoclass DexFile;
31f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
32f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markoclass MirMethodInfo {
33f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko public:
34f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t MethodIndex() const {
35f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return method_idx_;
36f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
37f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
38f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  bool IsStatic() const {
39f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return (flags_ & kFlagIsStatic) != 0u;
40f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
41f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
42f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  bool IsResolved() const {
43f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return declaring_dex_file_ != nullptr;
44f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
45f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
46f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  const DexFile* DeclaringDexFile() const {
47f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return declaring_dex_file_;
48f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
49e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  void SetDeclaringDexFile(const DexFile* dex_file) {
50e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    declaring_dex_file_ = dex_file;
51e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  }
52f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
53f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t DeclaringClassIndex() const {
54f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return declaring_class_idx_;
55f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
56f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
57f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t DeclaringMethodIndex() const {
58f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return declaring_method_idx_;
59f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
60f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
61f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko protected:
62f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  enum {
63f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kBitIsStatic = 0,
64f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kMethodInfoBitEnd
65f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  };
66785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe  static_assert(kMethodInfoBitEnd <= 16, "Too many flags");
67f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  static constexpr uint16_t kFlagIsStatic = 1u << kBitIsStatic;
68f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
69f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  MirMethodInfo(uint16_t method_idx, uint16_t flags)
70f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko      : method_idx_(method_idx),
71f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        flags_(flags),
72f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        declaring_method_idx_(0u),
73f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        declaring_class_idx_(0u),
74f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        declaring_dex_file_(nullptr) {
75f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
76f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
77f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // Make copy-ctor/assign/dtor protected to avoid slicing.
78f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  MirMethodInfo(const MirMethodInfo& other) = default;
79f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  MirMethodInfo& operator=(const MirMethodInfo& other) = default;
80f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  ~MirMethodInfo() = default;
81f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
82f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // The method index in the compiling method's dex file.
83f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t method_idx_;
84f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // Flags, for volatility and derived class data.
85f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t flags_;
86f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // The method index in the dex file that defines the method, 0 if unresolved.
87f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t declaring_method_idx_;
88f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // The type index of the class declaring the method, 0 if unresolved.
89f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t declaring_class_idx_;
90f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // The dex file that defines the class containing the method and the method,
912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // null if unresolved.
92f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  const DexFile* declaring_dex_file_;
93f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko};
94f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
95f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Markoclass MirMethodLoweringInfo : public MirMethodInfo {
96f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko public:
97f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // For each requested method retrieve the method's declaring location (dex file, class
98f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // index and method index) and compute whether we can fast path the method call. For fast
99f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // path methods, retrieve the method's vtable index and direct code and method when applicable.
100f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  static void Resolve(CompilerDriver* compiler_driver, const DexCompilationUnit* mUnit,
101f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko                      MirMethodLoweringInfo* method_infos, size_t count)
102f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko      LOCKS_EXCLUDED(Locks::mutator_lock_);
103f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
104e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  MirMethodLoweringInfo(uint16_t method_idx, InvokeType type, bool is_quickened)
105f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko      : MirMethodInfo(method_idx,
106f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko                      ((type == kStatic) ? kFlagIsStatic : 0u) |
107f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko                      (static_cast<uint16_t>(type) << kBitInvokeTypeBegin) |
108e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier                      (static_cast<uint16_t>(type) << kBitSharpTypeBegin) |
109e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier                      (is_quickened ? kFlagQuickened : 0u)),
110f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        direct_code_(0u),
111f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        direct_method_(0u),
112f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        target_dex_file_(nullptr),
113f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        target_method_idx_(0u),
114f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        vtable_idx_(0u),
115f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko        stats_flags_(0) {
116f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
117f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
118f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  void SetDevirtualizationTarget(const MethodReference& ref) {
119f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    DCHECK(target_dex_file_ == nullptr);
120f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    DCHECK_EQ(target_method_idx_, 0u);
121f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    DCHECK_LE(ref.dex_method_index, 0xffffu);
122f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    target_dex_file_ = ref.dex_file;
123f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    target_method_idx_ = ref.dex_method_index;
124f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
125f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
126f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  bool FastPath() const {
127f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return (flags_ & kFlagFastPath) != 0u;
128f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
129f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
13087b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  bool IsIntrinsic() const {
13187b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko    return (flags_ & kFlagIsIntrinsic) != 0u;
13287b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  }
13387b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko
13487b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  bool IsSpecial() const {
13587b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko    return (flags_ & kFlagIsSpecial) != 0u;
13687b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  }
13787b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko
13866c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  bool IsReferrersClass() const {
13966c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko    return (flags_ & kFlagIsReferrersClass) != 0;
14066c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  }
14166c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko
14266c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  bool IsClassInitialized() const {
14366c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko    return (flags_ & kFlagClassIsInitialized) != 0u;
1449820b7c1dc70e75ad405b9e6e63578fa9fe94e94Vladimir Marko  }
1459820b7c1dc70e75ad405b9e6e63578fa9fe94e94Vladimir Marko
146e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  // Returns true iff the method invoke is INVOKE_VIRTUAL_QUICK or INVOKE_VIRTUAL_RANGE_QUICK.
147e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  bool IsQuickened() const {
148e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    return (flags_ & kFlagQuickened) != 0u;
149e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  }
150e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier
151f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  InvokeType GetInvokeType() const {
152f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return static_cast<InvokeType>((flags_ >> kBitInvokeTypeBegin) & kInvokeTypeMask);
153f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
154f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
155f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  art::InvokeType GetSharpType() const {
156f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return static_cast<InvokeType>((flags_ >> kBitSharpTypeBegin) & kInvokeTypeMask);
157f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
158f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
159f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  MethodReference GetTargetMethod() const {
160f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return MethodReference(target_dex_file_, target_method_idx_);
161f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
162f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
163f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t VTableIndex() const {
164f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return vtable_idx_;
165f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
166e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  void SetVTableIndex(uint16_t index) {
167e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    vtable_idx_ = index;
168e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  }
169f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
170f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uintptr_t DirectCode() const {
171f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return direct_code_;
172f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
173f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
174f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uintptr_t DirectMethod() const {
175f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return direct_method_;
176f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
177f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
178f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  int StatsFlags() const {
179f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    return stats_flags_;
180f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  }
181f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
182e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  void CheckEquals(const MirMethodLoweringInfo& info) const {
183e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(method_idx_, info.method_idx_);
184e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(flags_, info.flags_);
185e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(declaring_method_idx_, info.declaring_method_idx_);
186e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(declaring_class_idx_, info.declaring_class_idx_);
187e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(declaring_dex_file_, info.declaring_dex_file_);
188e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(direct_code_, info.direct_code_);
189e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(direct_method_, info.direct_method_);
190e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(target_dex_file_, info.target_dex_file_);
191e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(target_method_idx_, info.target_method_idx_);
192e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(vtable_idx_, info.vtable_idx_);
193e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    CHECK_EQ(stats_flags_, info.stats_flags_);
194e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  }
195e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier
196f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko private:
197f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  enum {
198f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kBitFastPath = kMethodInfoBitEnd,
19987b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko    kBitIsIntrinsic,
20087b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko    kBitIsSpecial,
201f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kBitInvokeTypeBegin,
202f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kBitInvokeTypeEnd = kBitInvokeTypeBegin + 3,  // 3 bits for invoke type.
20387b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko    kBitSharpTypeBegin = kBitInvokeTypeEnd,
204f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko    kBitSharpTypeEnd = kBitSharpTypeBegin + 3,  // 3 bits for sharp type.
20566c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko    kBitIsReferrersClass = kBitSharpTypeEnd,
20666c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko    kBitClassIsInitialized,
207e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier    kBitQuickened,
20866c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko    kMethodLoweringInfoBitEnd
209f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  };
210785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe  static_assert(kMethodLoweringInfoBitEnd <= 16, "Too many flags");
211f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  static constexpr uint16_t kFlagFastPath = 1u << kBitFastPath;
21287b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  static constexpr uint16_t kFlagIsIntrinsic = 1u << kBitIsIntrinsic;
21387b7c52ac660119b8dea46967974b76c86d0750bVladimir Marko  static constexpr uint16_t kFlagIsSpecial = 1u << kBitIsSpecial;
21466c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  static constexpr uint16_t kFlagIsReferrersClass = 1u << kBitIsReferrersClass;
21566c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  static constexpr uint16_t kFlagClassIsInitialized = 1u << kBitClassIsInitialized;
216e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  static constexpr uint16_t kFlagQuickened = 1u << kBitQuickened;
217f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  static constexpr uint16_t kInvokeTypeMask = 7u;
218785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe  static_assert((1u << (kBitInvokeTypeEnd - kBitInvokeTypeBegin)) - 1u == kInvokeTypeMask,
219785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe                "assert invoke type bits failed");
220785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe  static_assert((1u << (kBitSharpTypeEnd - kBitSharpTypeBegin)) - 1u == kInvokeTypeMask,
221785d2f2116bb57418d81bb55b55a087afee11053Andreas Gampe                "assert sharp type bits failed");
222f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
223f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uintptr_t direct_code_;
224f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uintptr_t direct_method_;
225f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // Before Resolve(), target_dex_file_ and target_method_idx_ hold the verification-based
2262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // devirtualized invoke target if available, null and 0u otherwise.
227f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // After Resolve() they hold the actual target method that will be called; it will be either
228f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  // a devirtualized target method or the compilation's unit's dex file and MethodIndex().
229f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  const DexFile* target_dex_file_;
230f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t target_method_idx_;
231f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  uint16_t vtable_idx_;
232f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko  int stats_flags_;
233bfea9c29e809e04bde4a46591fea64c5a7b922fbVladimir Marko
23466c6d7bdfdd535e6ecf4461bba3804f1a7794fcdVladimir Marko  friend class MirOptimizationTest;
235c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko  friend class TypeInferenceTest;
236f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko};
237f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
238f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko}  // namespace art
239f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko
240f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#endif  // ART_COMPILER_DEX_MIR_METHOD_INFO_H_
241