runtime.cc revision 40da286d3207d88ed8ff3f5caac4873874603428
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#include "runtime.h"
18
19// sys/mount.h has to come before linux/fs.h due to redefinition of MS_RDONLY, MS_BIND, etc
20#include <sys/mount.h>
21#ifdef __linux__
22#include <linux/fs.h>
23#endif
24
25#include <signal.h>
26#include <sys/syscall.h>
27#include <valgrind.h>
28
29#include <cstdio>
30#include <cstdlib>
31#include <limits>
32#include <memory_representation.h>
33#include <vector>
34#include <fcntl.h>
35
36#include "JniConstants.h"
37#include "ScopedLocalRef.h"
38#include "arch/arm/quick_method_frame_info_arm.h"
39#include "arch/arm/registers_arm.h"
40#include "arch/arm64/quick_method_frame_info_arm64.h"
41#include "arch/arm64/registers_arm64.h"
42#include "arch/instruction_set_features.h"
43#include "arch/mips/quick_method_frame_info_mips.h"
44#include "arch/mips/registers_mips.h"
45#include "arch/mips64/quick_method_frame_info_mips64.h"
46#include "arch/mips64/registers_mips64.h"
47#include "arch/x86/quick_method_frame_info_x86.h"
48#include "arch/x86/registers_x86.h"
49#include "arch/x86_64/quick_method_frame_info_x86_64.h"
50#include "arch/x86_64/registers_x86_64.h"
51#include "art_field-inl.h"
52#include "asm_support.h"
53#include "atomic.h"
54#include "base/arena_allocator.h"
55#include "base/dumpable.h"
56#include "base/unix_file/fd_file.h"
57#include "class_linker-inl.h"
58#include "compiler_callbacks.h"
59#include "debugger.h"
60#include "elf_file.h"
61#include "entrypoints/runtime_asm_entrypoints.h"
62#include "fault_handler.h"
63#include "gc/accounting/card_table-inl.h"
64#include "gc/heap.h"
65#include "gc/space/image_space.h"
66#include "gc/space/space-inl.h"
67#include "handle_scope-inl.h"
68#include "image.h"
69#include "instrumentation.h"
70#include "intern_table.h"
71#include "interpreter/interpreter.h"
72#include "jit/jit.h"
73#include "jni_internal.h"
74#include "linear_alloc.h"
75#include "mirror/array.h"
76#include "mirror/art_method-inl.h"
77#include "mirror/class-inl.h"
78#include "mirror/class_loader.h"
79#include "mirror/field.h"
80#include "mirror/stack_trace_element.h"
81#include "mirror/throwable.h"
82#include "monitor.h"
83#include "native/dalvik_system_DexFile.h"
84#include "native/dalvik_system_VMDebug.h"
85#include "native/dalvik_system_VMRuntime.h"
86#include "native/dalvik_system_VMStack.h"
87#include "native/dalvik_system_ZygoteHooks.h"
88#include "native/java_lang_Class.h"
89#include "native/java_lang_DexCache.h"
90#include "native/java_lang_Object.h"
91#include "native/java_lang_Runtime.h"
92#include "native/java_lang_String.h"
93#include "native/java_lang_System.h"
94#include "native/java_lang_Thread.h"
95#include "native/java_lang_Throwable.h"
96#include "native/java_lang_VMClassLoader.h"
97#include "native/java_lang_ref_FinalizerReference.h"
98#include "native/java_lang_ref_Reference.h"
99#include "native/java_lang_reflect_Array.h"
100#include "native/java_lang_reflect_Constructor.h"
101#include "native/java_lang_reflect_Field.h"
102#include "native/java_lang_reflect_Method.h"
103#include "native/java_lang_reflect_Proxy.h"
104#include "native/java_util_concurrent_atomic_AtomicLong.h"
105#include "native/org_apache_harmony_dalvik_ddmc_DdmServer.h"
106#include "native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.h"
107#include "native/sun_misc_Unsafe.h"
108#include "native_bridge_art_interface.h"
109#include "oat_file.h"
110#include "os.h"
111#include "parsed_options.h"
112#include "profiler.h"
113#include "quick/quick_method_frame_info.h"
114#include "reflection.h"
115#include "runtime_options.h"
116#include "ScopedLocalRef.h"
117#include "scoped_thread_state_change.h"
118#include "sigchain.h"
119#include "signal_catcher.h"
120#include "signal_set.h"
121#include "thread.h"
122#include "thread_list.h"
123#include "trace.h"
124#include "transaction.h"
125#include "verifier/method_verifier.h"
126#include "well_known_classes.h"
127
128namespace art {
129
130// If a signal isn't handled properly, enable a handler that attempts to dump the Java stack.
131static constexpr bool kEnableJavaStackTraceHandler = false;
132Runtime* Runtime::instance_ = nullptr;
133
134struct TraceConfig {
135  Trace::TraceMode trace_mode;
136  Trace::TraceOutputMode trace_output_mode;
137  std::string trace_file;
138  size_t trace_file_size;
139};
140
141Runtime::Runtime()
142    : instruction_set_(kNone),
143      compiler_callbacks_(nullptr),
144      is_zygote_(false),
145      must_relocate_(false),
146      is_concurrent_gc_enabled_(true),
147      is_explicit_gc_disabled_(false),
148      dex2oat_enabled_(true),
149      image_dex2oat_enabled_(true),
150      default_stack_size_(0),
151      heap_(nullptr),
152      max_spins_before_thin_lock_inflation_(Monitor::kDefaultMaxSpinsBeforeThinLockInflation),
153      monitor_list_(nullptr),
154      monitor_pool_(nullptr),
155      thread_list_(nullptr),
156      intern_table_(nullptr),
157      class_linker_(nullptr),
158      signal_catcher_(nullptr),
159      java_vm_(nullptr),
160      fault_message_lock_("Fault message lock"),
161      fault_message_(""),
162      threads_being_born_(0),
163      shutdown_cond_(new ConditionVariable("Runtime shutdown", *Locks::runtime_shutdown_lock_)),
164      shutting_down_(false),
165      shutting_down_started_(false),
166      started_(false),
167      finished_starting_(false),
168      vfprintf_(nullptr),
169      exit_(nullptr),
170      abort_(nullptr),
171      stats_enabled_(false),
172      running_on_valgrind_(RUNNING_ON_VALGRIND > 0),
173      profiler_started_(false),
174      instrumentation_(),
175      main_thread_group_(nullptr),
176      system_thread_group_(nullptr),
177      system_class_loader_(nullptr),
178      dump_gc_performance_on_shutdown_(false),
179      preinitialization_transaction_(nullptr),
180      verify_(false),
181      allow_dex_file_fallback_(true),
182      target_sdk_version_(0),
183      implicit_null_checks_(false),
184      implicit_so_checks_(false),
185      implicit_suspend_checks_(false),
186      is_native_bridge_loaded_(false),
187      zygote_max_failed_boots_(0) {
188  CheckAsmSupportOffsetsAndSizes();
189}
190
191Runtime::~Runtime() {
192  if (is_native_bridge_loaded_) {
193    UnloadNativeBridge();
194  }
195  if (dump_gc_performance_on_shutdown_) {
196    // This can't be called from the Heap destructor below because it
197    // could call RosAlloc::InspectAll() which needs the thread_list
198    // to be still alive.
199    heap_->DumpGcPerformanceInfo(LOG(INFO));
200  }
201
202  Thread* self = Thread::Current();
203  const bool attach_shutdown_thread = self == nullptr;
204  if (attach_shutdown_thread) {
205    CHECK(AttachCurrentThread("Shutdown thread", false, nullptr, false));
206    self = Thread::Current();
207  } else {
208    LOG(WARNING) << "Current thread not detached in Runtime shutdown";
209  }
210
211  {
212    MutexLock mu(self, *Locks::runtime_shutdown_lock_);
213    shutting_down_started_ = true;
214    while (threads_being_born_ > 0) {
215      shutdown_cond_->Wait(self);
216    }
217    shutting_down_ = true;
218  }
219  // Shutdown and wait for the daemons.
220  CHECK(self != nullptr);
221  if (IsFinishedStarting()) {
222    self->ClearException();
223    self->GetJniEnv()->CallStaticVoidMethod(WellKnownClasses::java_lang_Daemons,
224                                            WellKnownClasses::java_lang_Daemons_stop);
225  }
226  if (attach_shutdown_thread) {
227    DetachCurrentThread();
228    self = nullptr;
229  }
230
231  // Shut down background profiler before the runtime exits.
232  if (profiler_started_) {
233    BackgroundMethodSamplingProfiler::Shutdown();
234  }
235
236  Trace::Shutdown();
237
238  // Make sure to let the GC complete if it is running.
239  heap_->WaitForGcToComplete(gc::kGcCauseBackground, self);
240  heap_->DeleteThreadPool();
241  if (jit_.get() != nullptr) {
242    VLOG(jit) << "Deleting jit thread pool";
243    // Delete thread pool before the thread list since we don't want to wait forever on the
244    // JIT compiler threads.
245    jit_->DeleteThreadPool();
246  }
247
248  // Make sure our internal threads are dead before we start tearing down things they're using.
249  Dbg::StopJdwp();
250  delete signal_catcher_;
251
252  // Make sure all other non-daemon threads have terminated, and all daemon threads are suspended.
253  delete thread_list_;
254
255  // Delete the JIT after thread list to ensure that there is no remaining threads which could be
256  // accessing the instrumentation when we delete it.
257  if (jit_.get() != nullptr) {
258    VLOG(jit) << "Deleting jit";
259    jit_.reset(nullptr);
260  }
261  linear_alloc_.reset();
262  arena_pool_.reset();
263  low_4gb_arena_pool_.reset();
264
265  // Shutdown the fault manager if it was initialized.
266  fault_manager.Shutdown();
267
268  delete monitor_list_;
269  delete monitor_pool_;
270  delete class_linker_;
271  delete heap_;
272  delete intern_table_;
273  delete java_vm_;
274  Thread::Shutdown();
275  QuasiAtomic::Shutdown();
276  verifier::MethodVerifier::Shutdown();
277  MemMap::Shutdown();
278  // TODO: acquire a static mutex on Runtime to avoid racing.
279  CHECK(instance_ == nullptr || instance_ == this);
280  instance_ = nullptr;
281}
282
283struct AbortState {
284  void Dump(std::ostream& os) const {
285    if (gAborting > 1) {
286      os << "Runtime aborting --- recursively, so no thread-specific detail!\n";
287      return;
288    }
289    gAborting++;
290    os << "Runtime aborting...\n";
291    if (Runtime::Current() == NULL) {
292      os << "(Runtime does not yet exist!)\n";
293      return;
294    }
295    Thread* self = Thread::Current();
296    if (self == nullptr) {
297      os << "(Aborting thread was not attached to runtime!)\n";
298      DumpKernelStack(os, GetTid(), "  kernel: ", false);
299      DumpNativeStack(os, GetTid(), "  native: ", nullptr);
300    } else {
301      os << "Aborting thread:\n";
302      if (Locks::mutator_lock_->IsExclusiveHeld(self) || Locks::mutator_lock_->IsSharedHeld(self)) {
303        DumpThread(os, self);
304      } else {
305        if (Locks::mutator_lock_->SharedTryLock(self)) {
306          DumpThread(os, self);
307          Locks::mutator_lock_->SharedUnlock(self);
308        }
309      }
310    }
311    DumpAllThreads(os, self);
312  }
313
314  // No thread-safety analysis as we do explicitly test for holding the mutator lock.
315  void DumpThread(std::ostream& os, Thread* self) const NO_THREAD_SAFETY_ANALYSIS {
316    DCHECK(Locks::mutator_lock_->IsExclusiveHeld(self) || Locks::mutator_lock_->IsSharedHeld(self));
317    self->Dump(os);
318    if (self->IsExceptionPending()) {
319      mirror::Throwable* exception = self->GetException();
320      os << "Pending exception " << exception->Dump();
321    }
322  }
323
324  void DumpAllThreads(std::ostream& os, Thread* self) const {
325    Runtime* runtime = Runtime::Current();
326    if (runtime != nullptr) {
327      ThreadList* thread_list = runtime->GetThreadList();
328      if (thread_list != nullptr) {
329        bool tll_already_held = Locks::thread_list_lock_->IsExclusiveHeld(self);
330        bool ml_already_held = Locks::mutator_lock_->IsSharedHeld(self);
331        if (!tll_already_held || !ml_already_held) {
332          os << "Dumping all threads without appropriate locks held:"
333              << (!tll_already_held ? " thread list lock" : "")
334              << (!ml_already_held ? " mutator lock" : "")
335              << "\n";
336        }
337        os << "All threads:\n";
338        thread_list->Dump(os);
339      }
340    }
341  }
342};
343
344void Runtime::Abort() {
345  gAborting++;  // set before taking any locks
346
347  // Ensure that we don't have multiple threads trying to abort at once,
348  // which would result in significantly worse diagnostics.
349  MutexLock mu(Thread::Current(), *Locks::abort_lock_);
350
351  // Get any pending output out of the way.
352  fflush(NULL);
353
354  // Many people have difficulty distinguish aborts from crashes,
355  // so be explicit.
356  AbortState state;
357  LOG(INTERNAL_FATAL) << Dumpable<AbortState>(state);
358
359  // Call the abort hook if we have one.
360  if (Runtime::Current() != NULL && Runtime::Current()->abort_ != NULL) {
361    LOG(INTERNAL_FATAL) << "Calling abort hook...";
362    Runtime::Current()->abort_();
363    // notreached
364    LOG(INTERNAL_FATAL) << "Unexpectedly returned from abort hook!";
365  }
366
367#if defined(__GLIBC__)
368  // TODO: we ought to be able to use pthread_kill(3) here (or abort(3),
369  // which POSIX defines in terms of raise(3), which POSIX defines in terms
370  // of pthread_kill(3)). On Linux, though, libcorkscrew can't unwind through
371  // libpthread, which means the stacks we dump would be useless. Calling
372  // tgkill(2) directly avoids that.
373  syscall(__NR_tgkill, getpid(), GetTid(), SIGABRT);
374  // TODO: LLVM installs it's own SIGABRT handler so exit to be safe... Can we disable that in LLVM?
375  // If not, we could use sigaction(3) before calling tgkill(2) and lose this call to exit(3).
376  exit(1);
377#else
378  abort();
379#endif
380  // notreached
381}
382
383void Runtime::PreZygoteFork() {
384  heap_->PreZygoteFork();
385}
386
387void Runtime::CallExitHook(jint status) {
388  if (exit_ != NULL) {
389    ScopedThreadStateChange tsc(Thread::Current(), kNative);
390    exit_(status);
391    LOG(WARNING) << "Exit hook returned instead of exiting!";
392  }
393}
394
395void Runtime::SweepSystemWeaks(IsMarkedCallback* visitor, void* arg) {
396  GetInternTable()->SweepInternTableWeaks(visitor, arg);
397  GetMonitorList()->SweepMonitorList(visitor, arg);
398  GetJavaVM()->SweepJniWeakGlobals(visitor, arg);
399}
400
401bool Runtime::Create(const RuntimeOptions& options, bool ignore_unrecognized) {
402  // TODO: acquire a static mutex on Runtime to avoid racing.
403  if (Runtime::instance_ != NULL) {
404    return false;
405  }
406  InitLogging(NULL);  // Calls Locks::Init() as a side effect.
407  instance_ = new Runtime;
408  if (!instance_->Init(options, ignore_unrecognized)) {
409    // TODO: Currently deleting the instance will abort the runtime on destruction. Now This will
410    // leak memory, instead. Fix the destructor. b/19100793.
411    // delete instance_;
412    instance_ = NULL;
413    return false;
414  }
415  return true;
416}
417
418static jobject CreateSystemClassLoader(Runtime* runtime) {
419  if (runtime->IsAotCompiler() && !runtime->GetCompilerCallbacks()->IsBootImage()) {
420    return nullptr;
421  }
422
423  ScopedObjectAccess soa(Thread::Current());
424  ClassLinker* cl = Runtime::Current()->GetClassLinker();
425
426  StackHandleScope<2> hs(soa.Self());
427  Handle<mirror::Class> class_loader_class(
428      hs.NewHandle(soa.Decode<mirror::Class*>(WellKnownClasses::java_lang_ClassLoader)));
429  CHECK(cl->EnsureInitialized(soa.Self(), class_loader_class, true, true));
430
431  mirror::ArtMethod* getSystemClassLoader =
432      class_loader_class->FindDirectMethod("getSystemClassLoader", "()Ljava/lang/ClassLoader;");
433  CHECK(getSystemClassLoader != NULL);
434
435  JValue result = InvokeWithJValues(soa, nullptr, soa.EncodeMethod(getSystemClassLoader), nullptr);
436  JNIEnv* env = soa.Self()->GetJniEnv();
437  ScopedLocalRef<jobject> system_class_loader(env,
438                                              soa.AddLocalReference<jobject>(result.GetL()));
439  CHECK(system_class_loader.get() != nullptr);
440
441  soa.Self()->SetClassLoaderOverride(system_class_loader.get());
442
443  Handle<mirror::Class> thread_class(
444      hs.NewHandle(soa.Decode<mirror::Class*>(WellKnownClasses::java_lang_Thread)));
445  CHECK(cl->EnsureInitialized(soa.Self(), thread_class, true, true));
446
447  ArtField* contextClassLoader =
448      thread_class->FindDeclaredInstanceField("contextClassLoader", "Ljava/lang/ClassLoader;");
449  CHECK(contextClassLoader != NULL);
450
451  // We can't run in a transaction yet.
452  contextClassLoader->SetObject<false>(soa.Self()->GetPeer(),
453                                       soa.Decode<mirror::ClassLoader*>(system_class_loader.get()));
454
455  return env->NewGlobalRef(system_class_loader.get());
456}
457
458std::string Runtime::GetPatchoatExecutable() const {
459  if (!patchoat_executable_.empty()) {
460    return patchoat_executable_;
461  }
462  std::string patchoat_executable(GetAndroidRoot());
463  patchoat_executable += (kIsDebugBuild ? "/bin/patchoatd" : "/bin/patchoat");
464  return patchoat_executable;
465}
466
467std::string Runtime::GetCompilerExecutable() const {
468  if (!compiler_executable_.empty()) {
469    return compiler_executable_;
470  }
471  std::string compiler_executable(GetAndroidRoot());
472  compiler_executable += (kIsDebugBuild ? "/bin/dex2oatd" : "/bin/dex2oat");
473  return compiler_executable;
474}
475
476bool Runtime::Start() {
477  VLOG(startup) << "Runtime::Start entering";
478
479  // Restore main thread state to kNative as expected by native code.
480  Thread* self = Thread::Current();
481
482  self->TransitionFromRunnableToSuspended(kNative);
483
484  started_ = true;
485
486  // Use !IsAotCompiler so that we get test coverage, tests are never the zygote.
487  if (!IsAotCompiler()) {
488    ScopedObjectAccess soa(self);
489    gc::space::ImageSpace* image_space = heap_->GetImageSpace();
490    if (image_space != nullptr) {
491      GetInternTable()->AddImageStringsToTable(image_space);
492      GetClassLinker()->MoveImageClassesToClassTable();
493    }
494  }
495
496  // If we are the zygote then we need to wait until after forking to create the code cache
497  // due to SELinux restrictions on r/w/x memory regions.
498  if (!IsZygote() && jit_options_->UseJIT()) {
499    CreateJit();
500  }
501
502  if (!IsImageDex2OatEnabled() || !GetHeap()->HasImageSpace()) {
503    ScopedObjectAccess soa(self);
504    StackHandleScope<1> hs(soa.Self());
505    auto klass(hs.NewHandle<mirror::Class>(mirror::Class::GetJavaLangClass()));
506    class_linker_->EnsureInitialized(soa.Self(), klass, true, true);
507  }
508
509  // InitNativeMethods needs to be after started_ so that the classes
510  // it touches will have methods linked to the oat file if necessary.
511  InitNativeMethods();
512
513  // Initialize well known thread group values that may be accessed threads while attaching.
514  InitThreadGroups(self);
515
516  Thread::FinishStartup();
517
518  system_class_loader_ = CreateSystemClassLoader(this);
519
520  if (is_zygote_) {
521    if (!InitZygote()) {
522      return false;
523    }
524  } else {
525    if (is_native_bridge_loaded_) {
526      PreInitializeNativeBridge(".");
527    }
528    DidForkFromZygote(self->GetJniEnv(), NativeBridgeAction::kInitialize,
529                      GetInstructionSetString(kRuntimeISA));
530  }
531
532  StartDaemonThreads();
533
534  {
535    ScopedObjectAccess soa(self);
536    self->GetJniEnv()->locals.AssertEmpty();
537  }
538
539  VLOG(startup) << "Runtime::Start exiting";
540  finished_starting_ = true;
541
542  if (profiler_options_.IsEnabled() && !profile_output_filename_.empty()) {
543    // User has asked for a profile using -Xenable-profiler.
544    // Create the profile file if it doesn't exist.
545    int fd = open(profile_output_filename_.c_str(), O_RDWR|O_CREAT|O_EXCL, 0660);
546    if (fd >= 0) {
547      close(fd);
548    } else if (errno != EEXIST) {
549      LOG(INFO) << "Failed to access the profile file. Profiler disabled.";
550      return true;
551    }
552    StartProfiler(profile_output_filename_.c_str());
553  }
554
555  if (trace_config_.get() != nullptr && trace_config_->trace_file != "") {
556    ScopedThreadStateChange tsc(self, kWaitingForMethodTracingStart);
557    Trace::Start(trace_config_->trace_file.c_str(),
558                 -1,
559                 static_cast<int>(trace_config_->trace_file_size),
560                 0,
561                 trace_config_->trace_output_mode,
562                 trace_config_->trace_mode,
563                 0);
564  }
565
566  return true;
567}
568
569void Runtime::EndThreadBirth() EXCLUSIVE_LOCKS_REQUIRED(Locks::runtime_shutdown_lock_) {
570  DCHECK_GT(threads_being_born_, 0U);
571  threads_being_born_--;
572  if (shutting_down_started_ && threads_being_born_ == 0) {
573    shutdown_cond_->Broadcast(Thread::Current());
574  }
575}
576
577// Do zygote-mode-only initialization.
578bool Runtime::InitZygote() {
579#ifdef __linux__
580  // zygote goes into its own process group
581  setpgid(0, 0);
582
583  // See storage config details at http://source.android.com/tech/storage/
584  // Create private mount namespace shared by all children
585  if (unshare(CLONE_NEWNS) == -1) {
586    PLOG(WARNING) << "Failed to unshare()";
587    return false;
588  }
589
590  // Mark rootfs as being a slave so that changes from default
591  // namespace only flow into our children.
592  if (mount("rootfs", "/", NULL, (MS_SLAVE | MS_REC), NULL) == -1) {
593    PLOG(WARNING) << "Failed to mount() rootfs as MS_SLAVE";
594    return false;
595  }
596
597  // Create a staging tmpfs that is shared by our children; they will
598  // bind mount storage into their respective private namespaces, which
599  // are isolated from each other.
600  const char* target_base = getenv("EMULATED_STORAGE_TARGET");
601  if (target_base != NULL) {
602    if (mount("tmpfs", target_base, "tmpfs", MS_NOSUID | MS_NODEV,
603              "uid=0,gid=1028,mode=0751") == -1) {
604      LOG(WARNING) << "Failed to mount tmpfs to " << target_base;
605      return false;
606    }
607  }
608
609  return true;
610#else
611  UNIMPLEMENTED(FATAL);
612  return false;
613#endif
614}
615
616void Runtime::DidForkFromZygote(JNIEnv* env, NativeBridgeAction action, const char* isa) {
617  is_zygote_ = false;
618
619  if (is_native_bridge_loaded_) {
620    switch (action) {
621      case NativeBridgeAction::kUnload:
622        UnloadNativeBridge();
623        is_native_bridge_loaded_ = false;
624        break;
625
626      case NativeBridgeAction::kInitialize:
627        InitializeNativeBridge(env, isa);
628        break;
629    }
630  }
631
632  // Create the thread pools.
633  heap_->CreateThreadPool();
634  if (jit_.get() == nullptr && jit_options_->UseJIT()) {
635    // Create the JIT if the flag is set and we haven't already create it (happens for run-tests).
636    CreateJit();
637  }
638
639  StartSignalCatcher();
640
641  // Start the JDWP thread. If the command-line debugger flags specified "suspend=y",
642  // this will pause the runtime, so we probably want this to come last.
643  Dbg::StartJdwp();
644}
645
646void Runtime::StartSignalCatcher() {
647  if (!is_zygote_) {
648    signal_catcher_ = new SignalCatcher(stack_trace_file_);
649  }
650}
651
652bool Runtime::IsShuttingDown(Thread* self) {
653  MutexLock mu(self, *Locks::runtime_shutdown_lock_);
654  return IsShuttingDownLocked();
655}
656
657void Runtime::StartDaemonThreads() {
658  VLOG(startup) << "Runtime::StartDaemonThreads entering";
659
660  Thread* self = Thread::Current();
661
662  // Must be in the kNative state for calling native methods.
663  CHECK_EQ(self->GetState(), kNative);
664
665  JNIEnv* env = self->GetJniEnv();
666  env->CallStaticVoidMethod(WellKnownClasses::java_lang_Daemons,
667                            WellKnownClasses::java_lang_Daemons_start);
668  if (env->ExceptionCheck()) {
669    env->ExceptionDescribe();
670    LOG(FATAL) << "Error starting java.lang.Daemons";
671  }
672
673  VLOG(startup) << "Runtime::StartDaemonThreads exiting";
674}
675
676static bool OpenDexFilesFromImage(const std::string& image_location,
677                                  std::vector<std::unique_ptr<const DexFile>>* dex_files,
678                                  size_t* failures) {
679  DCHECK(dex_files != nullptr) << "OpenDexFilesFromImage: out-param is NULL";
680  std::string system_filename;
681  bool has_system = false;
682  std::string cache_filename_unused;
683  bool dalvik_cache_exists_unused;
684  bool has_cache_unused;
685  bool is_global_cache_unused;
686  bool found_image = gc::space::ImageSpace::FindImageFilename(image_location.c_str(),
687                                                              kRuntimeISA,
688                                                              &system_filename,
689                                                              &has_system,
690                                                              &cache_filename_unused,
691                                                              &dalvik_cache_exists_unused,
692                                                              &has_cache_unused,
693                                                              &is_global_cache_unused);
694  *failures = 0;
695  if (!found_image || !has_system) {
696    return false;
697  }
698  std::string error_msg;
699  // We are falling back to non-executable use of the oat file because patching failed, presumably
700  // due to lack of space.
701  std::string oat_filename = ImageHeader::GetOatLocationFromImageLocation(system_filename.c_str());
702  std::string oat_location = ImageHeader::GetOatLocationFromImageLocation(image_location.c_str());
703  std::unique_ptr<File> file(OS::OpenFileForReading(oat_filename.c_str()));
704  if (file.get() == nullptr) {
705    return false;
706  }
707  std::unique_ptr<ElfFile> elf_file(ElfFile::Open(file.release(), false, false, &error_msg));
708  if (elf_file.get() == nullptr) {
709    return false;
710  }
711  std::unique_ptr<OatFile> oat_file(OatFile::OpenWithElfFile(elf_file.release(), oat_location,
712                                                             nullptr, &error_msg));
713  if (oat_file.get() == nullptr) {
714    LOG(INFO) << "Unable to use '" << oat_filename << "' because " << error_msg;
715    return false;
716  }
717
718  for (const OatFile::OatDexFile* oat_dex_file : oat_file->GetOatDexFiles()) {
719    if (oat_dex_file == nullptr) {
720      *failures += 1;
721      continue;
722    }
723    std::unique_ptr<const DexFile> dex_file = oat_dex_file->OpenDexFile(&error_msg);
724    if (dex_file.get() == nullptr) {
725      *failures += 1;
726    } else {
727      dex_files->push_back(std::move(dex_file));
728    }
729  }
730  Runtime::Current()->GetClassLinker()->RegisterOatFile(oat_file.release());
731  return true;
732}
733
734
735static size_t OpenDexFiles(const std::vector<std::string>& dex_filenames,
736                           const std::vector<std::string>& dex_locations,
737                           const std::string& image_location,
738                           std::vector<std::unique_ptr<const DexFile>>* dex_files) {
739  DCHECK(dex_files != nullptr) << "OpenDexFiles: out-param is NULL";
740  size_t failure_count = 0;
741  if (!image_location.empty() && OpenDexFilesFromImage(image_location, dex_files, &failure_count)) {
742    return failure_count;
743  }
744  failure_count = 0;
745  for (size_t i = 0; i < dex_filenames.size(); i++) {
746    const char* dex_filename = dex_filenames[i].c_str();
747    const char* dex_location = dex_locations[i].c_str();
748    std::string error_msg;
749    if (!OS::FileExists(dex_filename)) {
750      LOG(WARNING) << "Skipping non-existent dex file '" << dex_filename << "'";
751      continue;
752    }
753    if (!DexFile::Open(dex_filename, dex_location, &error_msg, dex_files)) {
754      LOG(WARNING) << "Failed to open .dex from file '" << dex_filename << "': " << error_msg;
755      ++failure_count;
756    }
757  }
758  return failure_count;
759}
760
761bool Runtime::Init(const RuntimeOptions& raw_options, bool ignore_unrecognized) {
762  CHECK_EQ(sysconf(_SC_PAGE_SIZE), kPageSize);
763
764  MemMap::Init();
765
766  using Opt = RuntimeArgumentMap;
767  RuntimeArgumentMap runtime_options;
768  std::unique_ptr<ParsedOptions> parsed_options(
769      ParsedOptions::Create(raw_options, ignore_unrecognized, &runtime_options));
770  if (parsed_options.get() == nullptr) {
771    LOG(ERROR) << "Failed to parse options";
772    return false;
773  }
774  VLOG(startup) << "Runtime::Init -verbose:startup enabled";
775
776  QuasiAtomic::Startup();
777
778  Monitor::Init(runtime_options.GetOrDefault(Opt::LockProfThreshold),
779                runtime_options.GetOrDefault(Opt::HookIsSensitiveThread));
780
781  boot_class_path_string_ = runtime_options.ReleaseOrDefault(Opt::BootClassPath);
782  class_path_string_ = runtime_options.ReleaseOrDefault(Opt::ClassPath);
783  properties_ = runtime_options.ReleaseOrDefault(Opt::PropertiesList);
784
785  compiler_callbacks_ = runtime_options.GetOrDefault(Opt::CompilerCallbacksPtr);
786  patchoat_executable_ = runtime_options.ReleaseOrDefault(Opt::PatchOat);
787  must_relocate_ = runtime_options.GetOrDefault(Opt::Relocate);
788  is_zygote_ = runtime_options.Exists(Opt::Zygote);
789  is_explicit_gc_disabled_ = runtime_options.Exists(Opt::DisableExplicitGC);
790  dex2oat_enabled_ = runtime_options.GetOrDefault(Opt::Dex2Oat);
791  image_dex2oat_enabled_ = runtime_options.GetOrDefault(Opt::ImageDex2Oat);
792
793  vfprintf_ = runtime_options.GetOrDefault(Opt::HookVfprintf);
794  exit_ = runtime_options.GetOrDefault(Opt::HookExit);
795  abort_ = runtime_options.GetOrDefault(Opt::HookAbort);
796
797  default_stack_size_ = runtime_options.GetOrDefault(Opt::StackSize);
798  stack_trace_file_ = runtime_options.ReleaseOrDefault(Opt::StackTraceFile);
799
800  compiler_executable_ = runtime_options.ReleaseOrDefault(Opt::Compiler);
801  compiler_options_ = runtime_options.ReleaseOrDefault(Opt::CompilerOptions);
802  image_compiler_options_ = runtime_options.ReleaseOrDefault(Opt::ImageCompilerOptions);
803  image_location_ = runtime_options.GetOrDefault(Opt::Image);
804
805  max_spins_before_thin_lock_inflation_ =
806      runtime_options.GetOrDefault(Opt::MaxSpinsBeforeThinLockInflation);
807
808  monitor_list_ = new MonitorList;
809  monitor_pool_ = MonitorPool::Create();
810  thread_list_ = new ThreadList;
811  intern_table_ = new InternTable;
812
813  verify_ = runtime_options.GetOrDefault(Opt::Verify);
814  allow_dex_file_fallback_ = !runtime_options.Exists(Opt::NoDexFileFallback);
815
816  Split(runtime_options.GetOrDefault(Opt::CpuAbiList), ',', &cpu_abilist_);
817
818  if (runtime_options.GetOrDefault(Opt::Interpret)) {
819    GetInstrumentation()->ForceInterpretOnly();
820  }
821
822  zygote_max_failed_boots_ = runtime_options.GetOrDefault(Opt::ZygoteMaxFailedBoots);
823
824  XGcOption xgc_option = runtime_options.GetOrDefault(Opt::GcOption);
825  heap_ = new gc::Heap(runtime_options.GetOrDefault(Opt::MemoryInitialSize),
826                       runtime_options.GetOrDefault(Opt::HeapGrowthLimit),
827                       runtime_options.GetOrDefault(Opt::HeapMinFree),
828                       runtime_options.GetOrDefault(Opt::HeapMaxFree),
829                       runtime_options.GetOrDefault(Opt::HeapTargetUtilization),
830                       runtime_options.GetOrDefault(Opt::ForegroundHeapGrowthMultiplier),
831                       runtime_options.GetOrDefault(Opt::MemoryMaximumSize),
832                       runtime_options.GetOrDefault(Opt::NonMovingSpaceCapacity),
833                       runtime_options.GetOrDefault(Opt::Image),
834                       runtime_options.GetOrDefault(Opt::ImageInstructionSet),
835                       xgc_option.collector_type_,
836                       runtime_options.GetOrDefault(Opt::BackgroundGc),
837                       runtime_options.GetOrDefault(Opt::LargeObjectSpace),
838                       runtime_options.GetOrDefault(Opt::LargeObjectThreshold),
839                       runtime_options.GetOrDefault(Opt::ParallelGCThreads),
840                       runtime_options.GetOrDefault(Opt::ConcGCThreads),
841                       runtime_options.Exists(Opt::LowMemoryMode),
842                       runtime_options.GetOrDefault(Opt::LongPauseLogThreshold),
843                       runtime_options.GetOrDefault(Opt::LongGCLogThreshold),
844                       runtime_options.Exists(Opt::IgnoreMaxFootprint),
845                       runtime_options.GetOrDefault(Opt::UseTLAB),
846                       xgc_option.verify_pre_gc_heap_,
847                       xgc_option.verify_pre_sweeping_heap_,
848                       xgc_option.verify_post_gc_heap_,
849                       xgc_option.verify_pre_gc_rosalloc_,
850                       xgc_option.verify_pre_sweeping_rosalloc_,
851                       xgc_option.verify_post_gc_rosalloc_,
852                       runtime_options.GetOrDefault(Opt::EnableHSpaceCompactForOOM),
853                       runtime_options.GetOrDefault(Opt::HSpaceCompactForOOMMinIntervalsMs));
854
855  if (heap_->GetImageSpace() == nullptr && !allow_dex_file_fallback_) {
856    LOG(ERROR) << "Dex file fallback disabled, cannot continue without image.";
857    return false;
858  }
859
860  dump_gc_performance_on_shutdown_ = runtime_options.Exists(Opt::DumpGCPerformanceOnShutdown);
861
862  if (runtime_options.Exists(Opt::JdwpOptions)) {
863    Dbg::ConfigureJdwp(runtime_options.GetOrDefault(Opt::JdwpOptions));
864  }
865
866  jit_options_.reset(jit::JitOptions::CreateFromRuntimeArguments(runtime_options));
867  bool use_jit = jit_options_->UseJIT();
868  if (IsAotCompiler()) {
869    // If we are already the compiler at this point, we must be dex2oat. Don't create the jit in
870    // this case.
871    // If runtime_options doesn't have UseJIT set to true then CreateFromRuntimeArguments returns
872    // nullptr and we don't create the jit.
873    use_jit = false;
874  }
875
876  // Use MemMap arena pool for jit, malloc otherwise. Malloc arenas are faster to allocate but
877  // can't be trimmed as easily.
878  const bool use_malloc = !use_jit;
879  arena_pool_.reset(new ArenaPool(use_malloc, false));
880  if (IsCompiler() && Is64BitInstructionSet(kRuntimeISA)) {
881    // 4gb, no malloc. Explanation in header.
882    low_4gb_arena_pool_.reset(new ArenaPool(false, true));
883    linear_alloc_.reset(new LinearAlloc(low_4gb_arena_pool_.get()));
884  } else {
885    linear_alloc_.reset(new LinearAlloc(arena_pool_.get()));
886  }
887
888  BlockSignals();
889  InitPlatformSignalHandlers();
890
891  // Change the implicit checks flags based on runtime architecture.
892  switch (kRuntimeISA) {
893    case kArm:
894    case kThumb2:
895    case kX86:
896    case kArm64:
897    case kX86_64:
898      implicit_null_checks_ = true;
899      // Installing stack protection does not play well with valgrind.
900      implicit_so_checks_ = (RUNNING_ON_VALGRIND == 0);
901      break;
902    default:
903      // Keep the defaults.
904      break;
905  }
906
907  // Always initialize the signal chain so that any calls to sigaction get
908  // correctly routed to the next in the chain regardless of whether we
909  // have claimed the signal or not.
910  InitializeSignalChain();
911
912  if (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_) {
913    fault_manager.Init();
914
915    // These need to be in a specific order.  The null point check handler must be
916    // after the suspend check and stack overflow check handlers.
917    //
918    // Note: the instances attach themselves to the fault manager and are handled by it. The manager
919    //       will delete the instance on Shutdown().
920    if (implicit_suspend_checks_) {
921      new SuspensionHandler(&fault_manager);
922    }
923
924    if (implicit_so_checks_) {
925      new StackOverflowHandler(&fault_manager);
926    }
927
928    if (implicit_null_checks_) {
929      new NullPointerHandler(&fault_manager);
930    }
931
932    if (kEnableJavaStackTraceHandler) {
933      new JavaStackTraceHandler(&fault_manager);
934    }
935  }
936
937  java_vm_ = new JavaVMExt(this, runtime_options);
938
939  Thread::Startup();
940
941  // ClassLinker needs an attached thread, but we can't fully attach a thread without creating
942  // objects. We can't supply a thread group yet; it will be fixed later. Since we are the main
943  // thread, we do not get a java peer.
944  Thread* self = Thread::Attach("main", false, nullptr, false);
945  CHECK_EQ(self->GetThreadId(), ThreadList::kMainThreadId);
946  CHECK(self != nullptr);
947
948  // Set us to runnable so tools using a runtime can allocate and GC by default
949  self->TransitionFromSuspendedToRunnable();
950
951  // Now we're attached, we can take the heap locks and validate the heap.
952  GetHeap()->EnableObjectValidation();
953
954  CHECK_GE(GetHeap()->GetContinuousSpaces().size(), 1U);
955  class_linker_ = new ClassLinker(intern_table_);
956  if (GetHeap()->HasImageSpace()) {
957    class_linker_->InitFromImage();
958    if (kIsDebugBuild) {
959      GetHeap()->GetImageSpace()->VerifyImageAllocations();
960    }
961    if (boot_class_path_string_.empty()) {
962      // The bootclasspath is not explicitly specified: construct it from the loaded dex files.
963      const std::vector<const DexFile*>& boot_class_path = GetClassLinker()->GetBootClassPath();
964      std::vector<std::string> dex_locations;
965      dex_locations.reserve(boot_class_path.size());
966      for (const DexFile* dex_file : boot_class_path) {
967        dex_locations.push_back(dex_file->GetLocation());
968      }
969      boot_class_path_string_ = Join(dex_locations, ':');
970    }
971  } else {
972    std::vector<std::string> dex_filenames;
973    Split(boot_class_path_string_, ':', &dex_filenames);
974
975    std::vector<std::string> dex_locations;
976    if (!runtime_options.Exists(Opt::BootClassPathLocations)) {
977      dex_locations = dex_filenames;
978    } else {
979      dex_locations = runtime_options.GetOrDefault(Opt::BootClassPathLocations);
980      CHECK_EQ(dex_filenames.size(), dex_locations.size());
981    }
982
983    std::vector<std::unique_ptr<const DexFile>> boot_class_path;
984    OpenDexFiles(dex_filenames,
985                 dex_locations,
986                 runtime_options.GetOrDefault(Opt::Image),
987                 &boot_class_path);
988    instruction_set_ = runtime_options.GetOrDefault(Opt::ImageInstructionSet);
989    class_linker_->InitWithoutImage(std::move(boot_class_path));
990
991    // TODO: Should we move the following to InitWithoutImage?
992    SetInstructionSet(instruction_set_);
993    for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
994      Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i);
995      if (!HasCalleeSaveMethod(type)) {
996        SetCalleeSaveMethod(CreateCalleeSaveMethod(), type);
997      }
998    }
999  }
1000
1001  CHECK(class_linker_ != nullptr);
1002
1003  // Initialize the special sentinel_ value early.
1004  sentinel_ = GcRoot<mirror::Object>(class_linker_->AllocObject(self));
1005  CHECK(sentinel_.Read() != nullptr);
1006
1007  verifier::MethodVerifier::Init();
1008
1009  if (runtime_options.Exists(Opt::MethodTrace)) {
1010    trace_config_.reset(new TraceConfig());
1011    trace_config_->trace_file = runtime_options.ReleaseOrDefault(Opt::MethodTraceFile);
1012    trace_config_->trace_file_size = runtime_options.ReleaseOrDefault(Opt::MethodTraceFileSize);
1013    trace_config_->trace_mode = Trace::TraceMode::kMethodTracing;
1014    trace_config_->trace_output_mode = runtime_options.Exists(Opt::MethodTraceStreaming) ?
1015        Trace::TraceOutputMode::kStreaming :
1016        Trace::TraceOutputMode::kFile;
1017  }
1018
1019  {
1020    auto&& profiler_options = runtime_options.ReleaseOrDefault(Opt::ProfilerOpts);
1021    profile_output_filename_ = profiler_options.output_file_name_;
1022
1023    // TODO: Don't do this, just change ProfilerOptions to include the output file name?
1024    ProfilerOptions other_options(
1025        profiler_options.enabled_,
1026        profiler_options.period_s_,
1027        profiler_options.duration_s_,
1028        profiler_options.interval_us_,
1029        profiler_options.backoff_coefficient_,
1030        profiler_options.start_immediately_,
1031        profiler_options.top_k_threshold_,
1032        profiler_options.top_k_change_threshold_,
1033        profiler_options.profile_type_,
1034        profiler_options.max_stack_depth_);
1035
1036    profiler_options_ = other_options;
1037  }
1038
1039  // TODO: move this to just be an Trace::Start argument
1040  Trace::SetDefaultClockSource(runtime_options.GetOrDefault(Opt::ProfileClock));
1041
1042  // Pre-allocate an OutOfMemoryError for the double-OOME case.
1043  self->ThrowNewException("Ljava/lang/OutOfMemoryError;",
1044                          "OutOfMemoryError thrown while trying to throw OutOfMemoryError; "
1045                          "no stack trace available");
1046  pre_allocated_OutOfMemoryError_ = GcRoot<mirror::Throwable>(self->GetException());
1047  self->ClearException();
1048
1049  // Pre-allocate a NoClassDefFoundError for the common case of failing to find a system class
1050  // ahead of checking the application's class loader.
1051  self->ThrowNewException("Ljava/lang/NoClassDefFoundError;",
1052                          "Class not found using the boot class loader; no stack trace available");
1053  pre_allocated_NoClassDefFoundError_ = GcRoot<mirror::Throwable>(self->GetException());
1054  self->ClearException();
1055
1056  // Look for a native bridge.
1057  //
1058  // The intended flow here is, in the case of a running system:
1059  //
1060  // Runtime::Init() (zygote):
1061  //   LoadNativeBridge -> dlopen from cmd line parameter.
1062  //  |
1063  //  V
1064  // Runtime::Start() (zygote):
1065  //   No-op wrt native bridge.
1066  //  |
1067  //  | start app
1068  //  V
1069  // DidForkFromZygote(action)
1070  //   action = kUnload -> dlclose native bridge.
1071  //   action = kInitialize -> initialize library
1072  //
1073  //
1074  // The intended flow here is, in the case of a simple dalvikvm call:
1075  //
1076  // Runtime::Init():
1077  //   LoadNativeBridge -> dlopen from cmd line parameter.
1078  //  |
1079  //  V
1080  // Runtime::Start():
1081  //   DidForkFromZygote(kInitialize) -> try to initialize any native bridge given.
1082  //   No-op wrt native bridge.
1083  {
1084    std::string native_bridge_file_name = runtime_options.ReleaseOrDefault(Opt::NativeBridge);
1085    is_native_bridge_loaded_ = LoadNativeBridge(native_bridge_file_name);
1086  }
1087
1088  VLOG(startup) << "Runtime::Init exiting";
1089  return true;
1090}
1091
1092void Runtime::InitNativeMethods() {
1093  VLOG(startup) << "Runtime::InitNativeMethods entering";
1094  Thread* self = Thread::Current();
1095  JNIEnv* env = self->GetJniEnv();
1096
1097  // Must be in the kNative state for calling native methods (JNI_OnLoad code).
1098  CHECK_EQ(self->GetState(), kNative);
1099
1100  // First set up JniConstants, which is used by both the runtime's built-in native
1101  // methods and libcore.
1102  JniConstants::init(env);
1103  WellKnownClasses::Init(env);
1104
1105  // Then set up the native methods provided by the runtime itself.
1106  RegisterRuntimeNativeMethods(env);
1107
1108  // Then set up libcore, which is just a regular JNI library with a regular JNI_OnLoad.
1109  // Most JNI libraries can just use System.loadLibrary, but libcore can't because it's
1110  // the library that implements System.loadLibrary!
1111  {
1112    std::string reason;
1113    if (!java_vm_->LoadNativeLibrary(env, "libjavacore.so", nullptr, &reason)) {
1114      LOG(FATAL) << "LoadNativeLibrary failed for \"libjavacore.so\": " << reason;
1115    }
1116  }
1117
1118  // Initialize well known classes that may invoke runtime native methods.
1119  WellKnownClasses::LateInit(env);
1120
1121  VLOG(startup) << "Runtime::InitNativeMethods exiting";
1122}
1123
1124void Runtime::InitThreadGroups(Thread* self) {
1125  JNIEnvExt* env = self->GetJniEnv();
1126  ScopedJniEnvLocalRefState env_state(env);
1127  main_thread_group_ =
1128      env->NewGlobalRef(env->GetStaticObjectField(
1129          WellKnownClasses::java_lang_ThreadGroup,
1130          WellKnownClasses::java_lang_ThreadGroup_mainThreadGroup));
1131  CHECK(main_thread_group_ != NULL || IsAotCompiler());
1132  system_thread_group_ =
1133      env->NewGlobalRef(env->GetStaticObjectField(
1134          WellKnownClasses::java_lang_ThreadGroup,
1135          WellKnownClasses::java_lang_ThreadGroup_systemThreadGroup));
1136  CHECK(system_thread_group_ != NULL || IsAotCompiler());
1137}
1138
1139jobject Runtime::GetMainThreadGroup() const {
1140  CHECK(main_thread_group_ != NULL || IsAotCompiler());
1141  return main_thread_group_;
1142}
1143
1144jobject Runtime::GetSystemThreadGroup() const {
1145  CHECK(system_thread_group_ != NULL || IsAotCompiler());
1146  return system_thread_group_;
1147}
1148
1149jobject Runtime::GetSystemClassLoader() const {
1150  CHECK(system_class_loader_ != NULL || IsAotCompiler());
1151  return system_class_loader_;
1152}
1153
1154void Runtime::RegisterRuntimeNativeMethods(JNIEnv* env) {
1155  register_dalvik_system_DexFile(env);
1156  register_dalvik_system_VMDebug(env);
1157  register_dalvik_system_VMRuntime(env);
1158  register_dalvik_system_VMStack(env);
1159  register_dalvik_system_ZygoteHooks(env);
1160  register_java_lang_Class(env);
1161  register_java_lang_DexCache(env);
1162  register_java_lang_Object(env);
1163  register_java_lang_ref_FinalizerReference(env);
1164  register_java_lang_reflect_Array(env);
1165  register_java_lang_reflect_Constructor(env);
1166  register_java_lang_reflect_Field(env);
1167  register_java_lang_reflect_Method(env);
1168  register_java_lang_reflect_Proxy(env);
1169  register_java_lang_ref_Reference(env);
1170  register_java_lang_Runtime(env);
1171  register_java_lang_String(env);
1172  register_java_lang_System(env);
1173  register_java_lang_Thread(env);
1174  register_java_lang_Throwable(env);
1175  register_java_lang_VMClassLoader(env);
1176  register_java_util_concurrent_atomic_AtomicLong(env);
1177  register_org_apache_harmony_dalvik_ddmc_DdmServer(env);
1178  register_org_apache_harmony_dalvik_ddmc_DdmVmInternal(env);
1179  register_sun_misc_Unsafe(env);
1180}
1181
1182void Runtime::DumpForSigQuit(std::ostream& os) {
1183  GetClassLinker()->DumpForSigQuit(os);
1184  GetInternTable()->DumpForSigQuit(os);
1185  GetJavaVM()->DumpForSigQuit(os);
1186  GetHeap()->DumpForSigQuit(os);
1187  TrackedAllocators::Dump(os);
1188  os << "\n";
1189
1190  thread_list_->DumpForSigQuit(os);
1191  BaseMutex::DumpAll(os);
1192}
1193
1194void Runtime::DumpLockHolders(std::ostream& os) {
1195  uint64_t mutator_lock_owner = Locks::mutator_lock_->GetExclusiveOwnerTid();
1196  pid_t thread_list_lock_owner = GetThreadList()->GetLockOwner();
1197  pid_t classes_lock_owner = GetClassLinker()->GetClassesLockOwner();
1198  pid_t dex_lock_owner = GetClassLinker()->GetDexLockOwner();
1199  if ((thread_list_lock_owner | classes_lock_owner | dex_lock_owner) != 0) {
1200    os << "Mutator lock exclusive owner tid: " << mutator_lock_owner << "\n"
1201       << "ThreadList lock owner tid: " << thread_list_lock_owner << "\n"
1202       << "ClassLinker classes lock owner tid: " << classes_lock_owner << "\n"
1203       << "ClassLinker dex lock owner tid: " << dex_lock_owner << "\n";
1204  }
1205}
1206
1207void Runtime::SetStatsEnabled(bool new_state) {
1208  Thread* self = Thread::Current();
1209  MutexLock mu(self, *Locks::instrument_entrypoints_lock_);
1210  if (new_state == true) {
1211    GetStats()->Clear(~0);
1212    // TODO: wouldn't it make more sense to clear _all_ threads' stats?
1213    self->GetStats()->Clear(~0);
1214    if (stats_enabled_ != new_state) {
1215      GetInstrumentation()->InstrumentQuickAllocEntryPointsLocked();
1216    }
1217  } else if (stats_enabled_ != new_state) {
1218    GetInstrumentation()->UninstrumentQuickAllocEntryPointsLocked();
1219  }
1220  stats_enabled_ = new_state;
1221}
1222
1223void Runtime::ResetStats(int kinds) {
1224  GetStats()->Clear(kinds & 0xffff);
1225  // TODO: wouldn't it make more sense to clear _all_ threads' stats?
1226  Thread::Current()->GetStats()->Clear(kinds >> 16);
1227}
1228
1229int32_t Runtime::GetStat(int kind) {
1230  RuntimeStats* stats;
1231  if (kind < (1<<16)) {
1232    stats = GetStats();
1233  } else {
1234    stats = Thread::Current()->GetStats();
1235    kind >>= 16;
1236  }
1237  switch (kind) {
1238  case KIND_ALLOCATED_OBJECTS:
1239    return stats->allocated_objects;
1240  case KIND_ALLOCATED_BYTES:
1241    return stats->allocated_bytes;
1242  case KIND_FREED_OBJECTS:
1243    return stats->freed_objects;
1244  case KIND_FREED_BYTES:
1245    return stats->freed_bytes;
1246  case KIND_GC_INVOCATIONS:
1247    return stats->gc_for_alloc_count;
1248  case KIND_CLASS_INIT_COUNT:
1249    return stats->class_init_count;
1250  case KIND_CLASS_INIT_TIME:
1251    // Convert ns to us, reduce to 32 bits.
1252    return static_cast<int>(stats->class_init_time_ns / 1000);
1253  case KIND_EXT_ALLOCATED_OBJECTS:
1254  case KIND_EXT_ALLOCATED_BYTES:
1255  case KIND_EXT_FREED_OBJECTS:
1256  case KIND_EXT_FREED_BYTES:
1257    return 0;  // backward compatibility
1258  default:
1259    LOG(FATAL) << "Unknown statistic " << kind;
1260    return -1;  // unreachable
1261  }
1262}
1263
1264void Runtime::BlockSignals() {
1265  SignalSet signals;
1266  signals.Add(SIGPIPE);
1267  // SIGQUIT is used to dump the runtime's state (including stack traces).
1268  signals.Add(SIGQUIT);
1269  // SIGUSR1 is used to initiate a GC.
1270  signals.Add(SIGUSR1);
1271  signals.Block();
1272}
1273
1274bool Runtime::AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group,
1275                                  bool create_peer) {
1276  return Thread::Attach(thread_name, as_daemon, thread_group, create_peer) != NULL;
1277}
1278
1279void Runtime::DetachCurrentThread() {
1280  Thread* self = Thread::Current();
1281  if (self == NULL) {
1282    LOG(FATAL) << "attempting to detach thread that is not attached";
1283  }
1284  if (self->HasManagedStack()) {
1285    LOG(FATAL) << *Thread::Current() << " attempting to detach while still running code";
1286  }
1287  thread_list_->Unregister(self);
1288}
1289
1290mirror::Throwable* Runtime::GetPreAllocatedOutOfMemoryError() {
1291  mirror::Throwable* oome = pre_allocated_OutOfMemoryError_.Read();
1292  if (oome == nullptr) {
1293    LOG(ERROR) << "Failed to return pre-allocated OOME";
1294  }
1295  return oome;
1296}
1297
1298mirror::Throwable* Runtime::GetPreAllocatedNoClassDefFoundError() {
1299  mirror::Throwable* ncdfe = pre_allocated_NoClassDefFoundError_.Read();
1300  if (ncdfe == nullptr) {
1301    LOG(ERROR) << "Failed to return pre-allocated NoClassDefFoundError";
1302  }
1303  return ncdfe;
1304}
1305
1306void Runtime::VisitConstantRoots(RootVisitor* visitor) {
1307  // Visit the classes held as static in mirror classes, these can be visited concurrently and only
1308  // need to be visited once per GC since they never change.
1309  mirror::ArtMethod::VisitRoots(visitor);
1310  mirror::Class::VisitRoots(visitor);
1311  mirror::Reference::VisitRoots(visitor);
1312  mirror::StackTraceElement::VisitRoots(visitor);
1313  mirror::String::VisitRoots(visitor);
1314  mirror::Throwable::VisitRoots(visitor);
1315  mirror::Field::VisitRoots(visitor);
1316  // Visit all the primitive array types classes.
1317  mirror::PrimitiveArray<uint8_t>::VisitRoots(visitor);   // BooleanArray
1318  mirror::PrimitiveArray<int8_t>::VisitRoots(visitor);    // ByteArray
1319  mirror::PrimitiveArray<uint16_t>::VisitRoots(visitor);  // CharArray
1320  mirror::PrimitiveArray<double>::VisitRoots(visitor);    // DoubleArray
1321  mirror::PrimitiveArray<float>::VisitRoots(visitor);     // FloatArray
1322  mirror::PrimitiveArray<int32_t>::VisitRoots(visitor);   // IntArray
1323  mirror::PrimitiveArray<int64_t>::VisitRoots(visitor);   // LongArray
1324  mirror::PrimitiveArray<int16_t>::VisitRoots(visitor);   // ShortArray
1325}
1326
1327void Runtime::VisitConcurrentRoots(RootVisitor* visitor, VisitRootFlags flags) {
1328  intern_table_->VisitRoots(visitor, flags);
1329  class_linker_->VisitRoots(visitor, flags);
1330  if ((flags & kVisitRootFlagNewRoots) == 0) {
1331    // Guaranteed to have no new roots in the constant roots.
1332    VisitConstantRoots(visitor);
1333  }
1334}
1335
1336void Runtime::VisitTransactionRoots(RootVisitor* visitor) {
1337  if (preinitialization_transaction_ != nullptr) {
1338    preinitialization_transaction_->VisitRoots(visitor);
1339  }
1340}
1341
1342void Runtime::VisitNonThreadRoots(RootVisitor* visitor) {
1343  java_vm_->VisitRoots(visitor);
1344  sentinel_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1345  pre_allocated_OutOfMemoryError_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1346  resolution_method_.VisitRoot(visitor, RootInfo(kRootVMInternal));
1347  pre_allocated_NoClassDefFoundError_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1348  imt_conflict_method_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1349  imt_unimplemented_method_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1350  default_imt_.VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1351  for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
1352    callee_save_methods_[i].VisitRootIfNonNull(visitor, RootInfo(kRootVMInternal));
1353  }
1354  verifier::MethodVerifier::VisitStaticRoots(visitor);
1355  VisitTransactionRoots(visitor);
1356  instrumentation_.VisitRoots(visitor);
1357}
1358
1359void Runtime::VisitNonConcurrentRoots(RootVisitor* visitor) {
1360  thread_list_->VisitRoots(visitor);
1361  VisitNonThreadRoots(visitor);
1362}
1363
1364void Runtime::VisitThreadRoots(RootVisitor* visitor) {
1365  thread_list_->VisitRoots(visitor);
1366}
1367
1368size_t Runtime::FlipThreadRoots(Closure* thread_flip_visitor, Closure* flip_callback,
1369                                gc::collector::GarbageCollector* collector) {
1370  return thread_list_->FlipThreadRoots(thread_flip_visitor, flip_callback, collector);
1371}
1372
1373void Runtime::VisitRoots(RootVisitor* visitor, VisitRootFlags flags) {
1374  VisitNonConcurrentRoots(visitor);
1375  VisitConcurrentRoots(visitor, flags);
1376}
1377
1378void Runtime::VisitImageRoots(RootVisitor* visitor) {
1379  for (auto* space : GetHeap()->GetContinuousSpaces()) {
1380    if (space->IsImageSpace()) {
1381      auto* image_space = space->AsImageSpace();
1382      const auto& image_header = image_space->GetImageHeader();
1383      for (size_t i = 0; i < ImageHeader::kImageRootsMax; ++i) {
1384        auto* obj = image_header.GetImageRoot(static_cast<ImageHeader::ImageRoot>(i));
1385        if (obj != nullptr) {
1386          auto* after_obj = obj;
1387          visitor->VisitRoot(&after_obj, RootInfo(kRootStickyClass));
1388          CHECK_EQ(after_obj, obj);
1389        }
1390      }
1391    }
1392  }
1393}
1394
1395mirror::ObjectArray<mirror::ArtMethod>* Runtime::CreateDefaultImt(ClassLinker* cl) {
1396  Thread* self = Thread::Current();
1397  StackHandleScope<1> hs(self);
1398  Handle<mirror::ObjectArray<mirror::ArtMethod>> imtable(
1399      hs.NewHandle(cl->AllocArtMethodArray(self, 64)));
1400  mirror::ArtMethod* imt_conflict_method = Runtime::Current()->GetImtConflictMethod();
1401  for (size_t i = 0; i < static_cast<size_t>(imtable->GetLength()); i++) {
1402    imtable->Set<false>(i, imt_conflict_method);
1403  }
1404  return imtable.Get();
1405}
1406
1407mirror::ArtMethod* Runtime::CreateImtConflictMethod() {
1408  Thread* self = Thread::Current();
1409  Runtime* runtime = Runtime::Current();
1410  ClassLinker* class_linker = runtime->GetClassLinker();
1411  StackHandleScope<1> hs(self);
1412  Handle<mirror::ArtMethod> method(hs.NewHandle(class_linker->AllocArtMethod(self)));
1413  method->SetDeclaringClass(mirror::ArtMethod::GetJavaLangReflectArtMethod());
1414  // TODO: use a special method for imt conflict method saves.
1415  method->SetDexMethodIndex(DexFile::kDexNoIndex);
1416  // When compiling, the code pointer will get set later when the image is loaded.
1417  if (runtime->IsAotCompiler()) {
1418    size_t pointer_size = GetInstructionSetPointerSize(instruction_set_);
1419    method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size);
1420  } else {
1421    method->SetEntryPointFromQuickCompiledCode(GetQuickImtConflictStub());
1422  }
1423  return method.Get();
1424}
1425
1426void Runtime::SetImtConflictMethod(mirror::ArtMethod* method) {
1427  imt_conflict_method_ = GcRoot<mirror::ArtMethod>(method);
1428}
1429
1430mirror::ArtMethod* Runtime::CreateResolutionMethod() {
1431  Thread* self = Thread::Current();
1432  Runtime* runtime = Runtime::Current();
1433  ClassLinker* class_linker = runtime->GetClassLinker();
1434  StackHandleScope<1> hs(self);
1435  Handle<mirror::ArtMethod> method(hs.NewHandle(class_linker->AllocArtMethod(self)));
1436  method->SetDeclaringClass(mirror::ArtMethod::GetJavaLangReflectArtMethod());
1437  // TODO: use a special method for resolution method saves
1438  method->SetDexMethodIndex(DexFile::kDexNoIndex);
1439  // When compiling, the code pointer will get set later when the image is loaded.
1440  if (runtime->IsAotCompiler()) {
1441    size_t pointer_size = GetInstructionSetPointerSize(instruction_set_);
1442    method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size);
1443  } else {
1444    method->SetEntryPointFromQuickCompiledCode(GetQuickResolutionStub());
1445  }
1446  return method.Get();
1447}
1448
1449mirror::ArtMethod* Runtime::CreateCalleeSaveMethod() {
1450  Thread* self = Thread::Current();
1451  Runtime* runtime = Runtime::Current();
1452  ClassLinker* class_linker = runtime->GetClassLinker();
1453  StackHandleScope<1> hs(self);
1454  Handle<mirror::ArtMethod> method(hs.NewHandle(class_linker->AllocArtMethod(self)));
1455  method->SetDeclaringClass(mirror::ArtMethod::GetJavaLangReflectArtMethod());
1456  // TODO: use a special method for callee saves
1457  method->SetDexMethodIndex(DexFile::kDexNoIndex);
1458  size_t pointer_size = GetInstructionSetPointerSize(instruction_set_);
1459  method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size);
1460  DCHECK_NE(instruction_set_, kNone);
1461  return method.Get();
1462}
1463
1464void Runtime::DisallowNewSystemWeaks() {
1465  monitor_list_->DisallowNewMonitors();
1466  intern_table_->DisallowNewInterns();
1467  java_vm_->DisallowNewWeakGlobals();
1468}
1469
1470void Runtime::AllowNewSystemWeaks() {
1471  monitor_list_->AllowNewMonitors();
1472  intern_table_->AllowNewInterns();
1473  java_vm_->AllowNewWeakGlobals();
1474}
1475
1476void Runtime::EnsureNewSystemWeaksDisallowed() {
1477  // Lock and unlock the system weak locks once to ensure that no
1478  // threads are still in the middle of adding new system weaks.
1479  monitor_list_->EnsureNewMonitorsDisallowed();
1480  intern_table_->EnsureNewInternsDisallowed();
1481  java_vm_->EnsureNewWeakGlobalsDisallowed();
1482}
1483
1484void Runtime::SetInstructionSet(InstructionSet instruction_set) {
1485  instruction_set_ = instruction_set;
1486  if ((instruction_set_ == kThumb2) || (instruction_set_ == kArm)) {
1487    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1488      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1489      callee_save_method_frame_infos_[i] = arm::ArmCalleeSaveMethodFrameInfo(type);
1490    }
1491  } else if (instruction_set_ == kMips) {
1492    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1493      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1494      callee_save_method_frame_infos_[i] = mips::MipsCalleeSaveMethodFrameInfo(type);
1495    }
1496  } else if (instruction_set_ == kMips64) {
1497    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1498      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1499      callee_save_method_frame_infos_[i] = mips64::Mips64CalleeSaveMethodFrameInfo(type);
1500    }
1501  } else if (instruction_set_ == kX86) {
1502    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1503      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1504      callee_save_method_frame_infos_[i] = x86::X86CalleeSaveMethodFrameInfo(type);
1505    }
1506  } else if (instruction_set_ == kX86_64) {
1507    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1508      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1509      callee_save_method_frame_infos_[i] = x86_64::X86_64CalleeSaveMethodFrameInfo(type);
1510    }
1511  } else if (instruction_set_ == kArm64) {
1512    for (int i = 0; i != kLastCalleeSaveType; ++i) {
1513      CalleeSaveType type = static_cast<CalleeSaveType>(i);
1514      callee_save_method_frame_infos_[i] = arm64::Arm64CalleeSaveMethodFrameInfo(type);
1515    }
1516  } else {
1517    UNIMPLEMENTED(FATAL) << instruction_set_;
1518  }
1519}
1520
1521void Runtime::SetCalleeSaveMethod(mirror::ArtMethod* method, CalleeSaveType type) {
1522  DCHECK_LT(static_cast<int>(type), static_cast<int>(kLastCalleeSaveType));
1523  callee_save_methods_[type] = GcRoot<mirror::ArtMethod>(method);
1524}
1525
1526void Runtime::StartProfiler(const char* profile_output_filename) {
1527  profile_output_filename_ = profile_output_filename;
1528  profiler_started_ =
1529    BackgroundMethodSamplingProfiler::Start(profile_output_filename_, profiler_options_);
1530}
1531
1532// Transaction support.
1533void Runtime::EnterTransactionMode(Transaction* transaction) {
1534  DCHECK(IsAotCompiler());
1535  DCHECK(transaction != nullptr);
1536  DCHECK(!IsActiveTransaction());
1537  preinitialization_transaction_ = transaction;
1538}
1539
1540void Runtime::ExitTransactionMode() {
1541  DCHECK(IsAotCompiler());
1542  DCHECK(IsActiveTransaction());
1543  preinitialization_transaction_ = nullptr;
1544}
1545
1546
1547bool Runtime::IsTransactionAborted() const {
1548  if (!IsActiveTransaction()) {
1549    return false;
1550  } else {
1551    DCHECK(IsAotCompiler());
1552    return preinitialization_transaction_->IsAborted();
1553  }
1554}
1555
1556void Runtime::AbortTransactionAndThrowAbortError(Thread* self, const std::string& abort_message) {
1557  DCHECK(IsAotCompiler());
1558  DCHECK(IsActiveTransaction());
1559  // Throwing an exception may cause its class initialization. If we mark the transaction
1560  // aborted before that, we may warn with a false alarm. Throwing the exception before
1561  // marking the transaction aborted avoids that.
1562  preinitialization_transaction_->ThrowAbortError(self, false);
1563  preinitialization_transaction_->Abort(abort_message);
1564}
1565
1566void Runtime::ThrowTransactionAbortError(Thread* self) {
1567  DCHECK(IsAotCompiler());
1568  DCHECK(IsActiveTransaction());
1569  preinitialization_transaction_->ThrowAbortError(self, true);
1570}
1571
1572void Runtime::RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset,
1573                                      uint8_t value, bool is_volatile) const {
1574  DCHECK(IsAotCompiler());
1575  DCHECK(IsActiveTransaction());
1576  preinitialization_transaction_->RecordWriteFieldBoolean(obj, field_offset, value, is_volatile);
1577}
1578
1579void Runtime::RecordWriteFieldByte(mirror::Object* obj, MemberOffset field_offset,
1580                                   int8_t value, bool is_volatile) const {
1581  DCHECK(IsAotCompiler());
1582  DCHECK(IsActiveTransaction());
1583  preinitialization_transaction_->RecordWriteFieldByte(obj, field_offset, value, is_volatile);
1584}
1585
1586void Runtime::RecordWriteFieldChar(mirror::Object* obj, MemberOffset field_offset,
1587                                   uint16_t value, bool is_volatile) const {
1588  DCHECK(IsAotCompiler());
1589  DCHECK(IsActiveTransaction());
1590  preinitialization_transaction_->RecordWriteFieldChar(obj, field_offset, value, is_volatile);
1591}
1592
1593void Runtime::RecordWriteFieldShort(mirror::Object* obj, MemberOffset field_offset,
1594                                    int16_t value, bool is_volatile) const {
1595  DCHECK(IsAotCompiler());
1596  DCHECK(IsActiveTransaction());
1597  preinitialization_transaction_->RecordWriteFieldShort(obj, field_offset, value, is_volatile);
1598}
1599
1600void Runtime::RecordWriteField32(mirror::Object* obj, MemberOffset field_offset,
1601                                 uint32_t value, bool is_volatile) const {
1602  DCHECK(IsAotCompiler());
1603  DCHECK(IsActiveTransaction());
1604  preinitialization_transaction_->RecordWriteField32(obj, field_offset, value, is_volatile);
1605}
1606
1607void Runtime::RecordWriteField64(mirror::Object* obj, MemberOffset field_offset,
1608                                 uint64_t value, bool is_volatile) const {
1609  DCHECK(IsAotCompiler());
1610  DCHECK(IsActiveTransaction());
1611  preinitialization_transaction_->RecordWriteField64(obj, field_offset, value, is_volatile);
1612}
1613
1614void Runtime::RecordWriteFieldReference(mirror::Object* obj, MemberOffset field_offset,
1615                                        mirror::Object* value, bool is_volatile) const {
1616  DCHECK(IsAotCompiler());
1617  DCHECK(IsActiveTransaction());
1618  preinitialization_transaction_->RecordWriteFieldReference(obj, field_offset, value, is_volatile);
1619}
1620
1621void Runtime::RecordWriteArray(mirror::Array* array, size_t index, uint64_t value) const {
1622  DCHECK(IsAotCompiler());
1623  DCHECK(IsActiveTransaction());
1624  preinitialization_transaction_->RecordWriteArray(array, index, value);
1625}
1626
1627void Runtime::RecordStrongStringInsertion(mirror::String* s) const {
1628  DCHECK(IsAotCompiler());
1629  DCHECK(IsActiveTransaction());
1630  preinitialization_transaction_->RecordStrongStringInsertion(s);
1631}
1632
1633void Runtime::RecordWeakStringInsertion(mirror::String* s) const {
1634  DCHECK(IsAotCompiler());
1635  DCHECK(IsActiveTransaction());
1636  preinitialization_transaction_->RecordWeakStringInsertion(s);
1637}
1638
1639void Runtime::RecordStrongStringRemoval(mirror::String* s) const {
1640  DCHECK(IsAotCompiler());
1641  DCHECK(IsActiveTransaction());
1642  preinitialization_transaction_->RecordStrongStringRemoval(s);
1643}
1644
1645void Runtime::RecordWeakStringRemoval(mirror::String* s) const {
1646  DCHECK(IsAotCompiler());
1647  DCHECK(IsActiveTransaction());
1648  preinitialization_transaction_->RecordWeakStringRemoval(s);
1649}
1650
1651void Runtime::SetFaultMessage(const std::string& message) {
1652  MutexLock mu(Thread::Current(), fault_message_lock_);
1653  fault_message_ = message;
1654}
1655
1656void Runtime::AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* argv)
1657    const {
1658  if (GetInstrumentation()->InterpretOnly() || UseJit()) {
1659    argv->push_back("--compiler-filter=interpret-only");
1660  }
1661
1662  // Make the dex2oat instruction set match that of the launching runtime. If we have multiple
1663  // architecture support, dex2oat may be compiled as a different instruction-set than that
1664  // currently being executed.
1665  std::string instruction_set("--instruction-set=");
1666  instruction_set += GetInstructionSetString(kRuntimeISA);
1667  argv->push_back(instruction_set);
1668
1669  std::unique_ptr<const InstructionSetFeatures> features(InstructionSetFeatures::FromCppDefines());
1670  std::string feature_string("--instruction-set-features=");
1671  feature_string += features->GetFeatureString();
1672  argv->push_back(feature_string);
1673
1674  if (Dbg::IsJdwpConfigured()) {
1675    argv->push_back("--debuggable");
1676  }
1677}
1678
1679void Runtime::UpdateProfilerState(int state) {
1680  VLOG(profiler) << "Profiler state updated to " << state;
1681}
1682
1683void Runtime::CreateJit() {
1684  CHECK(!IsAotCompiler());
1685  if (GetInstrumentation()->IsForcedInterpretOnly()) {
1686    // Don't create JIT if forced interpret only.
1687    return;
1688  }
1689  std::string error_msg;
1690  jit_.reset(jit::Jit::Create(jit_options_.get(), &error_msg));
1691  if (jit_.get() != nullptr) {
1692    compiler_callbacks_ = jit_->GetCompilerCallbacks();
1693    jit_->CreateInstrumentationCache(jit_options_->GetCompileThreshold());
1694    jit_->CreateThreadPool();
1695  } else {
1696    LOG(WARNING) << "Failed to create JIT " << error_msg;
1697  }
1698}
1699
1700bool Runtime::CanRelocate() const {
1701  return !IsAotCompiler() || compiler_callbacks_->IsRelocationPossible();
1702}
1703
1704bool Runtime::IsCompilingBootImage() const {
1705  return IsCompiler() && compiler_callbacks_->IsBootImage();
1706}
1707
1708}  // namespace art
1709