summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2016-12-01 16:00:56 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-12-01 16:00:57 +0000
commit6afaa42f50157095a3cdc742afdbc3d58b833eea (patch)
tree72454e2b4c4bbc3a7027d98aef306836efe8e039 /compiler
parent4e1a19b2e2191c27c45cac373ad9db2d61ed7fc9 (diff)
parent00a441033db28d243fc33692d30eb2755fa81728 (diff)
Merge "Additional debug logging for bug 33231647."
Diffstat (limited to 'compiler')
-rw-r--r--compiler/image_writer.cc42
-rw-r--r--compiler/image_writer.h4
2 files changed, 42 insertions, 4 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc
index 440796858e..6aa5642aa5 100644
--- a/compiler/image_writer.cc
+++ b/compiler/image_writer.cc
@@ -864,6 +864,7 @@ class ImageWriter::PruneClassesVisitor : public ClassVisitor {
const char* descriptor = klass->GetDescriptor(&storage);
bool result = class_table->Remove(descriptor);
DCHECK(result);
+ DCHECK(!class_table->Remove(descriptor)) << descriptor;
}
return defined_class_count_;
}
@@ -898,6 +899,12 @@ class ImageWriter::PruneClassLoaderClassesVisitor : public ClassLoaderVisitor {
size_t removed_class_count_;
};
+void ImageWriter::VisitClassLoaders(ClassLoaderVisitor* visitor) {
+ ReaderMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
+ visitor->Visit(nullptr); // Visit boot class loader.
+ Runtime::Current()->GetClassLinker()->VisitClassLoaders(visitor);
+}
+
void ImageWriter::PruneNonImageClasses() {
Runtime* runtime = Runtime::Current();
ClassLinker* class_linker = runtime->GetClassLinker();
@@ -909,10 +916,8 @@ void ImageWriter::PruneNonImageClasses() {
// 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);
+ VisitClassLoaders(&class_loader_visitor);
VLOG(compiler) << "Pruned " << class_loader_visitor.GetRemovedClassCount() << " classes";
}
@@ -1170,12 +1175,41 @@ mirror::Object* ImageWriter::TryAssignBinSlot(WorkStack& work_stack,
return it->second ? "true" : "false";
}
}
+ std::string ClassLoaders(ImageWriter* writer, mirror::Class* klass) const
+ REQUIRES_SHARED(Locks::mutator_lock_) {
+ struct DumpVisitor : ClassLoaderVisitor {
+ explicit DumpVisitor(mirror::Class* the_klass)
+ : klass_(the_klass),
+ storage_(),
+ descriptor_(the_klass->GetDescriptor(&storage_)) { }
+ void Visit(ObjPtr<mirror::ClassLoader> class_loader) OVERRIDE
+ REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) {
+ ClassTable* class_table =
+ Runtime::Current()->GetClassLinker()->ClassTableForClassLoader(class_loader);
+ if (class_table->Contains(klass_)) {
+ result_ << ";" << static_cast<const void*>(class_loader.Ptr()) << "/"
+ << (class_loader == klass_->GetClassLoader() ? "defining" : "initiating")
+ << "/"
+ << (class_table->LookupByDescriptor(klass_) == klass_ ? "ok" : "mismatch");
+ }
+ }
+ mirror::Class* klass_;
+ std::string storage_;
+ const char* descriptor_;
+ std::ostringstream result_;
+ };
+ DumpVisitor visitor(klass);
+ writer->VisitClassLoaders(&visitor);
+ std::string result = visitor.result_.str();
+ return result.empty() ? "<none>" : /* drop leading ';' */ result.substr(1u);
+ }
};
CHECK(!IsBootClassLoaderClass(as_klass)) << as_klass->PrettyClass()
<< " status:" << as_klass->GetStatus()
<< " " << static_cast<const void*>(as_klass)
<< " " << Dumper().ImageRanges()
- << " prune_memo:" << Dumper().PruneMemo(this, as_klass, prune_class_memo_);
+ << " prune_memo:" << Dumper().PruneMemo(this, as_klass, prune_class_memo_)
+ << " loaders:" << Dumper().ClassLoaders(this, as_klass);
}
LengthPrefixedArray<ArtField>* fields[] = {
as_klass->GetSFieldsPtr(), as_klass->GetIFieldsPtr(),
diff --git a/compiler/image_writer.h b/compiler/image_writer.h
index ad6ffd8f51..c5374838f6 100644
--- a/compiler/image_writer.h
+++ b/compiler/image_writer.h
@@ -50,6 +50,7 @@ class ImageSpace;
} // namespace space
} // namespace gc
+class ClassLoaderVisitor;
class ClassTable;
static constexpr int kInvalidFd = -1;
@@ -373,6 +374,9 @@ class ImageWriter FINAL {
void ComputeLazyFieldsForImageClasses()
REQUIRES_SHARED(Locks::mutator_lock_);
+ // Visit all class loaders.
+ void VisitClassLoaders(ClassLoaderVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
+
// Remove unwanted classes from various roots.
void PruneNonImageClasses() REQUIRES_SHARED(Locks::mutator_lock_);