compiler_driver-inl.h revision 1a5337fff2cc6cb9d563c8b32aca75f485d23373
1be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko/* 2be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * Copyright (C) 2012 The Android Open Source Project 3be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * 4be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 5be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * you may not use this file except in compliance with the License. 6be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * You may obtain a copy of the License at 7be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * 8be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 9be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * 10be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * Unless required by applicable law or agreed to in writing, software 11be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 12be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * See the License for the specific language governing permissions and 14be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko * limitations under the License. 15be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko */ 16be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 17be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko#ifndef ART_COMPILER_DRIVER_COMPILER_DRIVER_INL_H_ 18be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko#define ART_COMPILER_DRIVER_COMPILER_DRIVER_INL_H_ 19be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 20be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko#include "compiler_driver.h" 2198d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang 22c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier#include "art_field-inl.h" 23e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "art_method-inl.h" 24542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe#include "base/enums.h" 25e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "class_linker-inl.h" 2653c913bb71b218714823c8c87a1f92830c336f61Andreas Gampe#include "dex_compilation_unit.h" 27be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko#include "mirror/class_loader.h" 28f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko#include "mirror/dex_cache-inl.h" 290795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier#include "scoped_thread_state_change-inl.h" 30eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h" 31be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 32be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Markonamespace art { 33be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 34736b560f2d2c89b63dc895888c671b5519afa4c8Mathieu Chartierinline mirror::ClassLoader* CompilerDriver::GetClassLoader(const ScopedObjectAccess& soa, 35be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko const DexCompilationUnit* mUnit) { 361cc62e4ea24828fdb3f3da0b8603f0b107d09a04Mathieu Chartier return soa.Decode<mirror::ClassLoader>(mUnit->GetClassLoader()).Ptr(); 37be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} 38be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 399437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffrayinline mirror::Class* CompilerDriver::ResolveClass( 409437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray const ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, 419437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray Handle<mirror::ClassLoader> class_loader, uint16_t cls_index, 429437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray const DexCompilationUnit* mUnit) { 439437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray DCHECK_EQ(dex_cache->GetDexFile(), mUnit->GetDexFile()); 440795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier DCHECK_EQ(class_loader.Get(), GetClassLoader(soa, mUnit)); 459437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray mirror::Class* cls = mUnit->GetClassLinker()->ResolveType( 469437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray *mUnit->GetDexFile(), cls_index, dex_cache, class_loader); 479437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray DCHECK_EQ(cls == nullptr, soa.Self()->IsExceptionPending()); 489437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray if (UNLIKELY(cls == nullptr)) { 499437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray // Clean up any exception left by type resolution. 509437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray soa.Self()->ClearException(); 519437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray } 529437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray return cls; 539437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray} 549437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray 55be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Markoinline mirror::Class* CompilerDriver::ResolveCompilingMethodsClass( 56e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray const ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, 570cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, const DexCompilationUnit* mUnit) { 58eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier DCHECK_EQ(dex_cache->GetDexFile(), mUnit->GetDexFile()); 590795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier DCHECK_EQ(class_loader.Get(), GetClassLoader(soa, mUnit)); 60be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko const DexFile::MethodId& referrer_method_id = 61be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko mUnit->GetDexFile()->GetMethodId(mUnit->GetDexMethodIndex()); 629437b78780f9e6ffa5797ebe82de8e8d7f3a5ed6Nicolas Geoffray return ResolveClass(soa, dex_cache, class_loader, referrer_method_id.class_idx_, mUnit); 63be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} 64be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 65c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierinline ArtField* CompilerDriver::ResolveFieldWithDexFile( 66e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray const ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, 67e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier Handle<mirror::ClassLoader> class_loader, const DexFile* dex_file, 68be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko uint32_t field_idx, bool is_static) { 69e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier DCHECK_EQ(dex_cache->GetDexFile(), dex_file); 70c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier ArtField* resolved_field = Runtime::Current()->GetClassLinker()->ResolveField( 71e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier *dex_file, field_idx, dex_cache, class_loader, is_static); 72be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko DCHECK_EQ(resolved_field == nullptr, soa.Self()->IsExceptionPending()); 73be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko if (UNLIKELY(resolved_field == nullptr)) { 74be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // Clean up any exception left by type resolution. 75be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko soa.Self()->ClearException(); 76be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return nullptr; 77be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 78be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko if (UNLIKELY(resolved_field->IsStatic() != is_static)) { 79be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // ClassLinker can return a field of the wrong kind directly from the DexCache. 802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier // Silently return null on such incompatible class change. 81be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return nullptr; 82be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 83be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return resolved_field; 84be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} 85be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 86c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierinline ArtField* CompilerDriver::ResolveField( 87e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier const ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, 88e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier Handle<mirror::ClassLoader> class_loader, const DexCompilationUnit* mUnit, 89e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier uint32_t field_idx, bool is_static) { 900795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier DCHECK_EQ(class_loader.Get(), GetClassLoader(soa, mUnit)); 91e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier return ResolveFieldWithDexFile(soa, dex_cache, class_loader, mUnit->GetDexFile(), field_idx, 92e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier is_static); 93e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier} 94e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier 95be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Markoinline std::pair<bool, bool> CompilerDriver::IsFastInstanceField( 96be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko mirror::DexCache* dex_cache, mirror::Class* referrer_class, 97c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier ArtField* resolved_field, uint16_t field_idx) { 98be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko DCHECK(!resolved_field->IsStatic()); 993398c7874e002beaa6c2b2fadf183e7d1ddad23aMathieu Chartier ObjPtr<mirror::Class> fields_class = resolved_field->GetDeclaringClass(); 100be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko bool fast_get = referrer_class != nullptr && 1011a5337fff2cc6cb9d563c8b32aca75f485d23373Mathieu Chartier referrer_class->CanAccessResolvedField(fields_class, 1023398c7874e002beaa6c2b2fadf183e7d1ddad23aMathieu Chartier resolved_field, 1033398c7874e002beaa6c2b2fadf183e7d1ddad23aMathieu Chartier dex_cache, 1043398c7874e002beaa6c2b2fadf183e7d1ddad23aMathieu Chartier field_idx); 105be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko bool fast_put = fast_get && (!resolved_field->IsFinal() || fields_class == referrer_class); 106be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return std::make_pair(fast_get, fast_put); 107be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} 108be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 1094c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaintemplate <typename ArtMember> 1104c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaininline bool CompilerDriver::CanAccessResolvedMember(mirror::Class* referrer_class ATTRIBUTE_UNUSED, 1114c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::Class* access_to ATTRIBUTE_UNUSED, 1124c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain ArtMember* member ATTRIBUTE_UNUSED, 1134c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache ATTRIBUTE_UNUSED, 1144c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain uint32_t field_idx ATTRIBUTE_UNUSED) { 115e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier // Not defined for ArtMember values other than ArtField or ArtMethod. 1164c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain UNREACHABLE(); 1174c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain} 1184c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain 1194c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaintemplate <> 1204c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaininline bool CompilerDriver::CanAccessResolvedMember<ArtField>(mirror::Class* referrer_class, 1214c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::Class* access_to, 1224c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain ArtField* field, 1234c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache, 1244c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain uint32_t field_idx) { 1254c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain return referrer_class->CanAccessResolvedField(access_to, field, dex_cache, field_idx); 1264c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain} 1274c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain 1284c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaintemplate <> 129e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierinline bool CompilerDriver::CanAccessResolvedMember<ArtMethod>( 1304c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::Class* referrer_class, 1314c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::Class* access_to, 132e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ArtMethod* method, 1334c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache, 1344c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain uint32_t field_idx) { 1354c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain return referrer_class->CanAccessResolvedMethod(access_to, method, dex_cache, field_idx); 1364c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain} 1374c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain 1384c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaintemplate <typename ArtMember> 1394c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaininline std::pair<bool, bool> CompilerDriver::IsClassOfStaticMemberAvailableToReferrer( 1404c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache, 1414c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::Class* referrer_class, 1424c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain ArtMember* resolved_member, 1434c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain uint16_t member_idx, 1444c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain uint32_t* storage_index) { 1454c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain DCHECK(resolved_member->IsStatic()); 146be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko if (LIKELY(referrer_class != nullptr)) { 1473398c7874e002beaa6c2b2fadf183e7d1ddad23aMathieu Chartier ObjPtr<mirror::Class> members_class = resolved_member->GetDeclaringClass(); 1484c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain if (members_class == referrer_class) { 1494c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain *storage_index = members_class->GetDexTypeIndex(); 150be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return std::make_pair(true, true); 151be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 1524c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain if (CanAccessResolvedMember<ArtMember>( 1531cc62e4ea24828fdb3f3da0b8603f0b107d09a04Mathieu Chartier referrer_class, members_class.Ptr(), resolved_member, dex_cache, member_idx)) { 1544c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain // We have the resolved member, we must make it into a index for the referrer 155be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // in its static storage (which may fail if it doesn't have a slot for it) 156be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // TODO: for images we can elide the static storage base null check 157be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // if we know there's a non-null entry in the image 158be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko const DexFile* dex_file = dex_cache->GetDexFile(); 159be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko uint32_t storage_idx = DexFile::kDexNoIndex; 1604c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain if (LIKELY(members_class->GetDexCache() == dex_cache)) { 1614c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain // common case where the dex cache of both the referrer and the member are the same, 162be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // no need to search the dex file 1634c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain storage_idx = members_class->GetDexTypeIndex(); 164be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } else { 1654c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain // Search dex file for localized ssb index, may fail if member's class is a parent 166be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // of the class mentioned in the dex file and there is no dex cache entry. 167e4084a5eb46dc6b99c0e0b74bcdecccaceb28fe7Nicolas Geoffray storage_idx = resolved_member->GetDeclaringClass()->FindTypeIndexInOtherDexFile(*dex_file); 168be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 169be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko if (storage_idx != DexFile::kDexNoIndex) { 170be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko *storage_index = storage_idx; 1714c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain return std::make_pair(true, !resolved_member->IsFinal()); 172be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 173be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 174be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko } 175be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko // Conservative defaults. 176be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko *storage_index = DexFile::kDexNoIndex; 177be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko return std::make_pair(false, false); 178be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} 179be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 1804c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaininline std::pair<bool, bool> CompilerDriver::IsFastStaticField( 1814c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache, mirror::Class* referrer_class, 1824c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain ArtField* resolved_field, uint16_t field_idx, uint32_t* storage_index) { 1834c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain return IsClassOfStaticMemberAvailableToReferrer( 1844c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain dex_cache, referrer_class, resolved_field, field_idx, storage_index); 1854c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain} 1864c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain 1874c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillaininline bool CompilerDriver::IsClassOfStaticMethodAvailableToReferrer( 1884c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain mirror::DexCache* dex_cache, mirror::Class* referrer_class, 189e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ArtMethod* resolved_method, uint16_t method_idx, uint32_t* storage_index) { 1904c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain std::pair<bool, bool> result = IsClassOfStaticMemberAvailableToReferrer( 1914c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain dex_cache, referrer_class, resolved_method, method_idx, storage_index); 1924c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain // Only the first member of `result` is meaningful, as there is no 1934c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain // "write access" to a method. 1944c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain return result.first; 1954c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain} 1964c0eb42259d790fddcd9978b66328dbb3ab65615Roland Levillain 197e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierinline ArtMethod* CompilerDriver::ResolveMethod( 1980cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier ScopedObjectAccess& soa, Handle<mirror::DexCache> dex_cache, 1990cd81352a7c06e381951cea1b104fd73516f4341Mathieu Chartier Handle<mirror::ClassLoader> class_loader, const DexCompilationUnit* mUnit, 200e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier uint32_t method_idx, InvokeType invoke_type, bool check_incompatible_class_change) { 2010795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier DCHECK_EQ(class_loader.Get(), GetClassLoader(soa, mUnit)); 20242ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe ArtMethod* resolved_method = 20342ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe check_incompatible_class_change 20442ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe ? mUnit->GetClassLinker()->ResolveMethod<ClassLinker::kForceICCECheck>( 20542ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe *dex_cache->GetDexFile(), method_idx, dex_cache, class_loader, nullptr, invoke_type) 20642ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe : mUnit->GetClassLinker()->ResolveMethod<ClassLinker::kNoICCECheckForCache>( 20742ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe *dex_cache->GetDexFile(), method_idx, dex_cache, class_loader, nullptr, invoke_type); 208f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko if (UNLIKELY(resolved_method == nullptr)) { 20942ef8ab151a3d0cbb42cb43f6841c3708d65fca3Andreas Gampe DCHECK(soa.Self()->IsExceptionPending()); 210f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko // Clean up any exception left by type resolution. 211f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko soa.Self()->ClearException(); 212f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko } 213f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko return resolved_method; 214f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko} 215f096aad9203d7c50b2f9cbe1c1215a50c265a059Vladimir Marko 216be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko} // namespace art 217be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko 218be0e546730e532ef0987cd4bde2c6f5a1b14dd2aVladimir Marko#endif // ART_COMPILER_DRIVER_COMPILER_DRIVER_INL_H_ 219