diff options
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/dex/verification_results.h | 3 | ||||
| -rw-r--r-- | compiler/utils/atomic_method_ref_map-inl.h | 9 | ||||
| -rw-r--r-- | compiler/utils/atomic_method_ref_map.h | 2 | ||||
| -rw-r--r-- | compiler/verifier_deps_test.cc | 14 |
4 files changed, 28 insertions, 0 deletions
diff --git a/compiler/dex/verification_results.h b/compiler/dex/verification_results.h index ab735c1315..22749fa621 100644 --- a/compiler/dex/verification_results.h +++ b/compiler/dex/verification_results.h @@ -32,6 +32,7 @@ namespace art { namespace verifier { class MethodVerifier; +class VerifierDepsTest; } // namespace verifier class CompilerOptions; @@ -80,6 +81,8 @@ class VerificationResults { // Rejected classes. ReaderWriterMutex rejected_classes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; std::set<ClassReference> rejected_classes_ GUARDED_BY(rejected_classes_lock_); + + friend class verifier::VerifierDepsTest; }; } // namespace art diff --git a/compiler/utils/atomic_method_ref_map-inl.h b/compiler/utils/atomic_method_ref_map-inl.h index 70ea028b17..d71c2fe997 100644 --- a/compiler/utils/atomic_method_ref_map-inl.h +++ b/compiler/utils/atomic_method_ref_map-inl.h @@ -78,6 +78,15 @@ inline void AtomicMethodRefMap<T>::Visit(const Visitor& visitor) { } } +template <typename T> +inline void AtomicMethodRefMap<T>::ClearEntries() { + for (auto& it : arrays_) { + for (auto& element : it.second) { + element.StoreRelaxed(nullptr); + } + } +} + } // namespace art #endif // ART_COMPILER_UTILS_ATOMIC_METHOD_REF_MAP_INL_H_ diff --git a/compiler/utils/atomic_method_ref_map.h b/compiler/utils/atomic_method_ref_map.h index 11ab211817..fed848f563 100644 --- a/compiler/utils/atomic_method_ref_map.h +++ b/compiler/utils/atomic_method_ref_map.h @@ -55,6 +55,8 @@ class AtomicMethodRefMap { template <typename Visitor> void Visit(const Visitor& visitor); + void ClearEntries(); + private: // Verified methods. The method array is fixed to avoid needing a lock to extend it. using ElementArray = dchecked_vector<Atomic<T>>; diff --git a/compiler/verifier_deps_test.cc b/compiler/verifier_deps_test.cc index 90fe6da438..52765f9e73 100644 --- a/compiler/verifier_deps_test.cc +++ b/compiler/verifier_deps_test.cc @@ -19,8 +19,11 @@ #include "class_linker.h" #include "compiler/common_compiler_test.h" +#include "compiler/dex/verification_results.h" +#include "compiler/dex/verified_method.h" #include "compiler/driver/compiler_options.h" #include "compiler/driver/compiler_driver.h" +#include "compiler/utils/atomic_method_ref_map-inl.h" #include "compiler_callbacks.h" #include "dex_file.h" #include "dex_file_types.h" @@ -90,6 +93,14 @@ class VerifierDepsTest : public CommonCompilerTest { verifier_deps_.reset(callbacks_->GetVerifierDeps()); } callbacks_->SetVerifierDeps(nullptr); + // Clear entries in the verification results to avoid hitting a DCHECK that + // we always succeed inserting a new entry after verifying. + AtomicMethodRefMap<const VerifiedMethod*>* map = + &compiler_driver_->GetVerificationResults()->atomic_verified_methods_; + map->Visit([](const MethodReference& ref ATTRIBUTE_UNUSED, const VerifiedMethod* method) { + delete method; + }); + map->ClearEntries(); } void SetVerifierDeps(const std::vector<const DexFile*>& dex_files) { @@ -112,6 +123,9 @@ class VerifierDepsTest : public CommonCompilerTest { for (const DexFile* dex_file : dex_files_) { class_linker_->RegisterDexFile(*dex_file, loader.Get()); } + for (const DexFile* dex_file : dex_files_) { + compiler_driver_->GetVerificationResults()->AddDexFile(dex_file); + } } void LoadDexFile(ScopedObjectAccess* soa) REQUIRES_SHARED(Locks::mutator_lock_) { |