• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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_DEX2OAT_DRIVER_COMPILER_DRIVER_H_
18 #define ART_DEX2OAT_DRIVER_COMPILER_DRIVER_H_
19 
20 #include <atomic>
21 #include <set>
22 #include <string>
23 #include <vector>
24 
25 #include "arch/instruction_set.h"
26 #include "base/array_ref.h"
27 #include "base/bit_utils.h"
28 #include "base/hash_set.h"
29 #include "base/mutex.h"
30 #include "base/os.h"
31 #include "base/quasi_atomic.h"
32 #include "base/safe_map.h"
33 #include "base/timing_logger.h"
34 #include "class_status.h"
35 #include "compiler.h"
36 #include "dex/class_reference.h"
37 #include "dex/dex_file_types.h"
38 #include "dex/dex_to_dex_compiler.h"
39 #include "dex/method_reference.h"
40 #include "driver/compiled_method_storage.h"
41 #include "thread_pool.h"
42 #include "utils/atomic_dex_ref_map.h"
43 #include "utils/dex_cache_arrays_layout.h"
44 
45 namespace art {
46 
47 namespace dex {
48 struct CodeItem;
49 }  // namespace dex
50 
51 namespace mirror {
52 class Class;
53 class DexCache;
54 }  // namespace mirror
55 
56 namespace verifier {
57 class MethodVerifier;
58 class VerifierDepsTest;
59 }  // namespace verifier
60 
61 class ArtField;
62 class BitVector;
63 class CompiledMethod;
64 class CompilerOptions;
65 class DexCompilationUnit;
66 class DexFile;
67 template<class T> class Handle;
68 struct InlineIGetIPutData;
69 class InstructionSetFeatures;
70 class InternTable;
71 enum InvokeType : uint32_t;
72 class MemberOffset;
73 template<class MirrorType> class ObjPtr;
74 class ParallelCompilationManager;
75 class ProfileCompilationInfo;
76 class ScopedObjectAccess;
77 template <class Allocator> class SrcMap;
78 class TimingLogger;
79 class VdexFile;
80 class VerificationResults;
81 
82 class CompilerDriver {
83  public:
84   // Create a compiler targeting the requested "instruction_set".
85   // "image" should be true if image specific optimizations should be
86   // enabled.  "image_classes" lets the compiler know what classes it
87   // can assume will be in the image, with null implying all available
88   // classes.
89   CompilerDriver(const CompilerOptions* compiler_options,
90                  Compiler::Kind compiler_kind,
91                  size_t thread_count,
92                  int swap_fd);
93 
94   ~CompilerDriver();
95 
96   // Set dex files classpath.
97   void SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files);
98 
99   // Initialize and destroy thread pools. This is exposed because we do not want
100   // to do this twice, for PreCompile() and CompileAll().
101   void InitializeThreadPools();
102   void FreeThreadPools();
103 
104   void PreCompile(jobject class_loader,
105                   const std::vector<const DexFile*>& dex_files,
106                   TimingLogger* timings,
107                   /*inout*/ HashSet<std::string>* image_classes,
108                   /*out*/ VerificationResults* verification_results)
109       REQUIRES(!Locks::mutator_lock_);
110   void CompileAll(jobject class_loader,
111                   const std::vector<const DexFile*>& dex_files,
112                   TimingLogger* timings)
113       REQUIRES(!Locks::mutator_lock_);
114 
GetCompilerOptions()115   const CompilerOptions& GetCompilerOptions() const {
116     return *compiler_options_;
117   }
118 
GetCompiler()119   Compiler* GetCompiler() const {
120     return compiler_.get();
121   }
122 
123   // Generate the trampolines that are invoked by unresolved direct methods.
124   std::unique_ptr<const std::vector<uint8_t>> CreateJniDlsymLookup() const;
125   std::unique_ptr<const std::vector<uint8_t>> CreateQuickGenericJniTrampoline() const;
126   std::unique_ptr<const std::vector<uint8_t>> CreateQuickImtConflictTrampoline() const;
127   std::unique_ptr<const std::vector<uint8_t>> CreateQuickResolutionTrampoline() const;
128   std::unique_ptr<const std::vector<uint8_t>> CreateQuickToInterpreterBridge() const;
129 
130   ClassStatus GetClassStatus(const ClassReference& ref) const;
131   bool GetCompiledClass(const ClassReference& ref, ClassStatus* status) const;
132 
133   CompiledMethod* GetCompiledMethod(MethodReference ref) const;
134   // Add a compiled method.
135   void AddCompiledMethod(const MethodReference& method_ref, CompiledMethod* const compiled_method);
136   CompiledMethod* RemoveCompiledMethod(const MethodReference& method_ref);
137 
138   // Resolve compiling method's class. Returns null on failure.
139   ObjPtr<mirror::Class> ResolveCompilingMethodsClass(const ScopedObjectAccess& soa,
140                                                      Handle<mirror::DexCache> dex_cache,
141                                                      Handle<mirror::ClassLoader> class_loader,
142                                                      const DexCompilationUnit* mUnit)
143       REQUIRES_SHARED(Locks::mutator_lock_);
144 
145   ObjPtr<mirror::Class> ResolveClass(const ScopedObjectAccess& soa,
146                                      Handle<mirror::DexCache> dex_cache,
147                                      Handle<mirror::ClassLoader> class_loader,
148                                      dex::TypeIndex type_index,
149                                      const DexCompilationUnit* mUnit)
150       REQUIRES_SHARED(Locks::mutator_lock_);
151 
152   // Resolve a field. Returns null on failure, including incompatible class change.
153   // NOTE: Unlike ClassLinker's ResolveField(), this method enforces is_static.
154   ArtField* ResolveField(const ScopedObjectAccess& soa,
155                          Handle<mirror::DexCache> dex_cache,
156                          Handle<mirror::ClassLoader> class_loader,
157                          uint32_t field_idx,
158                          bool is_static)
159       REQUIRES_SHARED(Locks::mutator_lock_);
160 
161   // Can we fast-path an IGET/IPUT access to an instance field? If yes, compute the field offset.
162   std::pair<bool, bool> IsFastInstanceField(ObjPtr<mirror::DexCache> dex_cache,
163                                             ObjPtr<mirror::Class> referrer_class,
164                                             ArtField* resolved_field,
165                                             uint16_t field_idx)
166       REQUIRES_SHARED(Locks::mutator_lock_);
167 
168   void ProcessedInstanceField(bool resolved);
169   void ProcessedStaticField(bool resolved, bool local);
170 
171   // Can we fast path instance field access? Computes field's offset and volatility.
172   bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put,
173                                 MemberOffset* field_offset, bool* is_volatile)
174       REQUIRES(!Locks::mutator_lock_);
175 
176   ArtField* ComputeInstanceFieldInfo(uint32_t field_idx,
177                                      const DexCompilationUnit* mUnit,
178                                      bool is_put,
179                                      const ScopedObjectAccess& soa)
180       REQUIRES_SHARED(Locks::mutator_lock_);
181 
182 
183   bool IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc);
184 
GetThreadCount()185   size_t GetThreadCount() const {
186     return parallel_thread_count_;
187   }
188 
SetDedupeEnabled(bool dedupe_enabled)189   void SetDedupeEnabled(bool dedupe_enabled) {
190     compiled_method_storage_.SetDedupeEnabled(dedupe_enabled);
191   }
192 
DedupeEnabled()193   bool DedupeEnabled() const {
194     return compiled_method_storage_.DedupeEnabled();
195   }
196 
197   // Checks whether profile guided compilation is enabled and if the method should be compiled
198   // according to the profile file.
199   bool ShouldCompileBasedOnProfile(const MethodReference& method_ref) const;
200 
201   // Checks whether profile guided verification is enabled and if the method should be verified
202   // according to the profile file.
203   bool ShouldVerifyClassBasedOnProfile(const DexFile& dex_file, uint16_t class_idx) const;
204 
205   void RecordClassStatus(const ClassReference& ref, ClassStatus status);
206 
207   // Get memory usage during compilation.
208   std::string GetMemoryUsageString(bool extended) const;
209 
SetHadHardVerifierFailure()210   void SetHadHardVerifierFailure() {
211     had_hard_verifier_failure_ = true;
212   }
AddSoftVerifierFailure()213   void AddSoftVerifierFailure() {
214     number_of_soft_verifier_failures_++;
215   }
216 
GetCompilerKind()217   Compiler::Kind GetCompilerKind() {
218     return compiler_kind_;
219   }
220 
GetCompiledMethodStorage()221   CompiledMethodStorage* GetCompiledMethodStorage() {
222     return &compiled_method_storage_;
223   }
224 
GetDexToDexCompiler()225   optimizer::DexToDexCompiler& GetDexToDexCompiler() {
226     return dex_to_dex_compiler_;
227   }
228 
229  private:
230   void LoadImageClasses(TimingLogger* timings, /*inout*/ HashSet<std::string>* image_classes)
231       REQUIRES(!Locks::mutator_lock_);
232 
233   // Attempt to resolve all type, methods, fields, and strings
234   // referenced from code in the dex file following PathClassLoader
235   // ordering semantics.
236   void Resolve(jobject class_loader,
237                const std::vector<const DexFile*>& dex_files,
238                TimingLogger* timings)
239       REQUIRES(!Locks::mutator_lock_);
240   void ResolveDexFile(jobject class_loader,
241                       const DexFile& dex_file,
242                       const std::vector<const DexFile*>& dex_files,
243                       ThreadPool* thread_pool,
244                       size_t thread_count,
245                       TimingLogger* timings)
246       REQUIRES(!Locks::mutator_lock_);
247 
248   // Do fast verification through VerifierDeps if possible. Return whether
249   // verification was successful.
250   bool FastVerify(jobject class_loader,
251                   const std::vector<const DexFile*>& dex_files,
252                   TimingLogger* timings,
253                   /*out*/ VerificationResults* verification_results);
254 
255   void Verify(jobject class_loader,
256               const std::vector<const DexFile*>& dex_files,
257               TimingLogger* timings,
258               /*out*/ VerificationResults* verification_results);
259 
260   void VerifyDexFile(jobject class_loader,
261                      const DexFile& dex_file,
262                      const std::vector<const DexFile*>& dex_files,
263                      ThreadPool* thread_pool,
264                      size_t thread_count,
265                      TimingLogger* timings)
266       REQUIRES(!Locks::mutator_lock_);
267 
268   void SetVerified(jobject class_loader,
269                    const std::vector<const DexFile*>& dex_files,
270                    TimingLogger* timings);
271   void SetVerifiedDexFile(jobject class_loader,
272                           const DexFile& dex_file,
273                           const std::vector<const DexFile*>& dex_files,
274                           ThreadPool* thread_pool,
275                           size_t thread_count,
276                           TimingLogger* timings)
277       REQUIRES(!Locks::mutator_lock_);
278 
279   void InitializeClasses(jobject class_loader,
280                          const std::vector<const DexFile*>& dex_files,
281                          TimingLogger* timings)
282       REQUIRES(!Locks::mutator_lock_);
283   void InitializeClasses(jobject class_loader,
284                          const DexFile& dex_file,
285                          const std::vector<const DexFile*>& dex_files,
286                          TimingLogger* timings)
287       REQUIRES(!Locks::mutator_lock_);
288 
289   void UpdateImageClasses(TimingLogger* timings, /*inout*/ HashSet<std::string>* image_classes)
290       REQUIRES(!Locks::mutator_lock_);
291 
292   void Compile(jobject class_loader,
293                const std::vector<const DexFile*>& dex_files,
294                TimingLogger* timings);
295 
296   void CheckThreadPools();
297 
298   // Resolve const string literals that are loaded from dex code. If only_startup_strings is
299   // specified, only methods that are marked startup in the profile are resolved.
300   void ResolveConstStrings(const std::vector<const DexFile*>& dex_files,
301                            bool only_startup_strings,
302                            /*inout*/ TimingLogger* timings);
303 
304   const CompilerOptions* const compiler_options_;
305 
306   std::unique_ptr<Compiler> compiler_;
307   Compiler::Kind compiler_kind_;
308 
309   // All class references that this compiler has compiled. Indexed by class defs.
310   using ClassStateTable = AtomicDexRefMap<ClassReference, ClassStatus>;
311   ClassStateTable compiled_classes_;
312   // All class references that are in the classpath. Indexed by class defs.
313   ClassStateTable classpath_classes_;
314 
315   typedef AtomicDexRefMap<MethodReference, CompiledMethod*> MethodTable;
316 
317   // All method references that this compiler has compiled.
318   MethodTable compiled_methods_;
319 
320   std::atomic<uint32_t> number_of_soft_verifier_failures_;
321 
322   bool had_hard_verifier_failure_;
323 
324   // A thread pool that can (potentially) run tasks in parallel.
325   size_t parallel_thread_count_;
326   std::unique_ptr<ThreadPool> parallel_thread_pool_;
327 
328   // A thread pool that guarantees running single-threaded on the main thread.
329   std::unique_ptr<ThreadPool> single_thread_pool_;
330 
331   class AOTCompilationStats;
332   std::unique_ptr<AOTCompilationStats> stats_;
333 
334   CompiledMethodStorage compiled_method_storage_;
335 
336   size_t max_arena_alloc_;
337 
338   // Compiler for dex to dex (quickening).
339   optimizer::DexToDexCompiler dex_to_dex_compiler_;
340 
341   friend class CommonCompilerDriverTest;
342   friend class CompileClassVisitor;
343   friend class DexToDexDecompilerTest;
344   friend class InitializeClassVisitor;
345   friend class verifier::VerifierDepsTest;
346   DISALLOW_COPY_AND_ASSIGN(CompilerDriver);
347 };
348 
349 }  // namespace art
350 
351 #endif  // ART_DEX2OAT_DRIVER_COMPILER_DRIVER_H_
352