diff options
| author | 2016-06-15 17:44:14 +0000 | |
|---|---|---|
| committer | 2016-06-15 17:44:14 +0000 | |
| commit | abdda2fb52eb7e9a6916899a913f78251d8ed277 (patch) | |
| tree | 165a31831ae077827b1e7b973bd5602125b5b142 /compiler/driver/compiler_driver.cc | |
| parent | 2b87a47c09823031c4fe336dcef0867605debfd7 (diff) | |
| parent | badee9820fcf5dca5f8c46c3215ae1779ee7736e (diff) | |
Merge "Optimize IMT"
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
| -rw-r--r-- | compiler/driver/compiler_driver.cc | 21 |
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, |