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