compiler_driver.h revision c50d8e11a098cc5c6239aa86b47d4fcf8cbb4899
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_COMPILER_DRIVER_COMPILER_DRIVER_H_
18#define ART_COMPILER_DRIVER_COMPILER_DRIVER_H_
19
20#include <set>
21#include <string>
22#include <vector>
23
24#include "base/mutex.h"
25#include "class_reference.h"
26#include "compiled_class.h"
27#include "compiled_method.h"
28#include "dex_file.h"
29#include "instruction_set.h"
30#include "invoke_type.h"
31#include "method_reference.h"
32#include "os.h"
33#include "runtime.h"
34#include "safe_map.h"
35#include "thread_pool.h"
36
37namespace art {
38
39class AOTCompilationStats;
40class ParallelCompilationManager;
41class DexCompilationUnit;
42class OatWriter;
43class TimingLogger;
44
45enum CompilerBackend {
46  kQuick,
47  kPortable,
48  kNoBackend
49};
50
51// Thread-local storage compiler worker threads
52class CompilerTls {
53  public:
54    CompilerTls() : llvm_info_(NULL) {}
55    ~CompilerTls() {}
56
57    void* GetLLVMInfo() { return llvm_info_; }
58
59    void SetLLVMInfo(void* llvm_info) { llvm_info_ = llvm_info; }
60
61  private:
62    void* llvm_info_;
63};
64
65class CompilerDriver {
66 public:
67  typedef std::set<std::string> DescriptorSet;
68
69  // Create a compiler targeting the requested "instruction_set".
70  // "image" should be true if image specific optimizations should be
71  // enabled.  "image_classes" lets the compiler know what classes it
72  // can assume will be in the image, with NULL implying all available
73  // classes.
74  explicit CompilerDriver(CompilerBackend compiler_backend, InstructionSet instruction_set,
75                          bool image, DescriptorSet* image_classes,
76                          size_t thread_count, bool dump_stats);
77
78  ~CompilerDriver();
79
80  void CompileAll(jobject class_loader, const std::vector<const DexFile*>& dex_files,
81                  TimingLogger& timings)
82      LOCKS_EXCLUDED(Locks::mutator_lock_);
83
84  // Compile a single Method
85  void CompileOne(const mirror::AbstractMethod* method, TimingLogger& timings)
86      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
87
88  InstructionSet GetInstructionSet() const {
89    return instruction_set_;
90  }
91
92  CompilerBackend GetCompilerBackend() const {
93    return compiler_backend_;
94  }
95
96  bool IsImage() const {
97    return image_;
98  }
99
100  DescriptorSet* GetImageClasses() const {
101    return image_classes_.get();
102  }
103
104  CompilerTls* GetTls();
105
106  // Generate the trampolines that are invoked by unresolved direct methods.
107  const std::vector<uint8_t>* CreatePortableResolutionTrampoline() const
108      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
109  const std::vector<uint8_t>* CreateQuickResolutionTrampoline() const
110      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
111  const std::vector<uint8_t>* CreateInterpreterToInterpreterEntry() const
112      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
113  const std::vector<uint8_t>* CreateInterpreterToQuickEntry() const
114      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
115
116  CompiledClass* GetCompiledClass(ClassReference ref) const
117      LOCKS_EXCLUDED(compiled_classes_lock_);
118
119  CompiledMethod* GetCompiledMethod(MethodReference ref) const
120      LOCKS_EXCLUDED(compiled_methods_lock_);
121
122  void AddRequiresConstructorBarrier(Thread* self, const DexFile* dex_file, size_t class_def_index);
123  bool RequiresConstructorBarrier(Thread* self, const DexFile* dex_file, size_t class_def_index);
124
125  // Callbacks from compiler to see what runtime checks must be generated.
126
127  bool CanAssumeTypeIsPresentInDexCache(const DexFile& dex_file, uint32_t type_idx)
128      LOCKS_EXCLUDED(Locks::mutator_lock_);
129
130  bool CanAssumeStringIsPresentInDexCache(const DexFile& dex_file, uint32_t string_idx)
131      LOCKS_EXCLUDED(Locks::mutator_lock_);
132
133  // Are runtime access checks necessary in the compiled code?
134  bool CanAccessTypeWithoutChecks(uint32_t referrer_idx, const DexFile& dex_file,
135                                  uint32_t type_idx, bool* type_known_final = NULL,
136                                  bool* type_known_abstract = NULL,
137                                  bool* equals_referrers_class = NULL)
138      LOCKS_EXCLUDED(Locks::mutator_lock_);
139
140  // Are runtime access and instantiable checks necessary in the code?
141  bool CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx, const DexFile& dex_file,
142                                              uint32_t type_idx)
143     LOCKS_EXCLUDED(Locks::mutator_lock_);
144
145  // Can we fast path instance field access? Computes field's offset and volatility.
146  bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
147                                int& field_offset, bool& is_volatile, bool is_put)
148      LOCKS_EXCLUDED(Locks::mutator_lock_);
149
150  // Can we fastpath static field access? Computes field's offset, volatility and whether the
151  // field is within the referrer (which can avoid checking class initialization).
152  bool ComputeStaticFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit,
153                              int& field_offset, int& ssb_index,
154                              bool& is_referrers_class, bool& is_volatile, bool is_put)
155      LOCKS_EXCLUDED(Locks::mutator_lock_);
156
157  // Can we fastpath a interface, super class or virtual method call? Computes method's vtable
158  // index.
159  bool ComputeInvokeInfo(const DexCompilationUnit* mUnit, const uint32_t dex_pc,
160                         InvokeType& type, MethodReference& target_method, int& vtable_idx,
161                         uintptr_t& direct_code, uintptr_t& direct_method, bool update_stats)
162      LOCKS_EXCLUDED(Locks::mutator_lock_);
163
164  bool IsSafeCast(const MethodReference& mr, uint32_t dex_pc);
165
166  // Record patch information for later fix up.
167  void AddCodePatch(const DexFile* dex_file,
168                    uint32_t referrer_method_idx,
169                    InvokeType referrer_invoke_type,
170                    uint32_t target_method_idx,
171                    InvokeType target_invoke_type,
172                    size_t literal_offset)
173      LOCKS_EXCLUDED(compiled_methods_lock_);
174  void AddMethodPatch(const DexFile* dex_file,
175                      uint32_t referrer_method_idx,
176                      InvokeType referrer_invoke_type,
177                      uint32_t target_method_idx,
178                      InvokeType target_invoke_type,
179                      size_t literal_offset)
180      LOCKS_EXCLUDED(compiled_methods_lock_);
181
182  void SetBitcodeFileName(std::string const& filename);
183
184  bool GetSupportBootImageFixup() const {
185    return support_boot_image_fixup_;
186  }
187
188  void SetSupportBootImageFixup(bool support_boot_image_fixup) {
189    support_boot_image_fixup_ = support_boot_image_fixup;
190  }
191
192
193  bool WriteElf(const std::string& android_root,
194                bool is_host,
195                const std::vector<const DexFile*>& dex_files,
196                OatWriter& oat_writer,
197                File* file);
198
199  // TODO: move to a common home for llvm helpers once quick/portable are merged
200  static void InstructionSetToLLVMTarget(InstructionSet instruction_set,
201                                         std::string& target_triple,
202                                         std::string& target_cpu,
203                                         std::string& target_attr);
204
205  void SetCompilerContext(void* compiler_context) {
206    compiler_context_ = compiler_context;
207  }
208
209  void* GetCompilerContext() const {
210    return compiler_context_;
211  }
212
213  size_t GetThreadCount() const {
214    return thread_count_;
215  }
216
217  class PatchInformation {
218   public:
219    const DexFile& GetDexFile() const {
220      return *dex_file_;
221    }
222    uint32_t GetReferrerMethodIdx() const {
223      return referrer_method_idx_;
224    }
225    InvokeType GetReferrerInvokeType() const {
226      return referrer_invoke_type_;
227    }
228    uint32_t GetTargetMethodIdx() const {
229      return target_method_idx_;
230    }
231    InvokeType GetTargetInvokeType() const {
232      return target_invoke_type_;
233    }
234    size_t GetLiteralOffset() const {;
235      return literal_offset_;
236    }
237
238   private:
239    PatchInformation(const DexFile* dex_file,
240                     uint32_t referrer_method_idx,
241                     InvokeType referrer_invoke_type,
242                     uint32_t target_method_idx,
243                     InvokeType target_invoke_type,
244                     size_t literal_offset)
245      : dex_file_(dex_file),
246        referrer_method_idx_(referrer_method_idx),
247        referrer_invoke_type_(referrer_invoke_type),
248        target_method_idx_(target_method_idx),
249        target_invoke_type_(target_invoke_type),
250        literal_offset_(literal_offset) {
251      CHECK(dex_file_ != NULL);
252    }
253
254    const DexFile* dex_file_;
255    uint32_t referrer_method_idx_;
256    InvokeType referrer_invoke_type_;
257    uint32_t target_method_idx_;
258    InvokeType target_invoke_type_;
259    size_t literal_offset_;
260
261    friend class CompilerDriver;
262    DISALLOW_COPY_AND_ASSIGN(PatchInformation);
263  };
264
265  const std::vector<const PatchInformation*>& GetCodeToPatch() const {
266    return code_to_patch_;
267  }
268  const std::vector<const PatchInformation*>& GetMethodsToPatch() const {
269    return methods_to_patch_;
270  }
271
272  // Checks if class specified by type_idx is one of the image_classes_
273  bool IsImageClass(const char* descriptor) const;
274
275  void RecordClassStatus(ClassReference ref, CompiledClass* compiled_class);
276
277 private:
278  // Compute constant code and method pointers when possible
279  void GetCodeAndMethodForDirectCall(InvokeType type, InvokeType sharp_type,
280                                     mirror::Class* referrer_class,
281                                     mirror::AbstractMethod* method,
282                                     uintptr_t& direct_code, uintptr_t& direct_method,
283                                     bool update_stats)
284      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
285
286  void PreCompile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
287                  ThreadPool& thread_pool, TimingLogger& timings)
288      LOCKS_EXCLUDED(Locks::mutator_lock_);
289
290  void LoadImageClasses(TimingLogger& timings);
291
292  // Attempt to resolve all type, methods, fields, and strings
293  // referenced from code in the dex file following PathClassLoader
294  // ordering semantics.
295  void Resolve(jobject class_loader, const std::vector<const DexFile*>& dex_files,
296               ThreadPool& thread_pool, TimingLogger& timings)
297      LOCKS_EXCLUDED(Locks::mutator_lock_);
298  void ResolveDexFile(jobject class_loader, const DexFile& dex_file,
299                      ThreadPool& thread_pool, TimingLogger& timings)
300      LOCKS_EXCLUDED(Locks::mutator_lock_);
301
302  void Verify(jobject class_loader, const std::vector<const DexFile*>& dex_files,
303              ThreadPool& thread_pool, TimingLogger& timings);
304  void VerifyDexFile(jobject class_loader, const DexFile& dex_file,
305                     ThreadPool& thread_pool, TimingLogger& timings)
306      LOCKS_EXCLUDED(Locks::mutator_lock_);
307
308  void InitializeClasses(jobject class_loader, const std::vector<const DexFile*>& dex_files,
309                         ThreadPool& thread_pool, TimingLogger& timings)
310      LOCKS_EXCLUDED(Locks::mutator_lock_);
311  void InitializeClasses(jobject class_loader, const DexFile& dex_file,
312                         ThreadPool& thread_pool, TimingLogger& timings)
313      LOCKS_EXCLUDED(Locks::mutator_lock_, compiled_classes_lock_);
314
315  void UpdateImageClasses(TimingLogger& timings);
316  static void FindClinitImageClassesCallback(mirror::Object* object, void* arg)
317      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
318
319  void Compile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
320               ThreadPool& thread_pool, TimingLogger& timings);
321  void CompileDexFile(jobject class_loader, const DexFile& dex_file,
322                      ThreadPool& thread_pool, TimingLogger& timings)
323      LOCKS_EXCLUDED(Locks::mutator_lock_);
324  void CompileMethod(const DexFile::CodeItem* code_item, uint32_t access_flags,
325                     InvokeType invoke_type, uint32_t class_def_idx, uint32_t method_idx,
326                     jobject class_loader, const DexFile& dex_file,
327                     bool allow_dex_to_dex_compilation)
328      LOCKS_EXCLUDED(compiled_methods_lock_);
329
330  static void CompileClass(const ParallelCompilationManager* context, size_t class_def_index)
331      LOCKS_EXCLUDED(Locks::mutator_lock_);
332
333  std::vector<const PatchInformation*> code_to_patch_;
334  std::vector<const PatchInformation*> methods_to_patch_;
335
336  CompilerBackend compiler_backend_;
337
338  InstructionSet instruction_set_;
339
340  // All class references that require
341  mutable Mutex freezing_constructor_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
342  std::set<ClassReference> freezing_constructor_classes_ GUARDED_BY(freezing_constructor_lock_);
343
344  typedef SafeMap<const ClassReference, CompiledClass*> ClassTable;
345  // All class references that this compiler has compiled.
346  mutable Mutex compiled_classes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
347  ClassTable compiled_classes_ GUARDED_BY(compiled_classes_lock_);
348
349  typedef SafeMap<const MethodReference, CompiledMethod*, MethodReferenceComparator> MethodTable;
350  // All method references that this compiler has compiled.
351  mutable Mutex compiled_methods_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
352  MethodTable compiled_methods_ GUARDED_BY(compiled_methods_lock_);
353
354  const bool image_;
355
356  // If image_ is true, specifies the classes that will be included in
357  // the image. Note if image_classes_ is NULL, all classes are
358  // included in the image.
359  UniquePtr<DescriptorSet> image_classes_;
360
361  size_t thread_count_;
362  uint64_t start_ns_;
363
364  UniquePtr<AOTCompilationStats> stats_;
365
366  bool dump_stats_;
367
368  typedef void (*CompilerCallbackFn)(CompilerDriver& driver);
369  typedef MutexLock* (*CompilerMutexLockFn)(CompilerDriver& driver);
370
371  void* compiler_library_;
372
373  typedef CompiledMethod* (*CompilerFn)(CompilerDriver& driver,
374                                        const DexFile::CodeItem* code_item,
375                                        uint32_t access_flags, InvokeType invoke_type,
376                                        uint32_t class_dex_idx, uint32_t method_idx,
377                                        jobject class_loader, const DexFile& dex_file);
378  CompilerFn compiler_;
379#ifdef ART_SEA_IR_MODE
380  CompilerFn sea_ir_compiler_;
381#endif
382
383  CompilerFn dex_to_dex_compiler_;
384
385  void* compiler_context_;
386
387  typedef CompiledMethod* (*JniCompilerFn)(CompilerDriver& driver,
388                                           uint32_t access_flags, uint32_t method_idx,
389                                           const DexFile& dex_file);
390  JniCompilerFn jni_compiler_;
391
392  pthread_key_t tls_key_;
393
394  typedef void (*CompilerEnableAutoElfLoadingFn)(CompilerDriver& driver);
395  CompilerEnableAutoElfLoadingFn compiler_enable_auto_elf_loading_;
396
397  typedef const void* (*CompilerGetMethodCodeAddrFn)
398      (const CompilerDriver& driver, const CompiledMethod* cm, const mirror::AbstractMethod* method);
399  CompilerGetMethodCodeAddrFn compiler_get_method_code_addr_;
400
401  bool support_boot_image_fixup_;
402
403  DISALLOW_COPY_AND_ASSIGN(CompilerDriver);
404};
405
406}  // namespace art
407
408#endif  // ART_COMPILER_DRIVER_COMPILER_DRIVER_H_
409