ART: Add debuggable compiler flag

Add a flag to compiler options that shows debuggability.

Change-Id: Id17ec72babe2ee88713a0d274eff86508de30666
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc
index 09ec9a2..067e1bd 100644
--- a/compiler/driver/compiler_options.cc
+++ b/compiler/driver/compiler_options.cc
@@ -30,6 +30,7 @@
       generate_gdb_information_(false),
       include_patch_information_(kDefaultIncludePatchInformation),
       top_k_profile_threshold_(kDefaultTopKProfileThreshold),
+      debuggable_(false),
       include_debug_symbols_(kDefaultIncludeDebugSymbols),
       implicit_null_checks_(true),
       implicit_so_checks_(true),
@@ -49,6 +50,7 @@
                                  bool generate_gdb_information,
                                  bool include_patch_information,
                                  double top_k_profile_threshold,
+                                 bool debuggable,
                                  bool include_debug_symbols,
                                  bool implicit_null_checks,
                                  bool implicit_so_checks,
@@ -67,6 +69,7 @@
     generate_gdb_information_(generate_gdb_information),
     include_patch_information_(include_patch_information),
     top_k_profile_threshold_(top_k_profile_threshold),
+    debuggable_(debuggable),
     include_debug_symbols_(include_debug_symbols),
     implicit_null_checks_(implicit_null_checks),
     implicit_so_checks_(implicit_so_checks),
diff --git a/compiler/driver/compiler_options.h b/compiler/driver/compiler_options.h
index 122ae4b..8ae2edf 100644
--- a/compiler/driver/compiler_options.h
+++ b/compiler/driver/compiler_options.h
@@ -66,6 +66,7 @@
                   bool generate_gdb_information,
                   bool include_patch_information,
                   double top_k_profile_threshold,
+                  bool debuggable,
                   bool include_debug_symbols,
                   bool implicit_null_checks,
                   bool implicit_so_checks,
@@ -132,6 +133,10 @@
     return top_k_profile_threshold_;
   }
 
+  bool GetDebuggable() const {
+    return debuggable_;
+  }
+
   bool GetIncludeDebugSymbols() const {
     return include_debug_symbols_;
   }
@@ -193,6 +198,7 @@
   const bool include_patch_information_;
   // When using a profile file only the top K% of the profiled samples will be compiled.
   const double top_k_profile_threshold_;
+  const bool debuggable_;
   const bool include_debug_symbols_;
   const bool implicit_null_checks_;
   const bool implicit_so_checks_;
diff --git a/compiler/jit/jit_compiler.cc b/compiler/jit/jit_compiler.cc
index 0283791..ff98d4a 100644
--- a/compiler/jit/jit_compiler.cc
+++ b/compiler/jit/jit_compiler.cc
@@ -72,6 +72,7 @@
       false,
       false,
       CompilerOptions::kDefaultTopKProfileThreshold,
+      false,  // TODO: Think about debuggability of JIT-compiled code.
       false,
       false,
       false,
diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc
index 22665ea..4460523 100644
--- a/dex2oat/dex2oat.cc
+++ b/dex2oat/dex2oat.cc
@@ -491,6 +491,7 @@
     // Profile file to use
     double top_k_profile_threshold = CompilerOptions::kDefaultTopKProfileThreshold;
 
+    bool debuggable = false;
     bool include_patch_information = CompilerOptions::kDefaultIncludePatchInformation;
     bool include_debug_symbols = kIsDebugBuild;
     bool watch_dog_enabled = true;
@@ -679,6 +680,8 @@
       } else if (option == "--no-include-debug-symbols" || option == "--strip-symbols") {
         include_debug_symbols = false;
         generate_gdb_information = false;  // Depends on debug symbols, see above.
+      } else if (option == "--debuggable") {
+        debuggable = true;
       } else if (option.starts_with("--profile-file=")) {
         profile_file_ = option.substr(strlen("--profile-file=")).data();
         VLOG(compiler) << "dex2oat: profile file is " << profile_file_;
@@ -926,6 +929,10 @@
         break;
     }
 
+    if (debuggable) {
+      // TODO: Consider adding CFI info and symbols here.
+    }
+
     compiler_options_.reset(new CompilerOptions(compiler_filter,
                                                 huge_method_threshold,
                                                 large_method_threshold,
@@ -935,6 +942,7 @@
                                                 generate_gdb_information,
                                                 include_patch_information,
                                                 top_k_profile_threshold,
+                                                debuggable,
                                                 include_debug_symbols,
                                                 implicit_null_checks,
                                                 implicit_so_checks,
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 383308c..6d9f20e 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1674,6 +1674,10 @@
   std::string feature_string("--instruction-set-features=");
   feature_string += features->GetFeatureString();
   argv->push_back(feature_string);
+
+  if (Dbg::IsJdwpConfigured()) {
+    argv->push_back("--debuggable");
+  }
 }
 
 void Runtime::UpdateProfilerState(int state) {