Home | History | Annotate | Download | only in runtime
      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_RUNTIME_RUNTIME_H_
     18 #define ART_RUNTIME_RUNTIME_H_
     19 
     20 #include <jni.h>
     21 #include <stdio.h>
     22 
     23 #include <iosfwd>
     24 #include <set>
     25 #include <string>
     26 #include <utility>
     27 #include <memory>
     28 #include <vector>
     29 
     30 #include "base/file_utils.h"
     31 #include "base/locks.h"
     32 #include "base/macros.h"
     33 #include "base/mem_map.h"
     34 #include "deoptimization_kind.h"
     35 #include "dex/dex_file_types.h"
     36 #include "experimental_flags.h"
     37 #include "gc/space/image_space_loading_order.h"
     38 #include "gc_root.h"
     39 #include "instrumentation.h"
     40 #include "jdwp_provider.h"
     41 #include "obj_ptr.h"
     42 #include "offsets.h"
     43 #include "process_state.h"
     44 #include "quick/quick_method_frame_info.h"
     45 #include "runtime_stats.h"
     46 
     47 namespace art {
     48 
     49 namespace gc {
     50 class AbstractSystemWeakHolder;
     51 class Heap;
     52 }  // namespace gc
     53 
     54 namespace hiddenapi {
     55 enum class EnforcementPolicy;
     56 }  // namespace hiddenapi
     57 
     58 namespace jit {
     59 class Jit;
     60 class JitCodeCache;
     61 class JitOptions;
     62 }  // namespace jit
     63 
     64 namespace mirror {
     65 class Array;
     66 class ClassLoader;
     67 class DexCache;
     68 template<class T> class ObjectArray;
     69 template<class T> class PrimitiveArray;
     70 typedef PrimitiveArray<int8_t> ByteArray;
     71 class String;
     72 class Throwable;
     73 }  // namespace mirror
     74 namespace ti {
     75 class Agent;
     76 class AgentSpec;
     77 }  // namespace ti
     78 namespace verifier {
     79 class MethodVerifier;
     80 enum class VerifyMode : int8_t;
     81 }  // namespace verifier
     82 class ArenaPool;
     83 class ArtMethod;
     84 enum class CalleeSaveType: uint32_t;
     85 class ClassLinker;
     86 class CompilerCallbacks;
     87 class DexFile;
     88 enum class InstructionSet;
     89 class InternTable;
     90 class IsMarkedVisitor;
     91 class JavaVMExt;
     92 class LinearAlloc;
     93 class MonitorList;
     94 class MonitorPool;
     95 class NullPointerHandler;
     96 class OatFileAssistantTest;
     97 class OatFileManager;
     98 class Plugin;
     99 struct RuntimeArgumentMap;
    100 class RuntimeCallbacks;
    101 class SignalCatcher;
    102 class StackOverflowHandler;
    103 class SuspensionHandler;
    104 class ThreadList;
    105 class ThreadPool;
    106 class Trace;
    107 struct TraceConfig;
    108 class Transaction;
    109 
    110 typedef std::vector<std::pair<std::string, const void*>> RuntimeOptions;
    111 
    112 class Runtime {
    113  public:
    114   // Parse raw runtime options.
    115   static bool ParseOptions(const RuntimeOptions& raw_options,
    116                            bool ignore_unrecognized,
    117                            RuntimeArgumentMap* runtime_options);
    118 
    119   // Creates and initializes a new runtime.
    120   static bool Create(RuntimeArgumentMap&& runtime_options)
    121       SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
    122 
    123   // Creates and initializes a new runtime.
    124   static bool Create(const RuntimeOptions& raw_options, bool ignore_unrecognized)
    125       SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
    126 
    127   // IsAotCompiler for compilers that don't have a running runtime. Only dex2oat currently.
    128   bool IsAotCompiler() const {
    129     return !UseJitCompilation() && IsCompiler();
    130   }
    131 
    132   // IsCompiler is any runtime which has a running compiler, either dex2oat or JIT.
    133   bool IsCompiler() const {
    134     return compiler_callbacks_ != nullptr;
    135   }
    136 
    137   // If a compiler, are we compiling a boot image?
    138   bool IsCompilingBootImage() const;
    139 
    140   bool CanRelocate() const;
    141 
    142   bool ShouldRelocate() const {
    143     return must_relocate_ && CanRelocate();
    144   }
    145 
    146   bool MustRelocateIfPossible() const {
    147     return must_relocate_;
    148   }
    149 
    150   bool IsImageDex2OatEnabled() const {
    151     return image_dex2oat_enabled_;
    152   }
    153 
    154   CompilerCallbacks* GetCompilerCallbacks() {
    155     return compiler_callbacks_;
    156   }
    157 
    158   void SetCompilerCallbacks(CompilerCallbacks* callbacks) {
    159     CHECK(callbacks != nullptr);
    160     compiler_callbacks_ = callbacks;
    161   }
    162 
    163   bool IsZygote() const {
    164     return is_zygote_;
    165   }
    166 
    167   bool IsSystemServer() const {
    168     return is_system_server_;
    169   }
    170 
    171   void SetSystemServer(bool value) {
    172     is_system_server_ = value;
    173   }
    174 
    175   bool IsExplicitGcDisabled() const {
    176     return is_explicit_gc_disabled_;
    177   }
    178 
    179   std::string GetCompilerExecutable() const;
    180 
    181   const std::vector<std::string>& GetCompilerOptions() const {
    182     return compiler_options_;
    183   }
    184 
    185   void AddCompilerOption(const std::string& option) {
    186     compiler_options_.push_back(option);
    187   }
    188 
    189   const std::vector<std::string>& GetImageCompilerOptions() const {
    190     return image_compiler_options_;
    191   }
    192 
    193   const std::string& GetImageLocation() const {
    194     return image_location_;
    195   }
    196 
    197   bool IsUsingApexBootImageLocation() const {
    198     return is_using_apex_boot_image_location_;
    199   }
    200 
    201   // Starts a runtime, which may cause threads to be started and code to run.
    202   bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);
    203 
    204   bool IsShuttingDown(Thread* self);
    205   bool IsShuttingDownLocked() const REQUIRES(Locks::runtime_shutdown_lock_) {
    206     return shutting_down_;
    207   }
    208 
    209   size_t NumberOfThreadsBeingBorn() const REQUIRES(Locks::runtime_shutdown_lock_) {
    210     return threads_being_born_;
    211   }
    212 
    213   void StartThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_) {
    214     threads_being_born_++;
    215   }
    216 
    217   void EndThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_);
    218 
    219   bool IsStarted() const {
    220     return started_;
    221   }
    222 
    223   bool IsFinishedStarting() const {
    224     return finished_starting_;
    225   }
    226 
    227   void RunRootClinits(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
    228 
    229   static Runtime* Current() {
    230     return instance_;
    231   }
    232 
    233   // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
    234   // callers should prefer.
    235   NO_RETURN static void Abort(const char* msg) REQUIRES(!Locks::abort_lock_);
    236 
    237   // Returns the "main" ThreadGroup, used when attaching user threads.
    238   jobject GetMainThreadGroup() const;
    239 
    240   // Returns the "system" ThreadGroup, used when attaching our internal threads.
    241   jobject GetSystemThreadGroup() const;
    242 
    243   // Returns the system ClassLoader which represents the CLASSPATH.
    244   jobject GetSystemClassLoader() const;
    245 
    246   // Attaches the calling native thread to the runtime.
    247   bool AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group,
    248                            bool create_peer);
    249 
    250   void CallExitHook(jint status);
    251 
    252   // Detaches the current native thread from the runtime.
    253   void DetachCurrentThread() REQUIRES(!Locks::mutator_lock_);
    254 
    255   void DumpDeoptimizations(std::ostream& os);
    256   void DumpForSigQuit(std::ostream& os);
    257   void DumpLockHolders(std::ostream& os);
    258 
    259   ~Runtime();
    260 
    261   const std::vector<std::string>& GetBootClassPath() const {
    262     return boot_class_path_;
    263   }
    264 
    265   const std::vector<std::string>& GetBootClassPathLocations() const {
    266     DCHECK(boot_class_path_locations_.empty() ||
    267            boot_class_path_locations_.size() == boot_class_path_.size());
    268     return boot_class_path_locations_.empty() ? boot_class_path_ : boot_class_path_locations_;
    269   }
    270 
    271   const std::string& GetClassPathString() const {
    272     return class_path_string_;
    273   }
    274 
    275   ClassLinker* GetClassLinker() const {
    276     return class_linker_;
    277   }
    278 
    279   size_t GetDefaultStackSize() const {
    280     return default_stack_size_;
    281   }
    282 
    283   unsigned int GetFinalizerTimeoutMs() const {
    284     return finalizer_timeout_ms_;
    285   }
    286 
    287   gc::Heap* GetHeap() const {
    288     return heap_;
    289   }
    290 
    291   InternTable* GetInternTable() const {
    292     DCHECK(intern_table_ != nullptr);
    293     return intern_table_;
    294   }
    295 
    296   JavaVMExt* GetJavaVM() const {
    297     return java_vm_.get();
    298   }
    299 
    300   size_t GetMaxSpinsBeforeThinLockInflation() const {
    301     return max_spins_before_thin_lock_inflation_;
    302   }
    303 
    304   MonitorList* GetMonitorList() const {
    305     return monitor_list_;
    306   }
    307 
    308   MonitorPool* GetMonitorPool() const {
    309     return monitor_pool_;
    310   }
    311 
    312   // Is the given object the special object used to mark a cleared JNI weak global?
    313   bool IsClearedJniWeakGlobal(ObjPtr<mirror::Object> obj) REQUIRES_SHARED(Locks::mutator_lock_);
    314 
    315   // Get the special object used to mark a cleared JNI weak global.
    316   mirror::Object* GetClearedJniWeakGlobal() REQUIRES_SHARED(Locks::mutator_lock_);
    317 
    318   mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingException()
    319       REQUIRES_SHARED(Locks::mutator_lock_);
    320   mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingOOME()
    321       REQUIRES_SHARED(Locks::mutator_lock_);
    322   mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenHandlingStackOverflow()
    323       REQUIRES_SHARED(Locks::mutator_lock_);
    324 
    325   mirror::Throwable* GetPreAllocatedNoClassDefFoundError()
    326       REQUIRES_SHARED(Locks::mutator_lock_);
    327 
    328   const std::vector<std::string>& GetProperties() const {
    329     return properties_;
    330   }
    331 
    332   ThreadList* GetThreadList() const {
    333     return thread_list_;
    334   }
    335 
    336   static const char* GetVersion() {
    337     return "2.1.0";
    338   }
    339 
    340   bool IsMethodHandlesEnabled() const {
    341     return true;
    342   }
    343 
    344   void DisallowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
    345   void AllowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
    346   // broadcast_for_checkpoint is true when we broadcast for making blocking threads to respond to
    347   // checkpoint requests. It's false when we broadcast to unblock blocking threads after system weak
    348   // access is reenabled.
    349   void BroadcastForNewSystemWeaks(bool broadcast_for_checkpoint = false);
    350 
    351   // Visit all the roots. If only_dirty is true then non-dirty roots won't be visited. If
    352   // clean_dirty is true then dirty roots will be marked as non-dirty after visiting.
    353   void VisitRoots(RootVisitor* visitor, VisitRootFlags flags = kVisitRootFlagAllRoots)
    354       REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
    355       REQUIRES_SHARED(Locks::mutator_lock_);
    356 
    357   // Visit image roots, only used for hprof since the GC uses the image space mod union table
    358   // instead.
    359   void VisitImageRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
    360 
    361   // Visit all of the roots we can safely visit concurrently.
    362   void VisitConcurrentRoots(RootVisitor* visitor,
    363                             VisitRootFlags flags = kVisitRootFlagAllRoots)
    364       REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
    365       REQUIRES_SHARED(Locks::mutator_lock_);
    366 
    367   // Visit all of the non thread roots, we can do this with mutators unpaused.
    368   void VisitNonThreadRoots(RootVisitor* visitor)
    369       REQUIRES_SHARED(Locks::mutator_lock_);
    370 
    371   void VisitTransactionRoots(RootVisitor* visitor)
    372       REQUIRES_SHARED(Locks::mutator_lock_);
    373 
    374   // Sweep system weaks, the system weak is deleted if the visitor return null. Otherwise, the
    375   // system weak is updated to be the visitor's returned value.
    376   void SweepSystemWeaks(IsMarkedVisitor* visitor)
    377       REQUIRES_SHARED(Locks::mutator_lock_);
    378 
    379   // Returns a special method that calls into a trampoline for runtime method resolution
    380   ArtMethod* GetResolutionMethod();
    381 
    382   bool HasResolutionMethod() const {
    383     return resolution_method_ != nullptr;
    384   }
    385 
    386   void SetResolutionMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
    387   void ClearResolutionMethod() {
    388     resolution_method_ = nullptr;
    389   }
    390 
    391   ArtMethod* CreateResolutionMethod() REQUIRES_SHARED(Locks::mutator_lock_);
    392 
    393   // Returns a special method that calls into a trampoline for runtime imt conflicts.
    394   ArtMethod* GetImtConflictMethod();
    395   ArtMethod* GetImtUnimplementedMethod();
    396 
    397   bool HasImtConflictMethod() const {
    398     return imt_conflict_method_ != nullptr;
    399   }
    400 
    401   void ClearImtConflictMethod() {
    402     imt_conflict_method_ = nullptr;
    403   }
    404 
    405   void FixupConflictTables();
    406   void SetImtConflictMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
    407   void SetImtUnimplementedMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
    408 
    409   ArtMethod* CreateImtConflictMethod(LinearAlloc* linear_alloc)
    410       REQUIRES_SHARED(Locks::mutator_lock_);
    411 
    412   void ClearImtUnimplementedMethod() {
    413     imt_unimplemented_method_ = nullptr;
    414   }
    415 
    416   bool HasCalleeSaveMethod(CalleeSaveType type) const {
    417     return callee_save_methods_[static_cast<size_t>(type)] != 0u;
    418   }
    419 
    420   ArtMethod* GetCalleeSaveMethod(CalleeSaveType type)
    421       REQUIRES_SHARED(Locks::mutator_lock_);
    422 
    423   ArtMethod* GetCalleeSaveMethodUnchecked(CalleeSaveType type)
    424       REQUIRES_SHARED(Locks::mutator_lock_);
    425 
    426   QuickMethodFrameInfo GetRuntimeMethodFrameInfo(ArtMethod* method)
    427       REQUIRES_SHARED(Locks::mutator_lock_);
    428 
    429   static constexpr size_t GetCalleeSaveMethodOffset(CalleeSaveType type) {
    430     return OFFSETOF_MEMBER(Runtime, callee_save_methods_[static_cast<size_t>(type)]);
    431   }
    432 
    433   InstructionSet GetInstructionSet() const {
    434     return instruction_set_;
    435   }
    436 
    437   void SetInstructionSet(InstructionSet instruction_set);
    438   void ClearInstructionSet();
    439 
    440   void SetCalleeSaveMethod(ArtMethod* method, CalleeSaveType type);
    441   void ClearCalleeSaveMethods();
    442 
    443   ArtMethod* CreateCalleeSaveMethod() REQUIRES_SHARED(Locks::mutator_lock_);
    444 
    445   int32_t GetStat(int kind);
    446 
    447   RuntimeStats* GetStats() {
    448     return &stats_;
    449   }
    450 
    451   bool HasStatsEnabled() const {
    452     return stats_enabled_;
    453   }
    454 
    455   void ResetStats(int kinds);
    456 
    457   void SetStatsEnabled(bool new_state)
    458       REQUIRES(!Locks::instrument_entrypoints_lock_, !Locks::mutator_lock_);
    459 
    460   enum class NativeBridgeAction {  // private
    461     kUnload,
    462     kInitialize
    463   };
    464 
    465   jit::Jit* GetJit() const {
    466     return jit_.get();
    467   }
    468 
    469   // Returns true if JIT compilations are enabled. GetJit() will be not null in this case.
    470   bool UseJitCompilation() const;
    471 
    472   void PreZygoteFork();
    473   void PostZygoteFork();
    474   void InitNonZygoteOrPostFork(
    475       JNIEnv* env,
    476       bool is_system_server,
    477       NativeBridgeAction action,
    478       const char* isa,
    479       bool profile_system_server = false);
    480 
    481   const instrumentation::Instrumentation* GetInstrumentation() const {
    482     return &instrumentation_;
    483   }
    484 
    485   instrumentation::Instrumentation* GetInstrumentation() {
    486     return &instrumentation_;
    487   }
    488 
    489   void RegisterAppInfo(const std::vector<std::string>& code_paths,
    490                        const std::string& profile_output_filename);
    491 
    492   // Transaction support.
    493   bool IsActiveTransaction() const;
    494   void EnterTransactionMode();
    495   void EnterTransactionMode(bool strict, mirror::Class* root);
    496   void ExitTransactionMode();
    497   void RollbackAllTransactions() REQUIRES_SHARED(Locks::mutator_lock_);
    498   // Transaction rollback and exit transaction are always done together, it's convenience to
    499   // do them in one function.
    500   void RollbackAndExitTransactionMode() REQUIRES_SHARED(Locks::mutator_lock_);
    501   bool IsTransactionAborted() const;
    502   const std::unique_ptr<Transaction>& GetTransaction() const;
    503   bool IsActiveStrictTransactionMode() const;
    504 
    505   void AbortTransactionAndThrowAbortError(Thread* self, const std::string& abort_message)
    506       REQUIRES_SHARED(Locks::mutator_lock_);
    507   void ThrowTransactionAbortError(Thread* self)
    508       REQUIRES_SHARED(Locks::mutator_lock_);
    509 
    510   void RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset, uint8_t value,
    511                                bool is_volatile) const;
    512   void RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset, int8_t value,
    513                             bool is_volatile) const;
    514   void RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset, uint16_t value,
    515                             bool is_volatile) const;
    516   void RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset, int16_t value,
    517                           bool is_volatile) const;
    518   void RecordWriteField32(mirror::Object* obj, MemberOffset field_offset, uint32_t value,
    519                           bool is_volatile) const;
    520   void RecordWriteField64(mirror::Object* obj, MemberOffset field_offset, uint64_t value,
    521                           bool is_volatile) const;
    522   void RecordWriteFieldReference(mirror::Object* obj,
    523                                  MemberOffset field_offset,
    524                                  ObjPtr<mirror::Object> value,
    525                                  bool is_volatile) const
    526       REQUIRES_SHARED(Locks::mutator_lock_);
    527   void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value) const
    528       REQUIRES_SHARED(Locks::mutator_lock_);
    529   void RecordStrongStringInsertion(ObjPtr<mirror::String> s) const
    530       REQUIRES(Locks::intern_table_lock_);
    531   void RecordWeakStringInsertion(ObjPtr<mirror::String> s) const
    532       REQUIRES(Locks::intern_table_lock_);
    533   void RecordStrongStringRemoval(ObjPtr<mirror::String> s) const
    534       REQUIRES(Locks::intern_table_lock_);
    535   void RecordWeakStringRemoval(ObjPtr<mirror::String> s) const
    536       REQUIRES(Locks::intern_table_lock_);
    537   void RecordResolveString(ObjPtr<mirror::DexCache> dex_cache, dex::StringIndex string_idx) const
    538       REQUIRES_SHARED(Locks::mutator_lock_);
    539 
    540   void SetFaultMessage(const std::string& message);
    541 
    542   void AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* arg_vector) const;
    543 
    544   bool ExplicitStackOverflowChecks() const {
    545     return !implicit_so_checks_;
    546   }
    547 
    548   void DisableVerifier();
    549   bool IsVerificationEnabled() const;
    550   bool IsVerificationSoftFail() const;
    551 
    552   void SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
    553     hidden_api_policy_ = policy;
    554   }
    555 
    556   hiddenapi::EnforcementPolicy GetHiddenApiEnforcementPolicy() const {
    557     return hidden_api_policy_;
    558   }
    559 
    560   void SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
    561     core_platform_api_policy_ = policy;
    562   }
    563 
    564   hiddenapi::EnforcementPolicy GetCorePlatformApiEnforcementPolicy() const {
    565     return core_platform_api_policy_;
    566   }
    567 
    568   void SetHiddenApiExemptions(const std::vector<std::string>& exemptions) {
    569     hidden_api_exemptions_ = exemptions;
    570   }
    571 
    572   const std::vector<std::string>& GetHiddenApiExemptions() {
    573     return hidden_api_exemptions_;
    574   }
    575 
    576   void SetDedupeHiddenApiWarnings(bool value) {
    577     dedupe_hidden_api_warnings_ = value;
    578   }
    579 
    580   bool ShouldDedupeHiddenApiWarnings() {
    581     return dedupe_hidden_api_warnings_;
    582   }
    583 
    584   void SetHiddenApiEventLogSampleRate(uint32_t rate) {
    585     hidden_api_access_event_log_rate_ = rate;
    586   }
    587 
    588   uint32_t GetHiddenApiEventLogSampleRate() const {
    589     return hidden_api_access_event_log_rate_;
    590   }
    591 
    592   const std::string& GetProcessPackageName() const {
    593     return process_package_name_;
    594   }
    595 
    596   void SetProcessPackageName(const char* package_name) {
    597     if (package_name == nullptr) {
    598       process_package_name_.clear();
    599     } else {
    600       process_package_name_ = package_name;
    601     }
    602   }
    603 
    604   const std::string& GetProcessDataDirectory() const {
    605     return process_data_directory_;
    606   }
    607 
    608   void SetProcessDataDirectory(const char* data_dir) {
    609     if (data_dir == nullptr) {
    610       process_data_directory_.clear();
    611     } else {
    612       process_data_directory_ = data_dir;
    613     }
    614   }
    615 
    616   bool IsDexFileFallbackEnabled() const {
    617     return allow_dex_file_fallback_;
    618   }
    619 
    620   const std::vector<std::string>& GetCpuAbilist() const {
    621     return cpu_abilist_;
    622   }
    623 
    624   bool IsRunningOnMemoryTool() const {
    625     return is_running_on_memory_tool_;
    626   }
    627 
    628   void SetTargetSdkVersion(uint32_t version) {
    629     target_sdk_version_ = version;
    630   }
    631 
    632   uint32_t GetTargetSdkVersion() const {
    633     return target_sdk_version_;
    634   }
    635 
    636   uint32_t GetZygoteMaxFailedBoots() const {
    637     return zygote_max_failed_boots_;
    638   }
    639 
    640   bool AreExperimentalFlagsEnabled(ExperimentalFlags flags) {
    641     return (experimental_flags_ & flags) != ExperimentalFlags::kNone;
    642   }
    643 
    644   void CreateJitCodeCache(bool rwx_memory_allowed);
    645 
    646   // Create the JIT and instrumentation and code cache.
    647   void CreateJit();
    648 
    649   ArenaPool* GetArenaPool() {
    650     return arena_pool_.get();
    651   }
    652   ArenaPool* GetJitArenaPool() {
    653     return jit_arena_pool_.get();
    654   }
    655   const ArenaPool* GetArenaPool() const {
    656     return arena_pool_.get();
    657   }
    658 
    659   void ReclaimArenaPoolMemory();
    660 
    661   LinearAlloc* GetLinearAlloc() {
    662     return linear_alloc_.get();
    663   }
    664 
    665   jit::JitOptions* GetJITOptions() {
    666     return jit_options_.get();
    667   }
    668 
    669   bool IsJavaDebuggable() const {
    670     return is_java_debuggable_;
    671   }
    672 
    673   void SetJavaDebuggable(bool value);
    674 
    675   // Deoptimize the boot image, called for Java debuggable apps.
    676   void DeoptimizeBootImage() REQUIRES(Locks::mutator_lock_);
    677 
    678   bool IsNativeDebuggable() const {
    679     return is_native_debuggable_;
    680   }
    681 
    682   void SetNativeDebuggable(bool value) {
    683     is_native_debuggable_ = value;
    684   }
    685 
    686   bool AreNonStandardExitsEnabled() const {
    687     return non_standard_exits_enabled_;
    688   }
    689 
    690   void SetNonStandardExitsEnabled() {
    691     DoAndMaybeSwitchInterpreter([=](){ non_standard_exits_enabled_ = true; });
    692   }
    693 
    694   bool AreAsyncExceptionsThrown() const {
    695     return async_exceptions_thrown_;
    696   }
    697 
    698   void SetAsyncExceptionsThrown() {
    699     DoAndMaybeSwitchInterpreter([=](){ async_exceptions_thrown_ = true; });
    700   }
    701 
    702   // Change state and re-check which interpreter should be used.
    703   //
    704   // This must be called whenever there is an event that forces
    705   // us to use different interpreter (e.g. debugger is attached).
    706   //
    707   // Changing the state using the lamda gives us some multihreading safety.
    708   // It ensures that two calls do not interfere with each other and
    709   // it makes it possible to DCHECK that thread local flag is correct.
    710   template<typename Action>
    711   static void DoAndMaybeSwitchInterpreter(Action lamda);
    712 
    713   // Returns the build fingerprint, if set. Otherwise an empty string is returned.
    714   std::string GetFingerprint() {
    715     return fingerprint_;
    716   }
    717 
    718   // Called from class linker.
    719   void SetSentinel(mirror::Object* sentinel) REQUIRES_SHARED(Locks::mutator_lock_);
    720   // For testing purpose only.
    721   // TODO: Remove this when this is no longer needed (b/116087961).
    722   GcRoot<mirror::Object> GetSentinel() REQUIRES_SHARED(Locks::mutator_lock_);
    723 
    724   // Create a normal LinearAlloc or low 4gb version if we are 64 bit AOT compiler.
    725   LinearAlloc* CreateLinearAlloc();
    726 
    727   OatFileManager& GetOatFileManager() const {
    728     DCHECK(oat_file_manager_ != nullptr);
    729     return *oat_file_manager_;
    730   }
    731 
    732   double GetHashTableMinLoadFactor() const;
    733   double GetHashTableMaxLoadFactor() const;
    734 
    735   bool IsSafeMode() const {
    736     return safe_mode_;
    737   }
    738 
    739   void SetSafeMode(bool mode) {
    740     safe_mode_ = mode;
    741   }
    742 
    743   bool GetDumpNativeStackOnSigQuit() const {
    744     return dump_native_stack_on_sig_quit_;
    745   }
    746 
    747   bool GetPrunedDalvikCache() const {
    748     return pruned_dalvik_cache_;
    749   }
    750 
    751   void SetPrunedDalvikCache(bool pruned) {
    752     pruned_dalvik_cache_ = pruned;
    753   }
    754 
    755   void UpdateProcessState(ProcessState process_state);
    756 
    757   // Returns true if we currently care about long mutator pause.
    758   bool InJankPerceptibleProcessState() const {
    759     return process_state_ == kProcessStateJankPerceptible;
    760   }
    761 
    762   void RegisterSensitiveThread() const;
    763 
    764   void SetZygoteNoThreadSection(bool val) {
    765     zygote_no_threads_ = val;
    766   }
    767 
    768   bool IsZygoteNoThreadSection() const {
    769     return zygote_no_threads_;
    770   }
    771 
    772   // Returns if the code can be deoptimized asynchronously. Code may be compiled with some
    773   // optimization that makes it impossible to deoptimize.
    774   bool IsAsyncDeoptimizeable(uintptr_t code) const REQUIRES_SHARED(Locks::mutator_lock_);
    775 
    776   // Returns a saved copy of the environment (getenv/setenv values).
    777   // Used by Fork to protect against overwriting LD_LIBRARY_PATH, etc.
    778   char** GetEnvSnapshot() const {
    779     return env_snapshot_.GetSnapshot();
    780   }
    781 
    782   void AddSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
    783   void RemoveSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
    784 
    785   void AttachAgent(JNIEnv* env, const std::string& agent_arg, jobject class_loader);
    786 
    787   const std::list<std::unique_ptr<ti::Agent>>& GetAgents() const {
    788     return agents_;
    789   }
    790 
    791   RuntimeCallbacks* GetRuntimeCallbacks();
    792 
    793   bool HasLoadedPlugins() const {
    794     return !plugins_.empty();
    795   }
    796 
    797   void InitThreadGroups(Thread* self);
    798 
    799   void SetDumpGCPerformanceOnShutdown(bool value) {
    800     dump_gc_performance_on_shutdown_ = value;
    801   }
    802 
    803   bool GetDumpGCPerformanceOnShutdown() const {
    804     return dump_gc_performance_on_shutdown_;
    805   }
    806 
    807   void IncrementDeoptimizationCount(DeoptimizationKind kind) {
    808     DCHECK_LE(kind, DeoptimizationKind::kLast);
    809     deoptimization_counts_[static_cast<size_t>(kind)]++;
    810   }
    811 
    812   uint32_t GetNumberOfDeoptimizations() const {
    813     uint32_t result = 0;
    814     for (size_t i = 0; i <= static_cast<size_t>(DeoptimizationKind::kLast); ++i) {
    815       result += deoptimization_counts_[i];
    816     }
    817     return result;
    818   }
    819 
    820   // Whether or not we use MADV_RANDOM on files that are thought to have random access patterns.
    821   // This is beneficial for low RAM devices since it reduces page cache thrashing.
    822   bool MAdviseRandomAccess() const {
    823     return madvise_random_access_;
    824   }
    825 
    826   const std::string& GetJdwpOptions() {
    827     return jdwp_options_;
    828   }
    829 
    830   JdwpProvider GetJdwpProvider() const {
    831     return jdwp_provider_;
    832   }
    833 
    834   uint32_t GetVerifierLoggingThresholdMs() const {
    835     return verifier_logging_threshold_ms_;
    836   }
    837 
    838   // Atomically delete the thread pool if the reference count is 0.
    839   bool DeleteThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
    840 
    841   // Wait for all the thread workers to be attached.
    842   void WaitForThreadPoolWorkersToStart() REQUIRES(!Locks::runtime_thread_pool_lock_);
    843 
    844   // Scoped usage of the runtime thread pool. Prevents the pool from being
    845   // deleted. Note that the thread pool is only for startup and gets deleted after.
    846   class ScopedThreadPoolUsage {
    847    public:
    848     ScopedThreadPoolUsage();
    849     ~ScopedThreadPoolUsage();
    850 
    851     // Return the thread pool.
    852     ThreadPool* GetThreadPool() const {
    853       return thread_pool_;
    854     }
    855 
    856    private:
    857     ThreadPool* const thread_pool_;
    858   };
    859 
    860   bool LoadAppImageStartupCache() const {
    861     return load_app_image_startup_cache_;
    862   }
    863 
    864   void SetLoadAppImageStartupCacheEnabled(bool enabled) {
    865     load_app_image_startup_cache_ = enabled;
    866   }
    867 
    868   // Notify the runtime that application startup is considered completed. Only has effect for the
    869   // first call.
    870   void NotifyStartupCompleted();
    871 
    872   // Return true if startup is already completed.
    873   bool GetStartupCompleted() const;
    874 
    875   gc::space::ImageSpaceLoadingOrder GetImageSpaceLoadingOrder() const {
    876     return image_space_loading_order_;
    877   }
    878 
    879  private:
    880   static void InitPlatformSignalHandlers();
    881 
    882   Runtime();
    883 
    884   void BlockSignals();
    885 
    886   bool Init(RuntimeArgumentMap&& runtime_options)
    887       SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
    888   void InitNativeMethods() REQUIRES(!Locks::mutator_lock_);
    889   void RegisterRuntimeNativeMethods(JNIEnv* env);
    890 
    891   void StartDaemonThreads();
    892   void StartSignalCatcher();
    893 
    894   void MaybeSaveJitProfilingInfo();
    895 
    896   // Visit all of the thread roots.
    897   void VisitThreadRoots(RootVisitor* visitor, VisitRootFlags flags)
    898       REQUIRES_SHARED(Locks::mutator_lock_);
    899 
    900   // Visit all other roots which must be done with mutators suspended.
    901   void VisitNonConcurrentRoots(RootVisitor* visitor, VisitRootFlags flags)
    902       REQUIRES_SHARED(Locks::mutator_lock_);
    903 
    904   // Constant roots are the roots which never change after the runtime is initialized, they only
    905   // need to be visited once per GC cycle.
    906   void VisitConstantRoots(RootVisitor* visitor)
    907       REQUIRES_SHARED(Locks::mutator_lock_);
    908 
    909   // Note: To be lock-free, GetFaultMessage temporarily replaces the lock message with null.
    910   //       As such, there is a window where a call will return an empty string. In general,
    911   //       only aborting code should retrieve this data (via GetFaultMessageForAbortLogging
    912   //       friend).
    913   std::string GetFaultMessage();
    914 
    915   ThreadPool* AcquireThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
    916   void ReleaseThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
    917 
    918   // A pointer to the active runtime or null.
    919   static Runtime* instance_;
    920 
    921   // NOTE: these must match the gc::ProcessState values as they come directly from the framework.
    922   static constexpr int kProfileForground = 0;
    923   static constexpr int kProfileBackground = 1;
    924 
    925   static constexpr uint32_t kCalleeSaveSize = 6u;
    926 
    927   // 64 bit so that we can share the same asm offsets for both 32 and 64 bits.
    928   uint64_t callee_save_methods_[kCalleeSaveSize];
    929   // Pre-allocated exceptions (see Runtime::Init).
    930   GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_exception_;
    931   GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_oome_;
    932   GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_handling_stack_overflow_;
    933   GcRoot<mirror::Throwable> pre_allocated_NoClassDefFoundError_;
    934   ArtMethod* resolution_method_;
    935   ArtMethod* imt_conflict_method_;
    936   // Unresolved method has the same behavior as the conflict method, it is used by the class linker
    937   // for differentiating between unfilled imt slots vs conflict slots in superclasses.
    938   ArtMethod* imt_unimplemented_method_;
    939 
    940   // Special sentinel object used to invalid conditions in JNI (cleared weak references) and
    941   // JDWP (invalid references).
    942   GcRoot<mirror::Object> sentinel_;
    943 
    944   InstructionSet instruction_set_;
    945 
    946   CompilerCallbacks* compiler_callbacks_;
    947   bool is_zygote_;
    948   bool is_system_server_;
    949   bool must_relocate_;
    950   bool is_concurrent_gc_enabled_;
    951   bool is_explicit_gc_disabled_;
    952   bool image_dex2oat_enabled_;
    953 
    954   std::string compiler_executable_;
    955   std::vector<std::string> compiler_options_;
    956   std::vector<std::string> image_compiler_options_;
    957   std::string image_location_;
    958   bool is_using_apex_boot_image_location_;
    959 
    960   std::vector<std::string> boot_class_path_;
    961   std::vector<std::string> boot_class_path_locations_;
    962   std::string class_path_string_;
    963   std::vector<std::string> properties_;
    964 
    965   std::list<ti::AgentSpec> agent_specs_;
    966   std::list<std::unique_ptr<ti::Agent>> agents_;
    967   std::vector<Plugin> plugins_;
    968 
    969   // The default stack size for managed threads created by the runtime.
    970   size_t default_stack_size_;
    971 
    972   // Finalizers running for longer than this many milliseconds abort the runtime.
    973   unsigned int finalizer_timeout_ms_;
    974 
    975   gc::Heap* heap_;
    976 
    977   std::unique_ptr<ArenaPool> jit_arena_pool_;
    978   std::unique_ptr<ArenaPool> arena_pool_;
    979   // Special low 4gb pool for compiler linear alloc. We need ArtFields to be in low 4gb if we are
    980   // compiling using a 32 bit image on a 64 bit compiler in case we resolve things in the image
    981   // since the field arrays are int arrays in this case.
    982   std::unique_ptr<ArenaPool> low_4gb_arena_pool_;
    983 
    984   // Shared linear alloc for now.
    985   std::unique_ptr<LinearAlloc> linear_alloc_;
    986 
    987   // The number of spins that are done before thread suspension is used to forcibly inflate.
    988   size_t max_spins_before_thin_lock_inflation_;
    989   MonitorList* monitor_list_;
    990   MonitorPool* monitor_pool_;
    991 
    992   ThreadList* thread_list_;
    993 
    994   InternTable* intern_table_;
    995 
    996   ClassLinker* class_linker_;
    997 
    998   SignalCatcher* signal_catcher_;
    999 
   1000   std::unique_ptr<JavaVMExt> java_vm_;
   1001 
   1002   std::unique_ptr<jit::Jit> jit_;
   1003   std::unique_ptr<jit::JitCodeCache> jit_code_cache_;
   1004   std::unique_ptr<jit::JitOptions> jit_options_;
   1005 
   1006   // Runtime thread pool. The pool is only for startup and gets deleted after.
   1007   std::unique_ptr<ThreadPool> thread_pool_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
   1008   size_t thread_pool_ref_count_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
   1009 
   1010   // Fault message, printed when we get a SIGSEGV. Stored as a native-heap object and accessed
   1011   // lock-free, so needs to be atomic.
   1012   std::atomic<std::string*> fault_message_;
   1013 
   1014   // A non-zero value indicates that a thread has been created but not yet initialized. Guarded by
   1015   // the shutdown lock so that threads aren't born while we're shutting down.
   1016   size_t threads_being_born_ GUARDED_BY(Locks::runtime_shutdown_lock_);
   1017 
   1018   // Waited upon until no threads are being born.
   1019   std::unique_ptr<ConditionVariable> shutdown_cond_ GUARDED_BY(Locks::runtime_shutdown_lock_);
   1020 
   1021   // Set when runtime shutdown is past the point that new threads may attach.
   1022   bool shutting_down_ GUARDED_BY(Locks::runtime_shutdown_lock_);
   1023 
   1024   // The runtime is starting to shutdown but is blocked waiting on shutdown_cond_.
   1025   bool shutting_down_started_ GUARDED_BY(Locks::runtime_shutdown_lock_);
   1026 
   1027   bool started_;
   1028 
   1029   // New flag added which tells us if the runtime has finished starting. If
   1030   // this flag is set then the Daemon threads are created and the class loader
   1031   // is created. This flag is needed for knowing if its safe to request CMS.
   1032   bool finished_starting_;
   1033 
   1034   // Hooks supported by JNI_CreateJavaVM
   1035   jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
   1036   void (*exit_)(jint status);
   1037   void (*abort_)();
   1038 
   1039   bool stats_enabled_;
   1040   RuntimeStats stats_;
   1041 
   1042   const bool is_running_on_memory_tool_;
   1043 
   1044   std::unique_ptr<TraceConfig> trace_config_;
   1045 
   1046   instrumentation::Instrumentation instrumentation_;
   1047 
   1048   jobject main_thread_group_;
   1049   jobject system_thread_group_;
   1050 
   1051   // As returned by ClassLoader.getSystemClassLoader().
   1052   jobject system_class_loader_;
   1053 
   1054   // If true, then we dump the GC cumulative timings on shutdown.
   1055   bool dump_gc_performance_on_shutdown_;
   1056 
   1057   // Transactions used for pre-initializing classes at compilation time.
   1058   // Support nested transactions, maintain a list containing all transactions. Transactions are
   1059   // handled under a stack discipline. Because GC needs to go over all transactions, we choose list
   1060   // as substantial data structure instead of stack.
   1061   std::list<std::unique_ptr<Transaction>> preinitialization_transactions_;
   1062 
   1063   // If kNone, verification is disabled. kEnable by default.
   1064   verifier::VerifyMode verify_;
   1065 
   1066   // If true, the runtime may use dex files directly with the interpreter if an oat file is not
   1067   // available/usable.
   1068   bool allow_dex_file_fallback_;
   1069 
   1070   // List of supported cpu abis.
   1071   std::vector<std::string> cpu_abilist_;
   1072 
   1073   // Specifies target SDK version to allow workarounds for certain API levels.
   1074   uint32_t target_sdk_version_;
   1075 
   1076   // Implicit checks flags.
   1077   bool implicit_null_checks_;       // NullPointer checks are implicit.
   1078   bool implicit_so_checks_;         // StackOverflow checks are implicit.
   1079   bool implicit_suspend_checks_;    // Thread suspension checks are implicit.
   1080 
   1081   // Whether or not the sig chain (and implicitly the fault handler) should be
   1082   // disabled. Tools like dex2oat don't need them. This enables
   1083   // building a statically link version of dex2oat.
   1084   bool no_sig_chain_;
   1085 
   1086   // Force the use of native bridge even if the app ISA matches the runtime ISA.
   1087   bool force_native_bridge_;
   1088 
   1089   // Whether or not a native bridge has been loaded.
   1090   //
   1091   // The native bridge allows running native code compiled for a foreign ISA. The way it works is,
   1092   // if standard dlopen fails to load native library associated with native activity, it calls to
   1093   // the native bridge to load it and then gets the trampoline for the entry to native activity.
   1094   //
   1095   // The option 'native_bridge_library_filename' specifies the name of the native bridge.
   1096   // When non-empty the native bridge will be loaded from the given file. An empty value means
   1097   // that there's no native bridge.
   1098   bool is_native_bridge_loaded_;
   1099 
   1100   // Whether we are running under native debugger.
   1101   bool is_native_debuggable_;
   1102 
   1103   // whether or not any async exceptions have ever been thrown. This is used to speed up the
   1104   // MterpShouldSwitchInterpreters function.
   1105   bool async_exceptions_thrown_;
   1106 
   1107   // Whether anything is going to be using the shadow-frame APIs to force a function to return
   1108   // early. Doing this requires that (1) we be debuggable and (2) that mterp is exited.
   1109   bool non_standard_exits_enabled_;
   1110 
   1111   // Whether Java code needs to be debuggable.
   1112   bool is_java_debuggable_;
   1113 
   1114   // The maximum number of failed boots we allow before pruning the dalvik cache
   1115   // and trying again. This option is only inspected when we're running as a
   1116   // zygote.
   1117   uint32_t zygote_max_failed_boots_;
   1118 
   1119   // Enable experimental opcodes that aren't fully specified yet. The intent is to
   1120   // eventually publish them as public-usable opcodes, but they aren't ready yet.
   1121   //
   1122   // Experimental opcodes should not be used by other production code.
   1123   ExperimentalFlags experimental_flags_;
   1124 
   1125   // Contains the build fingerprint, if given as a parameter.
   1126   std::string fingerprint_;
   1127 
   1128   // Oat file manager, keeps track of what oat files are open.
   1129   OatFileManager* oat_file_manager_;
   1130 
   1131   // Whether or not we are on a low RAM device.
   1132   bool is_low_memory_mode_;
   1133 
   1134   // Whether or not we use MADV_RANDOM on files that are thought to have random access patterns.
   1135   // This is beneficial for low RAM devices since it reduces page cache thrashing.
   1136   bool madvise_random_access_;
   1137 
   1138   // Whether the application should run in safe mode, that is, interpreter only.
   1139   bool safe_mode_;
   1140 
   1141   // Whether access checks on hidden API should be performed.
   1142   hiddenapi::EnforcementPolicy hidden_api_policy_;
   1143 
   1144   // Whether access checks on core platform API should be performed.
   1145   hiddenapi::EnforcementPolicy core_platform_api_policy_;
   1146 
   1147   // List of signature prefixes of methods that have been removed from the blacklist, and treated
   1148   // as if whitelisted.
   1149   std::vector<std::string> hidden_api_exemptions_;
   1150 
   1151   // Do not warn about the same hidden API access violation twice.
   1152   // This is only used for testing.
   1153   bool dedupe_hidden_api_warnings_;
   1154 
   1155   // How often to log hidden API access to the event log. An integer between 0
   1156   // (never) and 0x10000 (always).
   1157   uint32_t hidden_api_access_event_log_rate_;
   1158 
   1159   // The package of the app running in this process.
   1160   std::string process_package_name_;
   1161 
   1162   // The data directory of the app running in this process.
   1163   std::string process_data_directory_;
   1164 
   1165   // Whether threads should dump their native stack on SIGQUIT.
   1166   bool dump_native_stack_on_sig_quit_;
   1167 
   1168   // Whether the dalvik cache was pruned when initializing the runtime.
   1169   bool pruned_dalvik_cache_;
   1170 
   1171   // Whether or not we currently care about pause times.
   1172   ProcessState process_state_;
   1173 
   1174   // Whether zygote code is in a section that should not start threads.
   1175   bool zygote_no_threads_;
   1176 
   1177   // The string containing requested jdwp options
   1178   std::string jdwp_options_;
   1179 
   1180   // The jdwp provider we were configured with.
   1181   JdwpProvider jdwp_provider_;
   1182 
   1183   // Saved environment.
   1184   class EnvSnapshot {
   1185    public:
   1186     EnvSnapshot() = default;
   1187     void TakeSnapshot();
   1188     char** GetSnapshot() const;
   1189 
   1190    private:
   1191     std::unique_ptr<char*[]> c_env_vector_;
   1192     std::vector<std::unique_ptr<std::string>> name_value_pairs_;
   1193 
   1194     DISALLOW_COPY_AND_ASSIGN(EnvSnapshot);
   1195   } env_snapshot_;
   1196 
   1197   // Generic system-weak holders.
   1198   std::vector<gc::AbstractSystemWeakHolder*> system_weak_holders_;
   1199 
   1200   std::unique_ptr<RuntimeCallbacks> callbacks_;
   1201 
   1202   std::atomic<uint32_t> deoptimization_counts_[
   1203       static_cast<uint32_t>(DeoptimizationKind::kLast) + 1];
   1204 
   1205   MemMap protected_fault_page_;
   1206 
   1207   uint32_t verifier_logging_threshold_ms_;
   1208 
   1209   bool load_app_image_startup_cache_ = false;
   1210 
   1211   // If startup has completed, must happen at most once.
   1212   std::atomic<bool> startup_completed_ = false;
   1213 
   1214   gc::space::ImageSpaceLoadingOrder image_space_loading_order_ =
   1215       gc::space::ImageSpaceLoadingOrder::kSystemFirst;
   1216 
   1217   // Note: See comments on GetFaultMessage.
   1218   friend std::string GetFaultMessageForAbortLogging();
   1219   friend class ScopedThreadPoolUsage;
   1220   friend class OatFileAssistantTest;
   1221 
   1222   DISALLOW_COPY_AND_ASSIGN(Runtime);
   1223 };
   1224 
   1225 }  // namespace art
   1226 
   1227 #endif  // ART_RUNTIME_RUNTIME_H_
   1228