ART: Add VerboseMethods to optimizing compiler

Bring the optimizing compiler up to Quick levels for debuggability.

Change-Id: Ib2adce7a31cc6a60c37c63d0df5cb6a35a85e790
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 710d3bc..b8ce04e 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -86,7 +86,7 @@
  * Filter to apply to the visualizer. Methods whose name contain that filter will
  * be dumped.
  */
-static const char* kStringFilter = "";
+static constexpr const char kStringFilter[] = "";
 
 class PassScope;
 
@@ -105,12 +105,14 @@
         visualizer_enabled_(!compiler_driver->GetDumpCfgFileName().empty()),
         visualizer_(visualizer_output, graph, *codegen),
         graph_in_bad_state_(false) {
-    if (strstr(method_name, kStringFilter) == nullptr) {
-      timing_logger_enabled_ = visualizer_enabled_ = false;
-    }
-    if (visualizer_enabled_) {
-      visualizer_.PrintHeader(method_name_);
-      codegen->SetDisassemblyInformation(&disasm_info_);
+    if (timing_logger_enabled_ || visualizer_enabled_) {
+      if (!IsVerboseMethod(compiler_driver, method_name)) {
+        timing_logger_enabled_ = visualizer_enabled_ = false;
+      }
+      if (visualizer_enabled_) {
+        visualizer_.PrintHeader(method_name_);
+        codegen->SetDisassemblyInformation(&disasm_info_);
+      }
     }
   }
 
@@ -169,6 +171,23 @@
     }
   }
 
+  static bool IsVerboseMethod(CompilerDriver* compiler_driver, const char* method_name) {
+    // Test an exact match to --verbose-methods. If verbose-methods is set, this overrides an
+    // empty kStringFilter matching all methods.
+    if (compiler_driver->GetCompilerOptions().HasVerboseMethods()) {
+      return compiler_driver->GetCompilerOptions().IsVerboseMethod(method_name);
+    }
+
+    // Test the kStringFilter sub-string. constexpr helper variable to silence unreachable-code
+    // warning when the string is empty.
+    constexpr bool kStringFilterEmpty = arraysize(kStringFilter) <= 1;
+    if (kStringFilterEmpty || strstr(method_name, kStringFilter) != nullptr) {
+      return true;
+    }
+
+    return false;
+  }
+
   HGraph* const graph_;
   const char* method_name_;