diff options
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
| -rw-r--r-- | compiler/driver/compiler_driver.cc | 123 | 
1 files changed, 51 insertions, 72 deletions
| diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 995098799c..caab5fb5a9 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -581,7 +581,7 @@ static void CompileMethod(Thread* self,                            InvokeType invoke_type,                            uint16_t class_def_idx,                            uint32_t method_idx, -                          Handle<mirror::ClassLoader> class_loader, +                          jobject class_loader,                            const DexFile& dex_file,                            optimizer::DexToDexCompilationLevel dex_to_dex_compilation_level,                            bool compilation_enabled, @@ -622,6 +622,9 @@ static void CompileMethod(Thread* self,        // Look-up the ArtMethod associated with this code_item (if any)        // -- It is later used to lookup any [optimization] annotations for this method.        ScopedObjectAccess soa(self); +      StackHandleScope<1> hs(soa.Self()); +      Handle<mirror::ClassLoader> class_loader_handle(hs.NewHandle( +          soa.Decode<mirror::ClassLoader>(class_loader)));        // TODO: Lookup annotation from DexFile directly without resolving method.        ArtMethod* method = @@ -629,7 +632,7 @@ static void CompileMethod(Thread* self,                dex_file,                method_idx,                dex_cache, -              class_loader, +              class_loader_handle,                /* referrer */ nullptr,                invoke_type); @@ -676,14 +679,9 @@ static void CompileMethod(Thread* self,      if (compile) {        // NOTE: if compiler declines to compile this method, it will return null. -      compiled_method = driver->GetCompiler()->Compile(code_item, -                                                       access_flags, -                                                       invoke_type, -                                                       class_def_idx, -                                                       method_idx, -                                                       class_loader, -                                                       dex_file, -                                                       dex_cache); +      compiled_method = driver->GetCompiler()->Compile(code_item, access_flags, invoke_type, +                                                       class_def_idx, method_idx, class_loader, +                                                       dex_file, dex_cache);      }      if (compiled_method == nullptr &&          dex_to_dex_compilation_level != optimizer::DexToDexCompilationLevel::kDontDexToDexCompile) { @@ -730,14 +728,12 @@ void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* t    uint32_t method_idx = method->GetDexMethodIndex();    uint32_t access_flags = method->GetAccessFlags();    InvokeType invoke_type = method->GetInvokeType(); -  StackHandleScope<2> hs(self); +  StackHandleScope<1> hs(self);    Handle<mirror::DexCache> dex_cache(hs.NewHandle(method->GetDexCache())); -  Handle<mirror::ClassLoader> class_loader( -      hs.NewHandle(method->GetDeclaringClass()->GetClassLoader()));    {      ScopedObjectAccessUnchecked soa(self);      ScopedLocalRef<jobject> local_class_loader( -        soa.Env(), soa.AddLocalReference<jobject>(class_loader.Get())); +        soa.Env(), soa.AddLocalReference<jobject>(method->GetDeclaringClass()->GetClassLoader()));      jclass_loader = soa.Env()->NewGlobalRef(local_class_loader.get());      // Find the dex_file      dex_file = method->GetDexFile(); @@ -771,7 +767,7 @@ void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* t                  invoke_type,                  class_def_idx,                  method_idx, -                class_loader, +                jclass_loader,                  *dex_file,                  dex_to_dex_compilation_level,                  true, @@ -797,7 +793,7 @@ void CompilerDriver::CompileOne(Thread* self, ArtMethod* method, TimingLogger* t                    invoke_type,                    class_def_idx,                    method_idx, -                  class_loader, +                  jclass_loader,                    *dex_file,                    dex_to_dex_compilation_level,                    true, @@ -1077,30 +1073,22 @@ bool CompilerDriver::ShouldCompileBasedOnProfile(const MethodReference& method_r  class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {   public: -  ResolveCatchBlockExceptionsClassVisitor() : classes_() {} +  explicit ResolveCatchBlockExceptionsClassVisitor( +      std::set<std::pair<dex::TypeIndex, const DexFile*>>& exceptions_to_resolve) +     : exceptions_to_resolve_(exceptions_to_resolve) {}    virtual bool operator()(ObjPtr<mirror::Class> c) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) { -    classes_.push_back(c); -    return true; -  } - -  void FindExceptionTypesToResolve( -      std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve) -      REQUIRES_SHARED(Locks::mutator_lock_) {      const auto pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); -    for (ObjPtr<mirror::Class> klass : classes_) { -      for (ArtMethod& method : klass->GetMethods(pointer_size)) { -        FindExceptionTypesToResolveForMethod(&method, exceptions_to_resolve); -      } +    for (auto& m : c->GetMethods(pointer_size)) { +      ResolveExceptionsForMethod(&m);      } +    return true;    }   private: -  void FindExceptionTypesToResolveForMethod( -      ArtMethod* method, -      std::set<std::pair<dex::TypeIndex, const DexFile*>>* exceptions_to_resolve) +  void ResolveExceptionsForMethod(ArtMethod* method_handle)        REQUIRES_SHARED(Locks::mutator_lock_) { -    const DexFile::CodeItem* code_item = method->GetCodeItem(); +    const DexFile::CodeItem* code_item = method_handle->GetCodeItem();      if (code_item == nullptr) {        return;  // native or abstract method      } @@ -1120,9 +1108,9 @@ class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {          dex::TypeIndex encoded_catch_handler_handlers_type_idx =              dex::TypeIndex(DecodeUnsignedLeb128(&encoded_catch_handler_list));          // Add to set of types to resolve if not already in the dex cache resolved types -        if (!method->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx)) { -          exceptions_to_resolve->emplace(encoded_catch_handler_handlers_type_idx, -                                         method->GetDexFile()); +        if (!method_handle->IsResolvedTypeIdx(encoded_catch_handler_handlers_type_idx)) { +          exceptions_to_resolve_.emplace(encoded_catch_handler_handlers_type_idx, +                                         method_handle->GetDexFile());          }          // ignore address associated with catch handler          DecodeUnsignedLeb128(&encoded_catch_handler_list); @@ -1134,7 +1122,7 @@ class ResolveCatchBlockExceptionsClassVisitor : public ClassVisitor {      }    } -  std::vector<ObjPtr<mirror::Class>> classes_; +  std::set<std::pair<dex::TypeIndex, const DexFile*>>& exceptions_to_resolve_;  };  class RecordImageClassesVisitor : public ClassVisitor { @@ -1188,14 +1176,8 @@ void CompilerDriver::LoadImageClasses(TimingLogger* timings) {        hs.NewHandle(class_linker->FindSystemClass(self, "Ljava/lang/Throwable;")));    do {      unresolved_exception_types.clear(); -    { -      // Thread suspension is not allowed while ResolveCatchBlockExceptionsClassVisitor -      // is using a std::vector<ObjPtr<mirror::Class>>. -      ScopedAssertNoThreadSuspension ants(__FUNCTION__); -      ResolveCatchBlockExceptionsClassVisitor visitor; -      class_linker->VisitClasses(&visitor); -      visitor.FindExceptionTypesToResolve(&unresolved_exception_types); -    } +    ResolveCatchBlockExceptionsClassVisitor visitor(unresolved_exception_types); +    class_linker->VisitClasses(&visitor);      for (const auto& exception_type : unresolved_exception_types) {        dex::TypeIndex exception_type_idx = exception_type.first;        const DexFile* dex_file = exception_type.second; @@ -1446,14 +1428,19 @@ void CompilerDriver::MarkForDexToDexCompilation(Thread* self, const MethodRefere    dex_to_dex_references_.back().GetMethodIndexes().SetBit(method_ref.dex_method_index);  } -bool CompilerDriver::CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class, -                                                ObjPtr<mirror::Class> resolved_class) { +bool CompilerDriver::CanAccessTypeWithoutChecks(uint32_t referrer_idx, +                                                Handle<mirror::DexCache> dex_cache, +                                                dex::TypeIndex type_idx) { +  // Get type from dex cache assuming it was populated by the verifier +  mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);    if (resolved_class == nullptr) {      stats_->TypeNeedsAccessCheck();      return false;  // Unknown class needs access checks.    } +  const DexFile::MethodId& method_id = dex_cache->GetDexFile()->GetMethodId(referrer_idx);    bool is_accessible = resolved_class->IsPublic();  // Public classes are always accessible.    if (!is_accessible) { +    mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);      if (referrer_class == nullptr) {        stats_->TypeNeedsAccessCheck();        return false;  // Incomplete referrer knowledge needs access check. @@ -1470,9 +1457,12 @@ bool CompilerDriver::CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_c    return is_accessible;  } -bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class, -                                                            ObjPtr<mirror::Class> resolved_class, +bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx, +                                                            Handle<mirror::DexCache> dex_cache, +                                                            dex::TypeIndex type_idx,                                                              bool* finalizable) { +  // Get type from dex cache assuming it was populated by the verifier. +  mirror::Class* resolved_class = dex_cache->GetResolvedType(type_idx);    if (resolved_class == nullptr) {      stats_->TypeNeedsAccessCheck();      // Be conservative. @@ -1480,8 +1470,10 @@ bool CompilerDriver::CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class      return false;  // Unknown class needs access checks.    }    *finalizable = resolved_class->IsFinalizable(); +  const DexFile::MethodId& method_id = dex_cache->GetDexFile()->GetMethodId(referrer_idx);    bool is_accessible = resolved_class->IsPublic();  // Public classes are always accessible.    if (!is_accessible) { +    mirror::Class* referrer_class = dex_cache->GetResolvedType(method_id.class_idx_);      if (referrer_class == nullptr) {        stats_->TypeNeedsAccessCheck();        return false;  // Incomplete referrer knowledge needs access check. @@ -1525,7 +1517,9 @@ ArtField* CompilerDriver::ComputeInstanceFieldInfo(uint32_t field_idx,    mirror::Class* referrer_class;    Handle<mirror::DexCache> dex_cache(mUnit->GetDexCache());    { -    Handle<mirror::ClassLoader> class_loader_handle = mUnit->GetClassLoader(); +    StackHandleScope<1> hs(soa.Self()); +    Handle<mirror::ClassLoader> class_loader_handle( +        hs.NewHandle(soa.Decode<mirror::ClassLoader>(mUnit->GetClassLoader())));      resolved_field = ResolveField(soa, dex_cache, class_loader_handle, mUnit, field_idx, false);      referrer_class = resolved_field != nullptr          ? ResolveCompilingMethodsClass(soa, dex_cache, class_loader_handle, mUnit) : nullptr; @@ -2672,18 +2666,10 @@ class CompileClassVisitor : public CompilationVisitor {          continue;        }        previous_direct_method_idx = method_idx; -      CompileMethod(soa.Self(), -                    driver, -                    it.GetMethodCodeItem(), -                    it.GetMethodAccessFlags(), -                    it.GetMethodInvokeType(class_def), -                    class_def_index, -                    method_idx, -                    class_loader, -                    dex_file, -                    dex_to_dex_compilation_level, -                    compilation_enabled, -                    dex_cache); +      CompileMethod(soa.Self(), driver, it.GetMethodCodeItem(), it.GetMethodAccessFlags(), +                    it.GetMethodInvokeType(class_def), class_def_index, +                    method_idx, jclass_loader, dex_file, dex_to_dex_compilation_level, +                    compilation_enabled, dex_cache);        it.Next();      }      // Compile virtual methods @@ -2697,17 +2683,10 @@ class CompileClassVisitor : public CompilationVisitor {          continue;        }        previous_virtual_method_idx = method_idx; -      CompileMethod(soa.Self(), -                    driver, it.GetMethodCodeItem(), -                    it.GetMethodAccessFlags(), -                    it.GetMethodInvokeType(class_def), -                    class_def_index, -                    method_idx, -                    class_loader, -                    dex_file, -                    dex_to_dex_compilation_level, -                    compilation_enabled, -                    dex_cache); +      CompileMethod(soa.Self(), driver, it.GetMethodCodeItem(), it.GetMethodAccessFlags(), +                    it.GetMethodInvokeType(class_def), class_def_index, +                    method_idx, jclass_loader, dex_file, dex_to_dex_compilation_level, +                    compilation_enabled, dex_cache);        it.Next();      }      DCHECK(!it.HasNext()); |