summaryrefslogtreecommitdiff
path: root/compiler/driver/compiler_driver.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-04-04 18:40:51 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-04-04 18:40:51 +0000
commit2746c68840535294b1febc2224e81280f002909d (patch)
tree4dcbb7c502d72bfb4b29fa0ad4c14f7e6e77d7ab /compiler/driver/compiler_driver.cc
parent7d9a5b0fbceef5806f059060d47533b9e699ec28 (diff)
parent085a072b209ac24ab4cb6b565a1570b485ec2fa3 (diff)
Merge "Mark array classes as verification attempted"
Diffstat (limited to 'compiler/driver/compiler_driver.cc')
-rw-r--r--compiler/driver/compiler_driver.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index d29d528c27..be149af82a 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -2486,6 +2486,20 @@ void CompilerDriver::InitializeClasses(jobject jni_class_loader,
context.ForAll(0, dex_file.NumClassDefs(), &visitor, init_thread_count);
}
+class InitializeArrayClassVisitor : public ClassVisitor {
+ public:
+ virtual bool operator()(mirror::Class* klass) OVERRIDE SHARED_REQUIRES(Locks::mutator_lock_) {
+ if (klass->IsArrayClass()) {
+ StackHandleScope<1> hs(Thread::Current());
+ Runtime::Current()->GetClassLinker()->EnsureInitialized(hs.Self(),
+ hs.NewHandle(klass),
+ true,
+ true);
+ }
+ return true;
+ }
+};
+
void CompilerDriver::InitializeClasses(jobject class_loader,
const std::vector<const DexFile*>& dex_files,
TimingLogger* timings) {
@@ -2494,6 +2508,14 @@ void CompilerDriver::InitializeClasses(jobject class_loader,
CHECK(dex_file != nullptr);
InitializeClasses(class_loader, *dex_file, dex_files, timings);
}
+ {
+ // Make sure that we call EnsureIntiailized on all the array classes to call
+ // SetVerificationAttempted so that the access flags are set. If we do not do this they get
+ // changed at runtime resulting in more dirty image pages.
+ ScopedObjectAccess soa(Thread::Current());
+ InitializeArrayClassVisitor visitor;
+ Runtime::Current()->GetClassLinker()->VisitClasses(&visitor);
+ }
if (IsBootImage()) {
// Prune garbage objects created during aborted transactions.
Runtime::Current()->GetHeap()->CollectGarbage(true);