compiler_driver.h revision f9487c039efb4112616d438593a2ab02792e0304
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 "base/timing_logger.h"
26#include "class_reference.h"
27#include "compiled_class.h"
28#include "compiled_method.h"
29#include "compiler.h"
30#include "dex_file.h"
31#include "instruction_set.h"
32#include "invoke_type.h"
33#include "method_reference.h"
34#include "os.h"
35#include "profiler.h"
36#include "runtime.h"
37#include "safe_map.h"
38#include "thread_pool.h"
39#include "utils/arena_allocator.h"
40#include "utils/dedupe_set.h"
41
42namespace art {
43
44namespace verifier {
45class MethodVerifier;
46}  // namespace verifier
47
48class CompilerOptions;
49class DexCompilationUnit;
50class DexFileToMethodInlinerMap;
51struct InlineIGetIPutData;
52class OatWriter;
53class ParallelCompilationManager;
54class ScopedObjectAccess;
55template<class T> class SirtRef;
56class TimingLogger;
57class VerificationResults;
58class VerifiedMethod;
59
60enum EntryPointCallingConvention {
61  // ABI of invocations to a method's interpreter entry point.
62  kInterpreterAbi,
63  // ABI of calls to a method's native code, only used for native methods.
64  kJniAbi,
65  // ABI of calls to a method's portable code entry point.
66  kPortableAbi,
67  // ABI of calls to a method's quick code entry point.
68  kQuickAbi
69};
70
71enum DexToDexCompilationLevel {
72  kDontDexToDexCompile,   // Only meaning wrt image time interpretation.
73  kRequired,              // Dex-to-dex compilation required for correctness.
74  kOptimize               // Perform required transformation and peep-hole optimizations.
75};
76
77// Thread-local storage compiler worker threads
78class CompilerTls {
79  public:
80    CompilerTls() : llvm_info_(NULL) {}
81    ~CompilerTls() {}
82
83    void* GetLLVMInfo() { return llvm_info_; }
84
85    void SetLLVMInfo(void* llvm_info) { llvm_info_ = llvm_info; }
86
87  private:
88    void* llvm_info_;
89};
90
91class CompilerDriver {
92 public:
93  typedef std::set<std::string> DescriptorSet;
94
95  // Create a compiler targeting the requested "instruction_set".
96  // "image" should be true if image specific optimizations should be
97  // enabled.  "image_classes" lets the compiler know what classes it
98  // can assume will be in the image, with NULL implying all available
99  // classes.
100  explicit CompilerDriver(const CompilerOptions* compiler_options,
101                          VerificationResults* verification_results,
102                          DexFileToMethodInlinerMap* method_inliner_map,
103                          Compiler::Kind compiler_kind,
104                          InstructionSet instruction_set,
105                          InstructionSetFeatures instruction_set_features,
106                          bool image, DescriptorSet* image_classes,
107                          size_t thread_count, bool dump_stats, bool dump_passes,
108                          CumulativeLogger* timer,
109                          std::string profile_file = "");
110
111  ~CompilerDriver();
112
113  void CompileAll(jobject class_loader, const std::vector<const DexFile*>& dex_files,
114                  TimingLogger* timings)
115      LOCKS_EXCLUDED(Locks::mutator_lock_);
116
117  // Compile a single Method.
118  void CompileOne(mirror::ArtMethod* method, TimingLogger* timings)
119      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
120
121  VerificationResults* GetVerificationResults() const {
122    return verification_results_;
123  }
124
125  DexFileToMethodInlinerMap* GetMethodInlinerMap() const {
126    return method_inliner_map_;
127  }
128
129  InstructionSet GetInstructionSet() const {
130    return instruction_set_;
131  }
132
133  InstructionSetFeatures GetInstructionSetFeatures() const {
134    return instruction_set_features_;
135  }
136
137  const CompilerOptions& GetCompilerOptions() const {
138    return *compiler_options_;
139  }
140
141  Compiler* GetCompiler() const {
142    return compiler_.get();
143  }
144
145  bool ProfilePresent() const {
146    return profile_ok_;
147  }
148
149  // Are we compiling and creating an image file?
150  bool IsImage() const {
151    return image_;
152  }
153
154  DescriptorSet* GetImageClasses() const {
155    return image_classes_.get();
156  }
157
158  CompilerTls* GetTls();
159
160  // Generate the trampolines that are invoked by unresolved direct methods.
161  const std::vector<uint8_t>* CreateInterpreterToInterpreterBridge() const
162      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
163  const std::vector<uint8_t>* CreateInterpreterToCompiledCodeBridge() const
164      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
165  const std::vector<uint8_t>* CreateJniDlsymLookup() const
166      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
167  const std::vector<uint8_t>* CreatePortableImtConflictTrampoline() const
168      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
169  const std::vector<uint8_t>* CreatePortableResolutionTrampoline() const
170      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
171  const std::vector<uint8_t>* CreatePortableToInterpreterBridge() const
172      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
173  const std::vector<uint8_t>* CreateQuickGenericJniTrampoline() const
174      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
175  const std::vector<uint8_t>* CreateQuickImtConflictTrampoline() const
176      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
177  const std::vector<uint8_t>* CreateQuickResolutionTrampoline() const
178      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
179  const std::vector<uint8_t>* CreateQuickToInterpreterBridge() const
180      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
181
182  CompiledClass* GetCompiledClass(ClassReference ref) const
183      LOCKS_EXCLUDED(compiled_classes_lock_);
184
185  CompiledMethod* GetCompiledMethod(MethodReference ref) const
186      LOCKS_EXCLUDED(compiled_methods_lock_);
187
188  void AddRequiresConstructorBarrier(Thread* self, const DexFile* dex_file,
189                                     uint16_t class_def_index);
190  bool RequiresConstructorBarrier(Thread* self, const DexFile* dex_file, uint16_t class_def_index);
191
192  // Callbacks from compiler to see what runtime checks must be generated.
193
194  bool CanAssumeTypeIsPresentInDexCache(const DexFile& dex_file, uint32_t type_idx);
195
196  bool CanAssumeStringIsPresentInDexCache(const DexFile& dex_file, uint32_t string_idx)
197      LOCKS_EXCLUDED(Locks::mutator_lock_);
198
199  // Are runtime access checks necessary in the compiled code?
200  bool CanAccessTypeWithoutChecks(uint32_t referrer_idx, const DexFile& dex_file,
201                                  uint32_t type_idx, bool* type_known_final = NULL,
202                                  bool* type_known_abstract = NULL,
203                                  bool* equals_referrers_class = NULL)
204      LOCKS_EXCLUDED(Locks::mutator_lock_);
205
206  // Are runtime access and instantiable checks necessary in the code?
207  bool CanAccessInstantiableTypeWithoutChecks(uint32_t referrer_idx, const DexFile& dex_file,
208                                              uint32_t type_idx)
209     LOCKS_EXCLUDED(Locks::mutator_lock_);
210
211  bool CanEmbedTypeInCode(const DexFile& dex_file, uint32_t type_idx,
212                          bool* is_type_initialized, bool* use_direct_type_ptr,
213                          uintptr_t* direct_type_ptr);
214
215  // Get the DexCache for the
216  mirror::DexCache* GetDexCache(const DexCompilationUnit* mUnit)
217    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
218
219  mirror::ClassLoader* GetClassLoader(ScopedObjectAccess& soa, const DexCompilationUnit* mUnit)
220    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
221
222  // Resolve compiling method's class. Returns nullptr on failure.
223  mirror::Class* ResolveCompilingMethodsClass(
224      ScopedObjectAccess& soa, const SirtRef<mirror::DexCache>& dex_cache,
225      const SirtRef<mirror::ClassLoader>& class_loader, const DexCompilationUnit* mUnit)
226    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
227
228  // Resolve a field. Returns nullptr on failure, including incompatible class change.
229  // NOTE: Unlike ClassLinker's ResolveField(), this method enforces is_static.
230  mirror::ArtField* ResolveField(
231      ScopedObjectAccess& soa, const SirtRef<mirror::DexCache>& dex_cache,
232      const SirtRef<mirror::ClassLoader>& class_loader, const DexCompilationUnit* mUnit,
233      uint32_t field_idx, bool is_static)
234    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
235
236  // Get declaration location of a resolved field.
237  void GetResolvedFieldDexFileLocation(
238      mirror::ArtField* resolved_field, const DexFile** declaring_dex_file,
239      uint16_t* declaring_class_idx, uint16_t* declaring_field_idx)
240    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
241
242  bool IsFieldVolatile(mirror::ArtField* field) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
243
244  // Can we fast-path an IGET/IPUT access to an instance field? If yes, compute the field offset.
245  std::pair<bool, bool> IsFastInstanceField(
246      mirror::DexCache* dex_cache, mirror::Class* referrer_class,
247      mirror::ArtField* resolved_field, uint16_t field_idx, MemberOffset* field_offset)
248    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
249
250  // Can we fast-path an SGET/SPUT access to a static field? If yes, compute the field offset,
251  // the type index of the declaring class in the referrer's dex file and whether the declaring
252  // class is the referrer's class or at least can be assumed to be initialized.
253  std::pair<bool, bool> IsFastStaticField(
254      mirror::DexCache* dex_cache, mirror::Class* referrer_class,
255      mirror::ArtField* resolved_field, uint16_t field_idx, MemberOffset* field_offset,
256      uint32_t* storage_index, bool* is_referrers_class, bool* is_initialized)
257    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
258
259  // Resolve a method. Returns nullptr on failure, including incompatible class change.
260  mirror::ArtMethod* ResolveMethod(
261      ScopedObjectAccess& soa, const SirtRef<mirror::DexCache>& dex_cache,
262      const SirtRef<mirror::ClassLoader>& class_loader, const DexCompilationUnit* mUnit,
263      uint32_t method_idx, InvokeType invoke_type)
264    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
265
266  // Get declaration location of a resolved field.
267  void GetResolvedMethodDexFileLocation(
268      mirror::ArtMethod* resolved_method, const DexFile** declaring_dex_file,
269      uint16_t* declaring_class_idx, uint16_t* declaring_method_idx)
270    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
271
272  // Get declaration location of a resolved field.
273  uint16_t GetResolvedMethodVTableIndex(
274      mirror::ArtMethod* resolved_method, InvokeType type)
275    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
276
277  // Can we fast-path an INVOKE? If no, returns 0. If yes, returns a non-zero opaque flags value
278  // for ProcessedInvoke() and computes the necessary lowering info.
279  int IsFastInvoke(
280      ScopedObjectAccess& soa, const SirtRef<mirror::DexCache>& dex_cache,
281      const SirtRef<mirror::ClassLoader>& class_loader, const DexCompilationUnit* mUnit,
282      mirror::Class* referrer_class, mirror::ArtMethod* resolved_method, InvokeType* invoke_type,
283      MethodReference* target_method, const MethodReference* devirt_target,
284      uintptr_t* direct_code, uintptr_t* direct_method)
285    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
286
287  // Does invokation of the resolved method need class initialization?
288  bool NeedsClassInitialization(mirror::Class* referrer_class, mirror::ArtMethod* resolved_method)
289    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
290
291  void ProcessedInstanceField(bool resolved);
292  void ProcessedStaticField(bool resolved, bool local);
293  void ProcessedInvoke(InvokeType invoke_type, int flags);
294
295  // Can we fast path instance field access? Computes field's offset and volatility.
296  bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put,
297                                MemberOffset* field_offset, bool* is_volatile)
298      LOCKS_EXCLUDED(Locks::mutator_lock_);
299
300  // Can we fastpath static field access? Computes field's offset, volatility and whether the
301  // field is within the referrer (which can avoid checking class initialization).
302  bool ComputeStaticFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put,
303                              MemberOffset* field_offset, uint32_t* storage_index,
304                              bool* is_referrers_class, bool* is_volatile, bool* is_initialized)
305      LOCKS_EXCLUDED(Locks::mutator_lock_);
306
307  // Can we fastpath a interface, super class or virtual method call? Computes method's vtable
308  // index.
309  bool ComputeInvokeInfo(const DexCompilationUnit* mUnit, const uint32_t dex_pc,
310                         bool update_stats, bool enable_devirtualization,
311                         InvokeType* type, MethodReference* target_method, int* vtable_idx,
312                         uintptr_t* direct_code, uintptr_t* direct_method)
313      LOCKS_EXCLUDED(Locks::mutator_lock_);
314
315  const VerifiedMethod* GetVerifiedMethod(const DexFile* dex_file, uint32_t method_idx) const;
316  bool IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc);
317
318  // Record patch information for later fix up.
319  void AddCodePatch(const DexFile* dex_file,
320                    uint16_t referrer_class_def_idx,
321                    uint32_t referrer_method_idx,
322                    InvokeType referrer_invoke_type,
323                    uint32_t target_method_idx,
324                    const DexFile* target_dex_file,
325                    InvokeType target_invoke_type,
326                    size_t literal_offset)
327      LOCKS_EXCLUDED(compiled_methods_lock_);
328  void AddRelativeCodePatch(const DexFile* dex_file,
329                            uint16_t referrer_class_def_idx,
330                            uint32_t referrer_method_idx,
331                            InvokeType referrer_invoke_type,
332                            uint32_t target_method_idx,
333                            const DexFile* target_dex_file,
334                            InvokeType target_invoke_type,
335                            size_t literal_offset,
336                            int32_t pc_relative_offset)
337      LOCKS_EXCLUDED(compiled_methods_lock_);
338  void AddMethodPatch(const DexFile* dex_file,
339                      uint16_t referrer_class_def_idx,
340                      uint32_t referrer_method_idx,
341                      InvokeType referrer_invoke_type,
342                      uint32_t target_method_idx,
343                      const DexFile* target_dex_file,
344                      InvokeType target_invoke_type,
345                      size_t literal_offset)
346      LOCKS_EXCLUDED(compiled_methods_lock_);
347  void AddClassPatch(const DexFile* dex_file,
348                     uint16_t referrer_class_def_idx,
349                     uint32_t referrer_method_idx,
350                     uint32_t target_method_idx,
351                     size_t literal_offset)
352      LOCKS_EXCLUDED(compiled_methods_lock_);
353
354  bool GetSupportBootImageFixup() const {
355    return support_boot_image_fixup_;
356  }
357
358  void SetSupportBootImageFixup(bool support_boot_image_fixup) {
359    support_boot_image_fixup_ = support_boot_image_fixup;
360  }
361
362  ArenaPool* GetArenaPool() {
363    return &arena_pool_;
364  }
365
366  bool WriteElf(const std::string& android_root,
367                bool is_host,
368                const std::vector<const DexFile*>& dex_files,
369                OatWriter* oat_writer,
370                File* file);
371
372  // TODO: move to a common home for llvm helpers once quick/portable are merged.
373  static void InstructionSetToLLVMTarget(InstructionSet instruction_set,
374                                         std::string* target_triple,
375                                         std::string* target_cpu,
376                                         std::string* target_attr);
377
378  void SetCompilerContext(void* compiler_context) {
379    compiler_context_ = compiler_context;
380  }
381
382  void* GetCompilerContext() const {
383    return compiler_context_;
384  }
385
386  size_t GetThreadCount() const {
387    return thread_count_;
388  }
389
390  class CallPatchInformation;
391  class TypePatchInformation;
392
393  bool GetDumpPasses() const {
394    return dump_passes_;
395  }
396
397  CumulativeLogger* GetTimingsLogger() const {
398    return timings_logger_;
399  }
400
401  class PatchInformation {
402   public:
403    const DexFile& GetDexFile() const {
404      return *dex_file_;
405    }
406    uint16_t GetReferrerClassDefIdx() const {
407      return referrer_class_def_idx_;
408    }
409    uint32_t GetReferrerMethodIdx() const {
410      return referrer_method_idx_;
411    }
412    size_t GetLiteralOffset() const {
413      return literal_offset_;
414    }
415
416    virtual bool IsCall() const {
417      return false;
418    }
419    virtual bool IsType() const {
420      return false;
421    }
422    virtual const CallPatchInformation* AsCall() const {
423      LOG(FATAL) << "Unreachable";
424      return nullptr;
425    }
426    virtual const TypePatchInformation* AsType() const {
427      LOG(FATAL) << "Unreachable";
428      return nullptr;
429    }
430
431   protected:
432    PatchInformation(const DexFile* dex_file,
433                     uint16_t referrer_class_def_idx,
434                     uint32_t referrer_method_idx,
435                     size_t literal_offset)
436      : dex_file_(dex_file),
437        referrer_class_def_idx_(referrer_class_def_idx),
438        referrer_method_idx_(referrer_method_idx),
439        literal_offset_(literal_offset) {
440      CHECK(dex_file_ != NULL);
441    }
442    virtual ~PatchInformation() {}
443
444    const DexFile* const dex_file_;
445    const uint16_t referrer_class_def_idx_;
446    const uint32_t referrer_method_idx_;
447    const size_t literal_offset_;
448
449    friend class CompilerDriver;
450  };
451
452  class CallPatchInformation : public PatchInformation {
453   public:
454    InvokeType GetReferrerInvokeType() const {
455      return referrer_invoke_type_;
456    }
457    uint32_t GetTargetMethodIdx() const {
458      return target_method_idx_;
459    }
460    const DexFile* GetTargetDexFile() const {
461      return target_dex_file_;
462    }
463    InvokeType GetTargetInvokeType() const {
464      return target_invoke_type_;
465    }
466
467    const CallPatchInformation* AsCall() const {
468      return this;
469    }
470    bool IsCall() const {
471      return true;
472    }
473    virtual bool IsRelative() const {
474      return false;
475    }
476    virtual int RelativeOffset() const {
477      return 0;
478    }
479
480   protected:
481    CallPatchInformation(const DexFile* dex_file,
482                         uint16_t referrer_class_def_idx,
483                         uint32_t referrer_method_idx,
484                         InvokeType referrer_invoke_type,
485                         uint32_t target_method_idx,
486                         const DexFile* target_dex_file,
487                         InvokeType target_invoke_type,
488                         size_t literal_offset)
489        : PatchInformation(dex_file, referrer_class_def_idx,
490                           referrer_method_idx, literal_offset),
491          referrer_invoke_type_(referrer_invoke_type),
492          target_method_idx_(target_method_idx),
493          target_dex_file_(target_dex_file),
494          target_invoke_type_(target_invoke_type) {
495    }
496
497   private:
498    const InvokeType referrer_invoke_type_;
499    const uint32_t target_method_idx_;
500    const DexFile* target_dex_file_;
501    const InvokeType target_invoke_type_;
502
503    friend class CompilerDriver;
504    DISALLOW_COPY_AND_ASSIGN(CallPatchInformation);
505  };
506
507  class RelativeCallPatchInformation : public CallPatchInformation {
508   public:
509    bool IsRelative() const {
510      return true;
511    }
512    int RelativeOffset() const {
513      return offset_;
514    }
515
516   private:
517    RelativeCallPatchInformation(const DexFile* dex_file,
518                                 uint16_t referrer_class_def_idx,
519                                 uint32_t referrer_method_idx,
520                                 InvokeType referrer_invoke_type,
521                                 uint32_t target_method_idx,
522                                 const DexFile* target_dex_file,
523                                 InvokeType target_invoke_type,
524                                 size_t literal_offset,
525                                 int32_t pc_relative_offset)
526        : CallPatchInformation(dex_file, referrer_class_def_idx,
527                           referrer_method_idx, referrer_invoke_type, target_method_idx,
528                           target_dex_file, target_invoke_type, literal_offset),
529          offset_(pc_relative_offset) {
530    }
531
532    const int offset_;
533
534    friend class CompilerDriver;
535    DISALLOW_COPY_AND_ASSIGN(RelativeCallPatchInformation);
536  };
537
538  class TypePatchInformation : public PatchInformation {
539   public:
540    uint32_t GetTargetTypeIdx() const {
541      return target_type_idx_;
542    }
543
544    bool IsType() const {
545      return true;
546    }
547    const TypePatchInformation* AsType() const {
548      return this;
549    }
550
551   private:
552    TypePatchInformation(const DexFile* dex_file,
553                         uint16_t referrer_class_def_idx,
554                         uint32_t referrer_method_idx,
555                         uint32_t target_type_idx,
556                         size_t literal_offset)
557        : PatchInformation(dex_file, referrer_class_def_idx,
558                           referrer_method_idx, literal_offset),
559          target_type_idx_(target_type_idx) {
560    }
561
562    const uint32_t target_type_idx_;
563
564    friend class CompilerDriver;
565    DISALLOW_COPY_AND_ASSIGN(TypePatchInformation);
566  };
567
568  const std::vector<const CallPatchInformation*>& GetCodeToPatch() const {
569    return code_to_patch_;
570  }
571  const std::vector<const CallPatchInformation*>& GetMethodsToPatch() const {
572    return methods_to_patch_;
573  }
574  const std::vector<const TypePatchInformation*>& GetClassesToPatch() const {
575    return classes_to_patch_;
576  }
577
578  // Checks if class specified by type_idx is one of the image_classes_
579  bool IsImageClass(const char* descriptor) const;
580
581  void RecordClassStatus(ClassReference ref, mirror::Class::Status status)
582      LOCKS_EXCLUDED(compiled_classes_lock_);
583
584  std::vector<uint8_t>* DeduplicateCode(const std::vector<uint8_t>& code);
585  std::vector<uint8_t>* DeduplicateMappingTable(const std::vector<uint8_t>& code);
586  std::vector<uint8_t>* DeduplicateVMapTable(const std::vector<uint8_t>& code);
587  std::vector<uint8_t>* DeduplicateGCMap(const std::vector<uint8_t>& code);
588  std::vector<uint8_t>* DeduplicateCFIInfo(const std::vector<uint8_t>* cfi_info);
589
590  /*
591   * @brief return the pointer to the Call Frame Information.
592   * @return pointer to call frame information for this compilation.
593   */
594  std::vector<uint8_t>* GetCallFrameInformation() const {
595    return cfi_info_.get();
596  }
597
598  ProfileMap profile_map_;
599  bool profile_ok_;
600
601  // Should the compiler run on this method given profile information?
602  bool SkipCompilation(const std::string& method_name);
603
604  // Entrypoint trampolines.
605  //
606  // The idea here is that we can save code size by collecting the branches
607  // to the entrypoints (helper functions called by the generated code) into a
608  // table and then branching relative to that table from the code.  On ARM 32 this
609  // will save 2 bytes per call.  Only the entrypoints used by the program (the whole
610  // program - these are global) are in this table and are in no particular order.
611  //
612  // The trampolines will be placed right at the start of the .text section in the file
613  // and will consist of a table of instructions, each of which will branch relative to
614  // the thread register (r9 on ARM) to an entrypoint.  On ARM this would look like:
615  //
616  // trampolines:
617  // 1: ldr pc, [r9, #40]
618  // 2: ldr pc, [r9, #8]
619  //    ...
620  //
621  // Then a call to an entrypoint would be an immediate BL instruction to the appropriate
622  // label (1 or 2 in the above example).  Because the entrypoint table has the lower bit
623  // of the address already set, the ldr pc will switch from ARM to Thumb for the entrypoint as
624  // necessary.
625  //
626  // On ARM, the range of a BL instruction is +-32M to this is more than enough for an
627  // immediate BL instruction in the generated code.
628  //
629  // The actual address of the trampoline for a particular entrypoint is not known until
630  // the OAT file is written and we know the addresses of all the branch instructions in
631  // the program.  At this point we can rewrite the BL instruction to have the correct relative
632  // offset.
633  class EntrypointTrampolines {
634   public:
635    EntrypointTrampolines() : current_offset_(0), lock_("Entrypoint Trampolines") {}
636    ~EntrypointTrampolines() {}
637
638    // Add a trampoline and return the offset added.  If it already exists
639    // return the offset it was added at previously.
640    uint32_t AddEntrypoint(Thread* self, uint32_t ep) LOCKS_EXCLUDED(lock_) {
641      MutexLock mu(self, lock_);
642      Trampolines::iterator tramp = trampolines_.find(ep);
643      if (tramp == trampolines_.end()) {
644        trampolines_[ep] = current_offset_;
645        trampoline_table_.push_back(ep);
646        LOG(DEBUG) << "adding new trampoline for " << ep << " at offset " << current_offset_;
647        return current_offset_++;
648      } else {
649        return tramp->second;
650      }
651    }
652
653    const std::vector<uint32_t>& GetTrampolineTable() const {
654      return trampoline_table_;
655    }
656
657    uint32_t GetTrampolineTableSize() const {
658      return current_offset_;
659    }
660
661   private:
662    uint32_t current_offset_;
663    // Mapping of entrypoint offset vs offset into trampoline table.
664    typedef std::map<uint32_t, uint32_t> Trampolines;
665    Trampolines trampolines_ GUARDED_BY(lock_);
666
667    // Table of all registered offsets in order of registration.
668    std::vector<uint32_t> trampoline_table_;
669    Mutex lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
670  };
671
672  uint32_t AddEntrypointTrampoline(uint32_t entrypoint);
673
674  const std::vector<uint32_t>& GetEntrypointTrampolineTable() const {
675    return entrypoint_trampolines_.GetTrampolineTable();
676  }
677
678  uint32_t GetEntrypointTrampolineTableSize() const {
679    uint32_t size = entrypoint_trampolines_.GetTrampolineTableSize();
680    switch (instruction_set_) {
681      case kThumb2:
682      case kArm:
683         return size * 4;
684      default:
685       return size;
686    }
687  }
688
689  // Get the maximum offset between entrypoint trampoline islands.  Different architectures
690  // have limitations on the max offset for a call instruction.  This function is used
691  // to determine when we need to generate a new trampoline island in the output to keep
692  // subsequent calls in range.
693  size_t GetMaxEntrypointTrampolineOffset() const {
694    switch (instruction_set_) {
695      case kThumb2:
696      case kArm:
697        // On Thumb2, the max range of a BL instruction is 16MB.  Give it a little wiggle room.
698         return 15*MB;
699      default:
700        // Returning 0 means we won't generate a trampoline island.
701       return 0;
702    }
703  }
704
705  void BuildEntrypointTrampolineCode();
706
707  // Architecture specific Entrypoint trampoline builder.
708  void BuildArmEntrypointTrampolineCall(ThreadOffset<4> offset);
709
710  const std::vector<uint8_t>& GetEntrypointTrampolineTableCode() const {
711    return entrypoint_trampoline_code_;
712  }
713
714  FinalEntrypointRelocationSet* AllocateFinalEntrypointRelocationSet(CompilationUnit* cu) const;
715
716 private:
717  // These flags are internal to CompilerDriver for collecting INVOKE resolution statistics.
718  // The only external contract is that unresolved method has flags 0 and resolved non-0.
719  enum {
720    kBitMethodResolved = 0,
721    kBitVirtualMadeDirect,
722    kBitPreciseTypeDevirtualization,
723    kBitDirectCallToBoot,
724    kBitDirectMethodToBoot
725  };
726  static constexpr int kFlagMethodResolved              = 1 << kBitMethodResolved;
727  static constexpr int kFlagVirtualMadeDirect           = 1 << kBitVirtualMadeDirect;
728  static constexpr int kFlagPreciseTypeDevirtualization = 1 << kBitPreciseTypeDevirtualization;
729  static constexpr int kFlagDirectCallToBoot            = 1 << kBitDirectCallToBoot;
730  static constexpr int kFlagDirectMethodToBoot          = 1 << kBitDirectMethodToBoot;
731  static constexpr int kFlagsMethodResolvedVirtualMadeDirect =
732      kFlagMethodResolved | kFlagVirtualMadeDirect;
733  static constexpr int kFlagsMethodResolvedPreciseTypeDevirtualization =
734      kFlagsMethodResolvedVirtualMadeDirect | kFlagPreciseTypeDevirtualization;
735
736 public:  // TODO make private or eliminate.
737  // Compute constant code and method pointers when possible.
738  void GetCodeAndMethodForDirectCall(InvokeType* type, InvokeType sharp_type,
739                                     bool no_guarantee_of_dex_cache_entry,
740                                     mirror::Class* referrer_class,
741                                     mirror::ArtMethod* method,
742                                     int* stats_flags,
743                                     MethodReference* target_method,
744                                     uintptr_t* direct_code, uintptr_t* direct_method)
745      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
746
747 private:
748  void PreCompile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
749                  ThreadPool* thread_pool, TimingLogger* timings)
750      LOCKS_EXCLUDED(Locks::mutator_lock_);
751
752  void LoadImageClasses(TimingLogger* timings);
753  void PostCompile() LOCKS_EXCLUDED(Locks::mutator_lock_);
754
755  // Attempt to resolve all type, methods, fields, and strings
756  // referenced from code in the dex file following PathClassLoader
757  // ordering semantics.
758  void Resolve(jobject class_loader, const std::vector<const DexFile*>& dex_files,
759               ThreadPool* thread_pool, TimingLogger* timings)
760      LOCKS_EXCLUDED(Locks::mutator_lock_);
761  void ResolveDexFile(jobject class_loader, const DexFile& dex_file,
762                      ThreadPool* thread_pool, TimingLogger* timings)
763      LOCKS_EXCLUDED(Locks::mutator_lock_);
764
765  void Verify(jobject class_loader, const std::vector<const DexFile*>& dex_files,
766              ThreadPool* thread_pool, TimingLogger* timings);
767  void VerifyDexFile(jobject class_loader, const DexFile& dex_file,
768                     ThreadPool* thread_pool, TimingLogger* timings)
769      LOCKS_EXCLUDED(Locks::mutator_lock_);
770
771  void InitializeClasses(jobject class_loader, const std::vector<const DexFile*>& dex_files,
772                         ThreadPool* thread_pool, TimingLogger* timings)
773      LOCKS_EXCLUDED(Locks::mutator_lock_);
774  void InitializeClasses(jobject class_loader, const DexFile& dex_file,
775                         ThreadPool* thread_pool, TimingLogger* timings)
776      LOCKS_EXCLUDED(Locks::mutator_lock_, compiled_classes_lock_);
777
778  void UpdateImageClasses(TimingLogger* timings) LOCKS_EXCLUDED(Locks::mutator_lock_);
779  static void FindClinitImageClassesCallback(mirror::Object* object, void* arg)
780      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
781
782  void Compile(jobject class_loader, const std::vector<const DexFile*>& dex_files,
783               ThreadPool* thread_pool, TimingLogger* timings);
784  void CompileDexFile(jobject class_loader, const DexFile& dex_file,
785                      ThreadPool* thread_pool, TimingLogger* timings)
786      LOCKS_EXCLUDED(Locks::mutator_lock_);
787  void CompileMethod(const DexFile::CodeItem* code_item, uint32_t access_flags,
788                     InvokeType invoke_type, uint16_t class_def_idx, uint32_t method_idx,
789                     jobject class_loader, const DexFile& dex_file,
790                     DexToDexCompilationLevel dex_to_dex_compilation_level)
791      LOCKS_EXCLUDED(compiled_methods_lock_);
792
793  static void CompileClass(const ParallelCompilationManager* context, size_t class_def_index)
794      LOCKS_EXCLUDED(Locks::mutator_lock_);
795
796  std::vector<const CallPatchInformation*> code_to_patch_;
797  std::vector<const CallPatchInformation*> methods_to_patch_;
798  std::vector<const TypePatchInformation*> classes_to_patch_;
799
800  const CompilerOptions* const compiler_options_;
801  VerificationResults* const verification_results_;
802  DexFileToMethodInlinerMap* const method_inliner_map_;
803
804  UniquePtr<Compiler> compiler_;
805
806  const InstructionSet instruction_set_;
807  const InstructionSetFeatures instruction_set_features_;
808  const bool instruction_set_is_64_bit_;
809
810  // All class references that require
811  mutable ReaderWriterMutex freezing_constructor_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
812  std::set<ClassReference> freezing_constructor_classes_ GUARDED_BY(freezing_constructor_lock_);
813
814  typedef SafeMap<const ClassReference, CompiledClass*> ClassTable;
815  // All class references that this compiler has compiled.
816  mutable Mutex compiled_classes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
817  ClassTable compiled_classes_ GUARDED_BY(compiled_classes_lock_);
818
819  typedef SafeMap<const MethodReference, CompiledMethod*, MethodReferenceComparator> MethodTable;
820  // All method references that this compiler has compiled.
821  mutable Mutex compiled_methods_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
822  MethodTable compiled_methods_ GUARDED_BY(compiled_methods_lock_);
823
824  const bool image_;
825
826  // If image_ is true, specifies the classes that will be included in
827  // the image. Note if image_classes_ is NULL, all classes are
828  // included in the image.
829  UniquePtr<DescriptorSet> image_classes_;
830
831  size_t thread_count_;
832  uint64_t start_ns_;
833
834  class AOTCompilationStats;
835  UniquePtr<AOTCompilationStats> stats_;
836
837  bool dump_stats_;
838  const bool dump_passes_;
839
840  CumulativeLogger* const timings_logger_;
841
842  typedef void (*CompilerCallbackFn)(CompilerDriver& driver);
843  typedef MutexLock* (*CompilerMutexLockFn)(CompilerDriver& driver);
844
845  void* compiler_library_;
846
847  typedef void (*DexToDexCompilerFn)(CompilerDriver& driver,
848                                     const DexFile::CodeItem* code_item,
849                                     uint32_t access_flags, InvokeType invoke_type,
850                                     uint32_t class_dex_idx, uint32_t method_idx,
851                                     jobject class_loader, const DexFile& dex_file,
852                                     DexToDexCompilationLevel dex_to_dex_compilation_level);
853  DexToDexCompilerFn dex_to_dex_compiler_;
854
855  void* compiler_context_;
856
857  pthread_key_t tls_key_;
858
859  // Arena pool used by the compiler.
860  ArenaPool arena_pool_;
861
862  typedef void (*CompilerEnableAutoElfLoadingFn)(CompilerDriver& driver);
863  CompilerEnableAutoElfLoadingFn compiler_enable_auto_elf_loading_;
864
865  typedef const void* (*CompilerGetMethodCodeAddrFn)
866      (const CompilerDriver& driver, const CompiledMethod* cm, const mirror::ArtMethod* method);
867  CompilerGetMethodCodeAddrFn compiler_get_method_code_addr_;
868
869  bool support_boot_image_fixup_;
870
871  // Call Frame Information, which might be generated to help stack tracebacks.
872  UniquePtr<std::vector<uint8_t> > cfi_info_;
873
874  // DeDuplication data structures, these own the corresponding byte arrays.
875  class DedupeHashFunc {
876   public:
877    size_t operator()(const std::vector<uint8_t>& array) const {
878      // For small arrays compute a hash using every byte.
879      static const size_t kSmallArrayThreshold = 16;
880      size_t hash = 0x811c9dc5;
881      if (array.size() <= kSmallArrayThreshold) {
882        for (uint8_t b : array) {
883          hash = (hash * 16777619) ^ b;
884        }
885      } else {
886        // For larger arrays use the 2 bytes at 6 bytes (the location of a push registers
887        // instruction field for quick generated code on ARM) and then select a number of other
888        // values at random.
889        static const size_t kRandomHashCount = 16;
890        for (size_t i = 0; i < 2; ++i) {
891          uint8_t b = array[i + 6];
892          hash = (hash * 16777619) ^ b;
893        }
894        for (size_t i = 2; i < kRandomHashCount; ++i) {
895          size_t r = i * 1103515245 + 12345;
896          uint8_t b = array[r % array.size()];
897          hash = (hash * 16777619) ^ b;
898        }
899      }
900      hash += hash << 13;
901      hash ^= hash >> 7;
902      hash += hash << 3;
903      hash ^= hash >> 17;
904      hash += hash << 5;
905      return hash;
906    }
907  };
908  DedupeSet<std::vector<uint8_t>, size_t, DedupeHashFunc, 4> dedupe_code_;
909  DedupeSet<std::vector<uint8_t>, size_t, DedupeHashFunc, 4> dedupe_mapping_table_;
910  DedupeSet<std::vector<uint8_t>, size_t, DedupeHashFunc, 4> dedupe_vmap_table_;
911  DedupeSet<std::vector<uint8_t>, size_t, DedupeHashFunc, 4> dedupe_gc_map_;
912  DedupeSet<std::vector<uint8_t>, size_t, DedupeHashFunc, 4> dedupe_cfi_info_;
913
914  EntrypointTrampolines entrypoint_trampolines_;
915
916  std::vector<uint8_t> entrypoint_trampoline_code_;
917
918  DISALLOW_COPY_AND_ASSIGN(CompilerDriver);
919};
920
921}  // namespace art
922
923#endif  // ART_COMPILER_DRIVER_COMPILER_DRIVER_H_
924