diff options
author | 2016-11-24 13:03:57 +0000 | |
---|---|---|
committer | 2016-11-24 13:03:57 +0000 | |
commit | 09ded9201fbeec605b12741ae255663c14bda225 (patch) | |
tree | c0276a06f8b6dba35e843098a05be326c8f5e2ac /compiler/image_writer.cc | |
parent | 25dcbad4462ea7279ee2bbe0884abc25bdfac77a (diff) |
Revert "Revert "Revert "Make sure that const-class linkage is preserved."""
626-const-class-linking is failing (spurious wakeups?)
970-iface-super-resolution-gen is failing:
dex2oatd F 11-24 10:57:16 6410 6410 image_writer.cc:1144]
Check failed: !IsBootClassLoaderClass(as_klass)
java.lang.Class<java.lang.NoSuchMethodError>
Bug: 30627598
This reverts commit 25dcbad4462ea7279ee2bbe0884abc25bdfac77a.
Change-Id: Ie010169bdde45e6ccf2e04a521da4682bd817114
Diffstat (limited to 'compiler/image_writer.cc')
-rw-r--r-- | compiler/image_writer.cc | 83 |
1 files changed, 21 insertions, 62 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc index 0f41cbface..a706697496 100644 --- a/compiler/image_writer.cc +++ b/compiler/image_writer.cc @@ -838,64 +838,19 @@ bool ImageWriter::KeepClass(Class* klass) { return true; } -class ImageWriter::PruneClassesVisitor : public ClassVisitor { +class ImageWriter::NonImageClassesVisitor : public ClassVisitor { public: - PruneClassesVisitor(ImageWriter* image_writer, ObjPtr<mirror::ClassLoader> class_loader) - : image_writer_(image_writer), - class_loader_(class_loader), - classes_to_prune_(), - defined_class_count_(0u) { } + explicit NonImageClassesVisitor(ImageWriter* image_writer) : image_writer_(image_writer) {} - bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) { + bool operator()(ObjPtr<Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) { if (!image_writer_->KeepClass(klass.Ptr())) { classes_to_prune_.insert(klass.Ptr()); - if (klass->GetClassLoader() == class_loader_) { - ++defined_class_count_; - } } return true; } - size_t Prune() REQUIRES_SHARED(Locks::mutator_lock_) { - ClassTable* class_table = - Runtime::Current()->GetClassLinker()->ClassTableForClassLoader(class_loader_); - for (mirror::Class* klass : classes_to_prune_) { - std::string storage; - const char* descriptor = klass->GetDescriptor(&storage); - bool result = class_table->Remove(descriptor); - DCHECK(result); - } - return defined_class_count_; - } - - private: - ImageWriter* const image_writer_; - const ObjPtr<mirror::ClassLoader> class_loader_; std::unordered_set<mirror::Class*> classes_to_prune_; - size_t defined_class_count_; -}; - -class ImageWriter::PruneClassLoaderClassesVisitor : public ClassLoaderVisitor { - public: - explicit PruneClassLoaderClassesVisitor(ImageWriter* image_writer) - : image_writer_(image_writer), removed_class_count_(0) {} - - virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader) OVERRIDE - REQUIRES_SHARED(Locks::mutator_lock_) { - PruneClassesVisitor classes_visitor(image_writer_, class_loader); - ClassTable* class_table = - Runtime::Current()->GetClassLinker()->ClassTableForClassLoader(class_loader); - class_table->Visit(classes_visitor); - removed_class_count_ += classes_visitor.Prune(); - } - - size_t GetRemovedClassCount() const { - return removed_class_count_; - } - - private: ImageWriter* const image_writer_; - size_t removed_class_count_; }; void ImageWriter::PruneNonImageClasses() { @@ -907,13 +862,21 @@ void ImageWriter::PruneNonImageClasses() { // path dex caches. class_linker->ClearClassTableStrongRoots(); + // Make a list of classes we would like to prune. + NonImageClassesVisitor visitor(this); + class_linker->VisitClasses(&visitor); + // Remove the undesired classes from the class roots. - { - ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_); - PruneClassLoaderClassesVisitor class_loader_visitor(this); - class_loader_visitor.Visit(nullptr); // Visit boot class loader. - class_linker->VisitClassLoaders(&class_loader_visitor); - VLOG(compiler) << "Pruned " << class_loader_visitor.GetRemovedClassCount() << " classes"; + VLOG(compiler) << "Pruning " << visitor.classes_to_prune_.size() << " classes"; + for (mirror::Class* klass : visitor.classes_to_prune_) { + std::string temp; + const char* name = klass->GetDescriptor(&temp); + VLOG(compiler) << "Pruning class " << name; + if (!compile_app_image_) { + DCHECK(IsBootClassLoaderClass(klass)); + } + bool result = class_linker->RemoveClass(name, klass->GetClassLoader()); + DCHECK(result); } // Clear references to removed classes from the DexCaches. @@ -1544,10 +1507,8 @@ void ImageWriter::CalculateNewObjectOffsets() { } // Calculate the size of the class table. ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_); - CHECK_EQ(class_loaders_.size(), compile_app_image_ ? 1u : 0u); - mirror::ClassLoader* class_loader = compile_app_image_ ? *class_loaders_.begin() : nullptr; - DCHECK_EQ(image_info.class_table_->NumZygoteClasses(class_loader), 0u); - if (image_info.class_table_->NumNonZygoteClasses(class_loader) != 0u) { + DCHECK_EQ(image_info.class_table_->NumZygoteClasses(), 0u); + if (image_info.class_table_->NumNonZygoteClasses() != 0u) { image_info.class_table_bytes_ += image_info.class_table_->WriteToMemory(nullptr); } } @@ -1892,10 +1853,8 @@ void ImageWriter::CopyAndFixupNativeData(size_t oat_index) { // above comment for intern tables. ClassTable temp_class_table; temp_class_table.ReadFromMemory(class_table_memory_ptr); - CHECK_EQ(class_loaders_.size(), compile_app_image_ ? 1u : 0u); - mirror::ClassLoader* class_loader = compile_app_image_ ? *class_loaders_.begin() : nullptr; - CHECK_EQ(temp_class_table.NumZygoteClasses(class_loader), - table->NumNonZygoteClasses(class_loader) + table->NumZygoteClasses(class_loader)); + CHECK_EQ(temp_class_table.NumZygoteClasses(), table->NumNonZygoteClasses() + + table->NumZygoteClasses()); BufferedRootVisitor<kDefaultBufferedRootCount> buffered_visitor(&root_visitor, RootInfo(kRootUnknown)); temp_class_table.VisitRoots(buffered_visitor); |