[vm] Address various quirks observed in Fuchsia profiling samples.

 - Don't waste time scrubbing or qualifying function metadata names.
 - Don't waste time scrubbing or lib qualifying function names for timeline events.
 - Give intrinsic functions a grace usage counter.
 - Fix wrong flag guarding stack overflow name-based slow paths.

Change-Id: Ib78e7e4f8de51208266190fff2d1f7eb8d80c329
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97174
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 65791e4..df7618f 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -303,9 +303,8 @@
     return Object::null();
   }
   // Prevent premature code collection due to major GC during startup.
-  const intptr_t kFakeInitialUsage = 32;
-  if (function.usage_counter() < kFakeInitialUsage) {
-    function.set_usage_counter(kFakeInitialUsage);
+  if (function.usage_counter() < Function::kGraceUsageCounter) {
+    function.set_usage_counter(Function::kGraceUsageCounter);
   }
   return Compiler::CompileFunction(thread_, function);
 }
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 52dd77c..722ab12 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -419,6 +419,12 @@
   }
 #endif  // !defined(PRODUCT)
 
+  if (function.is_intrinsic() &&
+      (function.usage_counter() < Function::kGraceUsageCounter)) {
+    // Intrinsic functions may execute without incrementing their usage counter.
+    // Give them a non-zero initial usage to prevent premature code collection.
+    function.set_usage_counter(Function::kGraceUsageCounter);
+  }
   if (!function.IsOptimizable()) {
     // A function with huge unoptimized code can become non-optimizable
     // after generating unoptimized code.
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3cae1d4..8d2c158 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9749,7 +9749,7 @@
   GrowableHandlePtrArray<const String> pieces(zone, 3);
   pieces.Add(cname);
   pieces.Add(Symbols::At());
-  pieces.Add(String::Handle(field.name()));
+  pieces.Add(String::Handle(zone, field.name()));
   return Symbols::FromConcatAll(thread, pieces);
 }
 
@@ -9762,7 +9762,7 @@
   GrowableHandlePtrArray<const String> pieces(zone, 3);
   pieces.Add(cname);
   pieces.Add(Symbols::At());
-  pieces.Add(String::Handle(func.QualifiedScrubbedName()));
+  pieces.Add(String::Handle(zone, func.name()));
   return Symbols::FromConcatAll(thread, pieces);
 }
 
@@ -9776,7 +9776,7 @@
   GrowableHandlePtrArray<const String> pieces(zone, 3);
   pieces.Add(cname);
   pieces.Add(Symbols::At());
-  pieces.Add(String::Handle(param.name()));
+  pieces.Add(String::Handle(zone, param.name()));
   return Symbols::FromConcatAll(thread, pieces);
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 798331a..df88871 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1954,6 +1954,9 @@
 
 class Function : public Object {
  public:
+  // A value to prevent premature code collection. lg(32) = 5 major GCs.
+  static constexpr intptr_t kGraceUsageCounter = 32;
+
   RawString* name() const { return raw_ptr()->name_; }
   RawString* UserVisibleName() const;  // Same as scrubbed name.
   RawString* QualifiedScrubbedName() const {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 8e90333..e08bd90 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1838,7 +1838,7 @@
     }
   }
   if ((FLAG_deoptimize_filter != NULL) || (FLAG_stacktrace_filter != NULL) ||
-      FLAG_reload_every_optimized) {
+      FLAG_reload_every) {
     DartFrameIterator iterator(thread,
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 1d1462a..37e5af9 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -457,8 +457,7 @@
   TimelineDurationScope tds(thread, Timeline::GetCompilerStream(), name);      \
   if (tds.enabled()) {                                                         \
     tds.SetNumArguments(1);                                                    \
-    tds.CopyArgument(0, "function",                                            \
-                     function.ToLibNamePrefixedQualifiedCString());            \
+    tds.CopyArgument(0, "function", function.ToQualifiedCString());            \
   }
 
 #define TIMELINE_FUNCTION_GC_DURATION(thread, name)                            \