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 <atomic> 21 #include <set> 22 #include <string> 23 #include <unordered_set> 24 #include <vector> 25 26 #include "android-base/strings.h" 27 28 #include "arch/instruction_set.h" 29 #include "base/array_ref.h" 30 #include "base/bit_utils.h" 31 #include "base/mutex.h" 32 #include "base/os.h" 33 #include "base/quasi_atomic.h" 34 #include "base/safe_map.h" 35 #include "base/timing_logger.h" 36 #include "class_status.h" 37 #include "compiler.h" 38 #include "dex/class_reference.h" 39 #include "dex/dex_file.h" 40 #include "dex/dex_file_types.h" 41 #include "dex/dex_to_dex_compiler.h" 42 #include "dex/method_reference.h" 43 #include "driver/compiled_method_storage.h" 44 #include "thread_pool.h" 45 #include "utils/atomic_dex_ref_map.h" 46 #include "utils/dex_cache_arrays_layout.h" 47 48 namespace art { 49 50 namespace mirror { 51 class Class; 52 class DexCache; 53 } // namespace mirror 54 55 namespace verifier { 56 class MethodVerifier; 57 class VerifierDepsTest; 58 } // namespace verifier 59 60 class ArtField; 61 class BitVector; 62 class CompiledMethod; 63 class CompilerOptions; 64 class DexCompilationUnit; 65 template<class T> class Handle; 66 struct InlineIGetIPutData; 67 class InstructionSetFeatures; 68 class InternTable; 69 enum InvokeType : uint32_t; 70 class MemberOffset; 71 template<class MirrorType> class ObjPtr; 72 class ParallelCompilationManager; 73 class ProfileCompilationInfo; 74 class ScopedObjectAccess; 75 template <class Allocator> class SrcMap; 76 class TimingLogger; 77 class VdexFile; 78 class VerificationResults; 79 class VerifiedMethod; 80 81 enum EntryPointCallingConvention { 82 // ABI of invocations to a method's interpreter entry point. 83 kInterpreterAbi, 84 // ABI of calls to a method's native code, only used for native methods. 85 kJniAbi, 86 // ABI of calls to a method's quick code entry point. 87 kQuickAbi 88 }; 89 90 class CompilerDriver { 91 public: 92 // Create a compiler targeting the requested "instruction_set". 93 // "image" should be true if image specific optimizations should be 94 // enabled. "image_classes" lets the compiler know what classes it 95 // can assume will be in the image, with null implying all available 96 // classes. 97 CompilerDriver(const CompilerOptions* compiler_options, 98 VerificationResults* verification_results, 99 Compiler::Kind compiler_kind, 100 InstructionSet instruction_set, 101 const InstructionSetFeatures* instruction_set_features, 102 std::unordered_set<std::string>* image_classes, 103 std::unordered_set<std::string>* compiled_classes, 104 std::unordered_set<std::string>* compiled_methods, 105 size_t thread_count, 106 int swap_fd, 107 const ProfileCompilationInfo* profile_compilation_info); 108 109 ~CompilerDriver(); 110 111 // Set dex files associated with the oat file being compiled. 112 void SetDexFilesForOatFile(const std::vector<const DexFile*>& dex_files); 113 114 // Set dex files classpath. 115 void SetClasspathDexFiles(const std::vector<const DexFile*>& dex_files); 116 117 // Get dex files associated with the the oat file being compiled. GetDexFilesForOatFile()118 ArrayRef<const DexFile* const> GetDexFilesForOatFile() const { 119 return ArrayRef<const DexFile* const>(dex_files_for_oat_file_); 120 } 121 122 void CompileAll(jobject class_loader, 123 const std::vector<const DexFile*>& dex_files, 124 TimingLogger* timings) 125 REQUIRES(!Locks::mutator_lock_); 126 127 // Compile a single Method. 128 void CompileOne(Thread* self, ArtMethod* method, TimingLogger* timings) 129 REQUIRES_SHARED(Locks::mutator_lock_); 130 131 VerificationResults* GetVerificationResults() const; 132 GetInstructionSet()133 InstructionSet GetInstructionSet() const { 134 return instruction_set_; 135 } 136 GetInstructionSetFeatures()137 const InstructionSetFeatures* GetInstructionSetFeatures() const { 138 return instruction_set_features_; 139 } 140 GetCompilerOptions()141 const CompilerOptions& GetCompilerOptions() const { 142 return *compiler_options_; 143 } 144 GetCompiler()145 Compiler* GetCompiler() const { 146 return compiler_.get(); 147 } 148 GetImageClasses()149 const std::unordered_set<std::string>* GetImageClasses() const { 150 return image_classes_.get(); 151 } 152 153 // Generate the trampolines that are invoked by unresolved direct methods. 154 std::unique_ptr<const std::vector<uint8_t>> CreateJniDlsymLookup() const; 155 std::unique_ptr<const std::vector<uint8_t>> CreateQuickGenericJniTrampoline() const; 156 std::unique_ptr<const std::vector<uint8_t>> CreateQuickImtConflictTrampoline() const; 157 std::unique_ptr<const std::vector<uint8_t>> CreateQuickResolutionTrampoline() const; 158 std::unique_ptr<const std::vector<uint8_t>> CreateQuickToInterpreterBridge() const; 159 160 ClassStatus GetClassStatus(const ClassReference& ref) const; 161 bool GetCompiledClass(const ClassReference& ref, ClassStatus* status) const; 162 163 CompiledMethod* GetCompiledMethod(MethodReference ref) const; 164 size_t GetNonRelativeLinkerPatchCount() const; 165 // Add a compiled method. 166 void AddCompiledMethod(const MethodReference& method_ref, 167 CompiledMethod* const compiled_method, 168 size_t non_relative_linker_patch_count); 169 CompiledMethod* RemoveCompiledMethod(const MethodReference& method_ref); 170 171 void SetRequiresConstructorBarrier(Thread* self, 172 const DexFile* dex_file, 173 uint16_t class_def_index, 174 bool requires) 175 REQUIRES(!requires_constructor_barrier_lock_); 176 177 // Do the <init> methods for this class require a constructor barrier (prior to the return)? 178 // The answer is "yes", if and only if this class has any instance final fields. 179 // (This must not be called for any non-<init> methods; the answer would be "no"). 180 // 181 // --- 182 // 183 // JLS 17.5.1 "Semantics of final fields" mandates that all final fields are frozen at the end 184 // of the invoked constructor. The constructor barrier is a conservative implementation means of 185 // enforcing the freezes happen-before the object being constructed is observable by another 186 // thread. 187 // 188 // Note: This question only makes sense for instance constructors; 189 // static constructors (despite possibly having finals) never need 190 // a barrier. 191 // 192 // JLS 12.4.2 "Detailed Initialization Procedure" approximately describes 193 // class initialization as: 194 // 195 // lock(class.lock) 196 // class.state = initializing 197 // unlock(class.lock) 198 // 199 // invoke <clinit> 200 // 201 // lock(class.lock) 202 // class.state = initialized 203 // unlock(class.lock) <-- acts as a release 204 // 205 // The last operation in the above example acts as an atomic release 206 // for any stores in <clinit>, which ends up being stricter 207 // than what a constructor barrier needs. 208 // 209 // See also QuasiAtomic::ThreadFenceForConstructor(). 210 bool RequiresConstructorBarrier(Thread* self, 211 const DexFile* dex_file, 212 uint16_t class_def_index) 213 REQUIRES(!requires_constructor_barrier_lock_); 214 215 // Are runtime access checks necessary in the compiled code? 216 bool CanAccessTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class, 217 ObjPtr<mirror::Class> resolved_class) 218 REQUIRES_SHARED(Locks::mutator_lock_); 219 220 // Are runtime access and instantiable checks necessary in the code? 221 // out_is_finalizable is set to whether the type is finalizable. 222 bool CanAccessInstantiableTypeWithoutChecks(ObjPtr<mirror::Class> referrer_class, 223 ObjPtr<mirror::Class> resolved_class, 224 bool* out_is_finalizable) 225 REQUIRES_SHARED(Locks::mutator_lock_); 226 227 // Resolve compiling method's class. Returns null on failure. 228 ObjPtr<mirror::Class> ResolveCompilingMethodsClass(const ScopedObjectAccess& soa, 229 Handle<mirror::DexCache> dex_cache, 230 Handle<mirror::ClassLoader> class_loader, 231 const DexCompilationUnit* mUnit) 232 REQUIRES_SHARED(Locks::mutator_lock_); 233 234 ObjPtr<mirror::Class> ResolveClass(const ScopedObjectAccess& soa, 235 Handle<mirror::DexCache> dex_cache, 236 Handle<mirror::ClassLoader> class_loader, 237 dex::TypeIndex type_index, 238 const DexCompilationUnit* mUnit) 239 REQUIRES_SHARED(Locks::mutator_lock_); 240 241 // Resolve a field. Returns null on failure, including incompatible class change. 242 // NOTE: Unlike ClassLinker's ResolveField(), this method enforces is_static. 243 ArtField* ResolveField(const ScopedObjectAccess& soa, 244 Handle<mirror::DexCache> dex_cache, 245 Handle<mirror::ClassLoader> class_loader, 246 uint32_t field_idx, 247 bool is_static) 248 REQUIRES_SHARED(Locks::mutator_lock_); 249 250 // Can we fast-path an IGET/IPUT access to an instance field? If yes, compute the field offset. 251 std::pair<bool, bool> IsFastInstanceField(ObjPtr<mirror::DexCache> dex_cache, 252 ObjPtr<mirror::Class> referrer_class, 253 ArtField* resolved_field, 254 uint16_t field_idx) 255 REQUIRES_SHARED(Locks::mutator_lock_); 256 257 // Resolve a method. Returns null on failure, including incompatible class change. 258 ArtMethod* ResolveMethod( 259 ScopedObjectAccess& soa, 260 Handle<mirror::DexCache> dex_cache, 261 Handle<mirror::ClassLoader> class_loader, 262 const DexCompilationUnit* mUnit, 263 uint32_t method_idx, 264 InvokeType invoke_type) 265 REQUIRES_SHARED(Locks::mutator_lock_); 266 267 void ProcessedInstanceField(bool resolved); 268 void ProcessedStaticField(bool resolved, bool local); 269 270 // Can we fast path instance field access? Computes field's offset and volatility. 271 bool ComputeInstanceFieldInfo(uint32_t field_idx, const DexCompilationUnit* mUnit, bool is_put, 272 MemberOffset* field_offset, bool* is_volatile) 273 REQUIRES(!Locks::mutator_lock_); 274 275 ArtField* ComputeInstanceFieldInfo(uint32_t field_idx, 276 const DexCompilationUnit* mUnit, 277 bool is_put, 278 const ScopedObjectAccess& soa) 279 REQUIRES_SHARED(Locks::mutator_lock_); 280 281 282 const VerifiedMethod* GetVerifiedMethod(const DexFile* dex_file, uint32_t method_idx) const; 283 bool IsSafeCast(const DexCompilationUnit* mUnit, uint32_t dex_pc); 284 GetSupportBootImageFixup()285 bool GetSupportBootImageFixup() const { 286 return support_boot_image_fixup_; 287 } 288 SetSupportBootImageFixup(bool support_boot_image_fixup)289 void SetSupportBootImageFixup(bool support_boot_image_fixup) { 290 support_boot_image_fixup_ = support_boot_image_fixup; 291 } 292 SetCompilerContext(void * compiler_context)293 void SetCompilerContext(void* compiler_context) { 294 compiler_context_ = compiler_context; 295 } 296 GetCompilerContext()297 void* GetCompilerContext() const { 298 return compiler_context_; 299 } 300 GetThreadCount()301 size_t GetThreadCount() const { 302 return parallel_thread_count_; 303 } 304 SetDedupeEnabled(bool dedupe_enabled)305 void SetDedupeEnabled(bool dedupe_enabled) { 306 compiled_method_storage_.SetDedupeEnabled(dedupe_enabled); 307 } 308 DedupeEnabled()309 bool DedupeEnabled() const { 310 return compiled_method_storage_.DedupeEnabled(); 311 } 312 313 // Checks if class specified by type_idx is one of the image_classes_ 314 bool IsImageClass(const char* descriptor) const; 315 316 // Checks whether the provided class should be compiled, i.e., is in classes_to_compile_. 317 bool IsClassToCompile(const char* descriptor) const; 318 319 // Checks whether the provided method should be compiled, i.e., is in method_to_compile_. 320 bool IsMethodToCompile(const MethodReference& method_ref) const; 321 322 // Checks whether profile guided compilation is enabled and if the method should be compiled 323 // according to the profile file. 324 bool ShouldCompileBasedOnProfile(const MethodReference& method_ref) const; 325 326 // Checks whether profile guided verification is enabled and if the method should be verified 327 // according to the profile file. 328 bool ShouldVerifyClassBasedOnProfile(const DexFile& dex_file, uint16_t class_idx) const; 329 330 void RecordClassStatus(const ClassReference& ref, ClassStatus status); 331 332 // Checks if the specified method has been verified without failures. Returns 333 // false if the method is not in the verification results (GetVerificationResults). 334 bool IsMethodVerifiedWithoutFailures(uint32_t method_idx, 335 uint16_t class_def_idx, 336 const DexFile& dex_file) const; 337 338 // Get memory usage during compilation. 339 std::string GetMemoryUsageString(bool extended) const; 340 SetHadHardVerifierFailure()341 void SetHadHardVerifierFailure() { 342 had_hard_verifier_failure_ = true; 343 } AddSoftVerifierFailure()344 void AddSoftVerifierFailure() { 345 number_of_soft_verifier_failures_++; 346 } 347 GetCompilerKind()348 Compiler::Kind GetCompilerKind() { 349 return compiler_kind_; 350 } 351 GetCompiledMethodStorage()352 CompiledMethodStorage* GetCompiledMethodStorage() { 353 return &compiled_method_storage_; 354 } 355 356 // Can we assume that the klass is loaded? 357 bool CanAssumeClassIsLoaded(mirror::Class* klass) 358 REQUIRES_SHARED(Locks::mutator_lock_); 359 MayInline(const DexFile * inlined_from,const DexFile * inlined_into)360 bool MayInline(const DexFile* inlined_from, const DexFile* inlined_into) const { 361 if (!kIsTargetBuild) { 362 return MayInlineInternal(inlined_from, inlined_into); 363 } 364 return true; 365 } 366 GetProfileCompilationInfo()367 const ProfileCompilationInfo* GetProfileCompilationInfo() const { 368 return profile_compilation_info_; 369 } 370 371 // Is `boot_image_filename` the name of a core image (small boot 372 // image used for ART testing only)? IsCoreImageFilename(const std::string & boot_image_filename)373 static bool IsCoreImageFilename(const std::string& boot_image_filename) { 374 // Look for "core.art" or "core-*.art". 375 if (android::base::EndsWith(boot_image_filename, "core.art")) { 376 return true; 377 } 378 if (!android::base::EndsWith(boot_image_filename, ".art")) { 379 return false; 380 } 381 size_t slash_pos = boot_image_filename.rfind('/'); 382 if (slash_pos == std::string::npos) { 383 return android::base::StartsWith(boot_image_filename, "core-"); 384 } 385 return boot_image_filename.compare(slash_pos + 1, 5u, "core-") == 0; 386 } 387 GetDexToDexCompiler()388 optimizer::DexToDexCompiler& GetDexToDexCompiler() { 389 return dex_to_dex_compiler_; 390 } 391 392 private: 393 void PreCompile(jobject class_loader, 394 const std::vector<const DexFile*>& dex_files, 395 TimingLogger* timings) 396 REQUIRES(!Locks::mutator_lock_); 397 398 void LoadImageClasses(TimingLogger* timings) REQUIRES(!Locks::mutator_lock_); 399 400 // Attempt to resolve all type, methods, fields, and strings 401 // referenced from code in the dex file following PathClassLoader 402 // ordering semantics. 403 void Resolve(jobject class_loader, 404 const std::vector<const DexFile*>& dex_files, 405 TimingLogger* timings) 406 REQUIRES(!Locks::mutator_lock_); 407 void ResolveDexFile(jobject class_loader, 408 const DexFile& dex_file, 409 const std::vector<const DexFile*>& dex_files, 410 ThreadPool* thread_pool, 411 size_t thread_count, 412 TimingLogger* timings) 413 REQUIRES(!Locks::mutator_lock_); 414 415 // Do fast verification through VerifierDeps if possible. Return whether 416 // verification was successful. 417 bool FastVerify(jobject class_loader, 418 const std::vector<const DexFile*>& dex_files, 419 TimingLogger* timings); 420 421 void Verify(jobject class_loader, 422 const std::vector<const DexFile*>& dex_files, 423 TimingLogger* timings); 424 425 void VerifyDexFile(jobject class_loader, 426 const DexFile& dex_file, 427 const std::vector<const DexFile*>& dex_files, 428 ThreadPool* thread_pool, 429 size_t thread_count, 430 TimingLogger* timings) 431 REQUIRES(!Locks::mutator_lock_); 432 433 void SetVerified(jobject class_loader, 434 const std::vector<const DexFile*>& dex_files, 435 TimingLogger* timings); 436 void SetVerifiedDexFile(jobject class_loader, 437 const DexFile& dex_file, 438 const std::vector<const DexFile*>& dex_files, 439 ThreadPool* thread_pool, 440 size_t thread_count, 441 TimingLogger* timings) 442 REQUIRES(!Locks::mutator_lock_); 443 444 void InitializeClasses(jobject class_loader, 445 const std::vector<const DexFile*>& dex_files, 446 TimingLogger* timings) 447 REQUIRES(!Locks::mutator_lock_); 448 void InitializeClasses(jobject class_loader, 449 const DexFile& dex_file, 450 const std::vector<const DexFile*>& dex_files, 451 TimingLogger* timings) 452 REQUIRES(!Locks::mutator_lock_); 453 454 void UpdateImageClasses(TimingLogger* timings) REQUIRES(!Locks::mutator_lock_); 455 456 void Compile(jobject class_loader, 457 const std::vector<const DexFile*>& dex_files, 458 TimingLogger* timings); 459 460 bool MayInlineInternal(const DexFile* inlined_from, const DexFile* inlined_into) const; 461 462 void InitializeThreadPools(); 463 void FreeThreadPools(); 464 void CheckThreadPools(); 465 466 bool RequiresConstructorBarrier(const DexFile& dex_file, uint16_t class_def_idx) const; 467 468 const CompilerOptions* const compiler_options_; 469 VerificationResults* const verification_results_; 470 471 std::unique_ptr<Compiler> compiler_; 472 Compiler::Kind compiler_kind_; 473 474 const InstructionSet instruction_set_; 475 const InstructionSetFeatures* const instruction_set_features_; 476 477 // All class references that require constructor barriers. If the class reference is not in the 478 // set then the result has not yet been computed. 479 mutable ReaderWriterMutex requires_constructor_barrier_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 480 std::map<ClassReference, bool> requires_constructor_barrier_ 481 GUARDED_BY(requires_constructor_barrier_lock_); 482 483 // All class references that this compiler has compiled. Indexed by class defs. 484 using ClassStateTable = AtomicDexRefMap<ClassReference, ClassStatus>; 485 ClassStateTable compiled_classes_; 486 // All class references that are in the classpath. Indexed by class defs. 487 ClassStateTable classpath_classes_; 488 489 typedef AtomicDexRefMap<MethodReference, CompiledMethod*> MethodTable; 490 491 private: 492 // All method references that this compiler has compiled. 493 MethodTable compiled_methods_; 494 495 // Number of non-relative patches in all compiled methods. These patches need space 496 // in the .oat_patches ELF section if requested in the compiler options. 497 Atomic<size_t> non_relative_linker_patch_count_; 498 499 // If image_ is true, specifies the classes that will be included in the image. 500 // Note if image_classes_ is null, all classes are included in the image. 501 std::unique_ptr<std::unordered_set<std::string>> image_classes_; 502 503 // Specifies the classes that will be compiled. Note that if classes_to_compile_ is null, 504 // all classes are eligible for compilation (duplication filters etc. will still apply). 505 // This option may be restricted to the boot image, depending on a flag in the implementation. 506 std::unique_ptr<std::unordered_set<std::string>> classes_to_compile_; 507 508 // Specifies the methods that will be compiled. Note that if methods_to_compile_ is null, 509 // all methods are eligible for compilation (compilation filters etc. will still apply). 510 // This option may be restricted to the boot image, depending on a flag in the implementation. 511 std::unique_ptr<std::unordered_set<std::string>> methods_to_compile_; 512 513 std::atomic<uint32_t> number_of_soft_verifier_failures_; 514 bool had_hard_verifier_failure_; 515 516 // A thread pool that can (potentially) run tasks in parallel. 517 std::unique_ptr<ThreadPool> parallel_thread_pool_; 518 size_t parallel_thread_count_; 519 520 // A thread pool that guarantees running single-threaded on the main thread. 521 std::unique_ptr<ThreadPool> single_thread_pool_; 522 523 class AOTCompilationStats; 524 std::unique_ptr<AOTCompilationStats> stats_; 525 526 typedef void (*CompilerCallbackFn)(CompilerDriver& driver); 527 typedef MutexLock* (*CompilerMutexLockFn)(CompilerDriver& driver); 528 529 void* compiler_context_; 530 531 bool support_boot_image_fixup_; 532 533 // List of dex files associates with the oat file. 534 std::vector<const DexFile*> dex_files_for_oat_file_; 535 536 CompiledMethodStorage compiled_method_storage_; 537 538 // Info for profile guided compilation. 539 const ProfileCompilationInfo* const profile_compilation_info_; 540 541 size_t max_arena_alloc_; 542 543 // Compiler for dex to dex (quickening). 544 optimizer::DexToDexCompiler dex_to_dex_compiler_; 545 546 friend class CompileClassVisitor; 547 friend class DexToDexDecompilerTest; 548 friend class verifier::VerifierDepsTest; 549 DISALLOW_COPY_AND_ASSIGN(CompilerDriver); 550 }; 551 552 } // namespace art 553 554 #endif // ART_COMPILER_DRIVER_COMPILER_DRIVER_H_ 555