summaryrefslogtreecommitdiff
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-06-15 17:44:14 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-06-15 17:44:14 +0000
commitabdda2fb52eb7e9a6916899a913f78251d8ed277 (patch)
tree165a31831ae077827b1e7b973bd5602125b5b142 /compiler/driver/compiler_driver.cc
parent2b87a47c09823031c4fe336dcef0867605debfd7 (diff)
parentbadee9820fcf5dca5f8c46c3215ae1779ee7736e (diff)
Merge "Optimize IMT"
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r--compiler/driver/compiler_driver.cc21
1 files changed, 19 insertions, 2 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index a4b48892fb..131be37a33 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -2522,11 +2522,28 @@ class InitializeArrayClassesAndCreateConflictTablesVisitor : public ClassVisitor
true);
}
// Create the conflict tables.
- if (!klass->IsTemp() && klass->ShouldHaveEmbeddedImtAndVTable()) {
+ FillIMTAndConflictTables(klass);
+ return true;
+ }
+
+ private:
+ void FillIMTAndConflictTables(mirror::Class* klass) SHARED_REQUIRES(Locks::mutator_lock_) {
+ if (!klass->ShouldHaveImt()) {
+ return;
+ }
+ if (visited_classes_.find(klass) != visited_classes_.end()) {
+ return;
+ }
+ if (klass->HasSuperClass()) {
+ FillIMTAndConflictTables(klass->GetSuperClass());
+ }
+ if (!klass->IsTemp()) {
Runtime::Current()->GetClassLinker()->FillIMTAndConflictTables(klass);
}
- return true;
+ visited_classes_.insert(klass);
}
+
+ std::set<mirror::Class*> visited_classes_;
};
void CompilerDriver::InitializeClasses(jobject class_loader,