1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_COMPILER_DEX_VERIFICATION_RESULTS_H_
18 #define ART_COMPILER_DEX_VERIFICATION_RESULTS_H_
19 
20 #include <stdint.h>
21 #include <set>
22 
23 #include "base/dchecked_vector.h"
24 #include "base/macros.h"
25 #include "base/mutex.h"
26 #include "base/safe_map.h"
27 #include "dex/class_reference.h"
28 #include "dex/method_reference.h"
29 #include "utils/atomic_dex_ref_map.h"
30 
31 namespace art {
32 
33 namespace verifier {
34 class MethodVerifier;
35 class VerifierDepsTest;
36 }  // namespace verifier
37 
38 class CompilerOptions;
39 class VerifiedMethod;
40 
41 // Used by CompilerCallbacks to track verification information from the Runtime.
42 class VerificationResults {
43  public:
44   explicit VerificationResults(const CompilerOptions* compiler_options);
45   ~VerificationResults();
46 
47   void ProcessVerifiedMethod(verifier::MethodVerifier* method_verifier)
48       REQUIRES_SHARED(Locks::mutator_lock_)
49       REQUIRES(!verified_methods_lock_);
50 
51   void CreateVerifiedMethodFor(MethodReference ref)
52       REQUIRES(!verified_methods_lock_);
53 
54   const VerifiedMethod* GetVerifiedMethod(MethodReference ref) const
55       REQUIRES(!verified_methods_lock_);
56 
57   void AddRejectedClass(ClassReference ref) REQUIRES(!rejected_classes_lock_);
58   bool IsClassRejected(ClassReference ref) const REQUIRES(!rejected_classes_lock_);
59 
60   bool IsCandidateForCompilation(MethodReference& method_ref, const uint32_t access_flags) const;
61 
62   // Add a dex file to enable using the atomic map.
63   void AddDexFile(const DexFile* dex_file) REQUIRES(!verified_methods_lock_);
64 
65  private:
66   // Verified methods. The method array is fixed to avoid needing a lock to extend it.
67   using AtomicMap = AtomicDexRefMap<MethodReference, const VerifiedMethod*>;
68   using VerifiedMethodMap = SafeMap<MethodReference, const VerifiedMethod*>;
69 
70   VerifiedMethodMap verified_methods_ GUARDED_BY(verified_methods_lock_);
71   const CompilerOptions* const compiler_options_;
72 
73   // Dex2oat can add dex files to atomic_verified_methods_ to avoid locking when calling
74   // GetVerifiedMethod.
75   AtomicMap atomic_verified_methods_;
76 
77   // TODO: External locking during CompilerDriver::PreCompile(), no locking during compilation.
78   mutable ReaderWriterMutex verified_methods_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
79 
80   // Rejected classes.
81   // TODO: External locking during CompilerDriver::PreCompile(), no locking during compilation.
82   mutable ReaderWriterMutex rejected_classes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
83   std::set<ClassReference> rejected_classes_ GUARDED_BY(rejected_classes_lock_);
84 
85   friend class verifier::VerifierDepsTest;
86 };
87 
88 }  // namespace art
89 
90 #endif  // ART_COMPILER_DEX_VERIFICATION_RESULTS_H_
91