• 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   void PrepareDexFilesForOatFile(TimingLogger* timings);
97 
98   // Set dex files classpath.
99   void SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files);
100 
101   // Initialize and destroy thread pools. This is exposed because we do not want
102   // to do this twice, for PreCompile() and CompileAll().
103   void InitializeThreadPools();
104   void FreeThreadPools();
105 
106   void PreCompile(jobject class_loader,
107                   const std::vector<const DexFile*>& dex_files,
108                   TimingLogger* timings,
109                   /*inout*/ HashSet<std::string>* image_classes,
110                   /*out*/ VerificationResults* verification_results)
111       REQUIRES(!Locks::mutator_lock_);
112   void CompileAll(jobject class_loader,
113                   const std::vector<const DexFile*>& dex_files,
114                   TimingLogger* timings)
115       REQUIRES(!Locks::mutator_lock_);
116 
GetCompilerOptions()117   const CompilerOptions& GetCompilerOptions() const {
118     return *compiler_options_;
119   }
120 
GetCompiler()121   Compiler* GetCompiler() const {
122     return compiler_.get();
123   }
124 
125   // Generate the trampolines that are invoked by unresolved direct methods.
126   std::unique_ptr<const std::vector<uint8_t>> CreateJniDlsymLookupTrampoline() const;
127   std::unique_ptr<const std::vector<uint8_t>> CreateJniDlsymLookupCriticalTrampoline() const;
128   std::unique_ptr<const std::vector<uint8_t>> CreateQuickGenericJniTrampoline() const;
129   std::unique_ptr<const std::vector<uint8_t>> CreateQuickImtConflictTrampoline() const;
130   std::unique_ptr<const std::vector<uint8_t>> CreateQuickResolutionTrampoline() const;
131   std::unique_ptr<const std::vector<uint8_t>> CreateQuickToInterpreterBridge() const;
132 
133   ClassStatus GetClassStatus(const ClassReference& ref) const;
134   bool GetCompiledClass(const ClassReference& ref, ClassStatus* status) const;
135 
136   CompiledMethod* GetCompiledMethod(MethodReference ref) const;
137   // Add a compiled method.
138   void AddCompiledMethod(const MethodReference& method_ref, CompiledMethod* const compiled_method);
139   CompiledMethod* RemoveCompiledMethod(const MethodReference& method_ref);
140 
141   // Resolve compiling method's class. Returns null on failure.
142   ObjPtr<mirror::Class> ResolveCompilingMethodsClass(const ScopedObjectAccess& soa,
143                                                      Handle<mirror::DexCache> dex_cache,
144                                                      Handle<mirror::ClassLoader> class_loader,
145                                                      const DexCompilationUnit* mUnit)
146       REQUIRES_SHARED(Locks::mutator_lock_);
147 
148   ObjPtr<mirror::Class> ResolveClass(const ScopedObjectAccess& soa,
149                                      Handle<mirror::DexCache> dex_cache,
150                                      Handle<mirror::ClassLoader> class_loader,
151                                      dex::TypeIndex type_index,
152                                      const DexCompilationUnit* mUnit)
153       REQUIRES_SHARED(Locks::mutator_lock_);
154 
155   // Resolve a field. Returns null on failure, including incompatible class change.
156   // NOTE: Unlike ClassLinker's ResolveField(), this method enforces is_static.
157   ArtField* ResolveField(const ScopedObjectAccess& soa,
158                          Handle<mirror::DexCache> dex_cache,
159                          Handle<mirror::ClassLoader> class_loader,
160                          uint32_t field_idx,
161                          bool is_static)
162       REQUIRES_SHARED(Locks::mutator_lock_);
163 
164   // Can we fast-path an IGET/IPUT access to an instance field? If yes, compute the field offset.
165   std::pair<bool, bool> IsFastInstanceField(ObjPtr<mirror::DexCache> dex_cache,
166                                             ObjPtr<mirror::Class> referrer_class,
167                                             ArtField* resolved_field,
168                                             uint16_t field_idx)
169       REQUIRES_SHARED(Locks::mutator_lock_);
170 
171   void ProcessedInstanceField(bool resolved);
172   void ProcessedStaticField(bool resolved, bool local);
173 
174   // Can we fast path instance field access? Computes field's offset and volatility.
175   bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put,
176                                 MemberOffset* field_offset, bool* is_volatile)
177       REQUIRES(!Locks::mutator_lock_);
178 
179   ArtField* ComputeInstanceFieldInfo(uint32_t field_idx,
180                                      const DexCompilationUnit* mUnit,
181                                      bool is_put,
182                                      const ScopedObjectAccess& soa)
183       REQUIRES_SHARED(Locks::mutator_lock_);
184 
185 
186   bool IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc);
187 
GetThreadCount()188   size_t GetThreadCount() const {
189     return parallel_thread_count_;
190   }
191 
SetDedupeEnabled(bool dedupe_enabled)192   void SetDedupeEnabled(bool dedupe_enabled) {
193     compiled_method_storage_.SetDedupeEnabled(dedupe_enabled);
194   }
195 
DedupeEnabled()196   bool DedupeEnabled() const {
197     return compiled_method_storage_.DedupeEnabled();
198   }
199 
200   // Checks whether profile guided compilation is enabled and if the method should be compiled
201   // according to the profile file.
202   bool ShouldCompileBasedOnProfile(const MethodReference& method_ref) const;
203 
204   // Checks whether profile guided verification is enabled and if the method should be verified
205   // according to the profile file.
206   bool ShouldVerifyClassBasedOnProfile(const DexFile& dex_file, uint16_t class_idx) const;
207 
208   void RecordClassStatus(const ClassReference& ref, ClassStatus status);
209 
210   // Get memory usage during compilation.
211   std::string GetMemoryUsageString(bool extended) const;
212 
SetHadHardVerifierFailure()213   void SetHadHardVerifierFailure() {
214     had_hard_verifier_failure_ = true;
215   }
AddSoftVerifierFailure()216   void AddSoftVerifierFailure() {
217     number_of_soft_verifier_failures_++;
218   }
219 
GetCompilerKind()220   Compiler::Kind GetCompilerKind() {
221     return compiler_kind_;
222   }
223 
GetCompiledMethodStorage()224   CompiledMethodStorage* GetCompiledMethodStorage() {
225     return &compiled_method_storage_;
226   }
227 
GetDexToDexCompiler()228   optimizer::DexToDexCompiler& GetDexToDexCompiler() {
229     return dex_to_dex_compiler_;
230   }
231 
232  private:
233   void LoadImageClasses(TimingLogger* timings, /*inout*/ HashSet<std::string>* image_classes)
234       REQUIRES(!Locks::mutator_lock_);
235 
236   // Attempt to resolve all type, methods, fields, and strings
237   // referenced from code in the dex file following PathClassLoader
238   // ordering semantics.
239   void Resolve(jobject class_loader,
240                const std::vector<const DexFile*>& dex_files,
241                TimingLogger* timings)
242       REQUIRES(!Locks::mutator_lock_);
243   void ResolveDexFile(jobject class_loader,
244                       const DexFile& dex_file,
245                       const std::vector<const DexFile*>& dex_files,
246                       ThreadPool* thread_pool,
247                       size_t thread_count,
248                       TimingLogger* timings)
249       REQUIRES(!Locks::mutator_lock_);
250 
251   // Do fast verification through VerifierDeps if possible. Return whether
252   // verification was successful.
253   bool FastVerify(jobject class_loader,
254                   const std::vector<const DexFile*>& dex_files,
255                   TimingLogger* timings,
256                   /*out*/ VerificationResults* verification_results);
257 
258   void Verify(jobject class_loader,
259               const std::vector<const DexFile*>& dex_files,
260               TimingLogger* timings,
261               /*out*/ VerificationResults* verification_results);
262 
263   void VerifyDexFile(jobject class_loader,
264                      const DexFile& dex_file,
265                      const std::vector<const DexFile*>& dex_files,
266                      ThreadPool* thread_pool,
267                      size_t thread_count,
268                      TimingLogger* timings)
269       REQUIRES(!Locks::mutator_lock_);
270 
271   void SetVerified(jobject class_loader,
272                    const std::vector<const DexFile*>& dex_files,
273                    TimingLogger* timings);
274   void SetVerifiedDexFile(jobject class_loader,
275                           const DexFile& dex_file,
276                           const std::vector<const DexFile*>& dex_files,
277                           ThreadPool* thread_pool,
278                           size_t thread_count,
279                           TimingLogger* timings)
280       REQUIRES(!Locks::mutator_lock_);
281 
282   void InitializeClasses(jobject class_loader,
283                          const std::vector<const DexFile*>& dex_files,
284                          TimingLogger* timings)
285       REQUIRES(!Locks::mutator_lock_);
286   void InitializeClasses(jobject class_loader,
287                          const DexFile& dex_file,
288                          const std::vector<const DexFile*>& dex_files,
289                          TimingLogger* timings)
290       REQUIRES(!Locks::mutator_lock_);
291 
292   void UpdateImageClasses(TimingLogger* timings, /*inout*/ HashSet<std::string>* image_classes)
293       REQUIRES(!Locks::mutator_lock_);
294 
295   void Compile(jobject class_loader,
296                const std::vector<const DexFile*>& dex_files,
297                TimingLogger* timings);
298 
299   void CheckThreadPools();
300 
301   // Resolve const string literals that are loaded from dex code. If only_startup_strings is
302   // specified, only methods that are marked startup in the profile are resolved.
303   void ResolveConstStrings(const std::vector<const DexFile*>& dex_files,
304                            bool only_startup_strings,
305                            /*inout*/ TimingLogger* timings);
306 
307   const CompilerOptions* const compiler_options_;
308 
309   std::unique_ptr<Compiler> compiler_;
310   Compiler::Kind compiler_kind_;
311 
312   // All class references that this compiler has compiled. Indexed by class defs.
313   using ClassStateTable = AtomicDexRefMap<ClassReference, ClassStatus>;
314   ClassStateTable compiled_classes_;
315   // All class references that are in the classpath. Indexed by class defs.
316   ClassStateTable classpath_classes_;
317 
318   typedef AtomicDexRefMap<MethodReference, CompiledMethod*> MethodTable;
319 
320   // All method references that this compiler has compiled.
321   MethodTable compiled_methods_;
322 
323   std::atomic<uint32_t> number_of_soft_verifier_failures_;
324 
325   bool had_hard_verifier_failure_;
326 
327   // A thread pool that can (potentially) run tasks in parallel.
328   size_t parallel_thread_count_;
329   std::unique_ptr<ThreadPool> parallel_thread_pool_;
330 
331   // A thread pool that guarantees running single-threaded on the main thread.
332   std::unique_ptr<ThreadPool> single_thread_pool_;
333 
334   class AOTCompilationStats;
335   std::unique_ptr<AOTCompilationStats> stats_;
336 
337   CompiledMethodStorage compiled_method_storage_;
338 
339   size_t max_arena_alloc_;
340 
341   // Compiler for dex to dex (quickening).
342   optimizer::DexToDexCompiler dex_to_dex_compiler_;
343 
344   friend class CommonCompilerDriverTest;
345   friend class CompileClassVisitor;
346   friend class DexToDexDecompilerTest;
347   friend class InitializeClassVisitor;
348   friend class verifier::VerifierDepsTest;
349   DISALLOW_COPY_AND_ASSIGN(CompilerDriver);
350 };
351 
352 }  // namespace art
353 
354 #endif  // ART_DEX2OAT_DRIVER_COMPILER_DRIVER_H_
355