Version 2.1.0-dev.9.4

Cherry-pick e23acaaf90996b84548ea23af14730ff1a21d826 to dev
Cherry-pick e6d3a45b6a98ea36581ac375ec5cdd63dd829004 to dev
Cherry-pick a40fd6a976d3d3bc341cd2e0f7fb290b7819a52a to dev
Cherry-pick 9eb1d748819530bb3eb2f78699e0968de8b638fe to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54bc2bc..6ef0c56 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+# 2.1.0-dev.9.4
+
+Cherry-pick e23acaaf90996b84548ea23af14730ff1a21d826 to dev
+
+Cherry-pick e6d3a45b6a98ea36581ac375ec5cdd63dd829004 to dev
+
+Cherry-pick a40fd6a976d3d3bc341cd2e0f7fb290b7819a52a to dev
+
+Cherry-pick 9eb1d748819530bb3eb2f78699e0968de8b638fe to dev
+
 # 2.1.0-dev.9.3
 
 Cherry-pick 65951ef5080bcfa7d8862685e96f75c2c5d17841 to dev
diff --git a/pkg/vm/bin/dump_kernel.dart b/pkg/vm/bin/dump_kernel.dart
index f49a332..6a6b448 100644
--- a/pkg/vm/bin/dump_kernel.dart
+++ b/pkg/vm/bin/dump_kernel.dart
@@ -16,7 +16,6 @@
     show ProcedureAttributesMetadataRepository;
 import 'package:vm/metadata/unreachable.dart'
     show UnreachableNodeMetadataRepository;
-
 import 'package:vm/metadata/call_site_attributes.dart'
     show CallSiteAttributesMetadataRepository;
 
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 31cf8b6..03c4a51 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -37,6 +37,8 @@
     as no_dynamic_invocations_annotator show transformComponent;
 import 'transformations/type_flow/transformer.dart' as globalTypeFlow
     show transformComponent;
+import 'transformations/obfuscation_prohibitions_annotator.dart'
+    as obfuscationProhibitions;
 
 /// Generates a kernel representation of the program whose main library is in
 /// the given [source]. Intended for whole program (non-modular) compilation.
@@ -140,6 +142,10 @@
     devirtualization.transformComponent(coreTypes, component);
     no_dynamic_invocations_annotator.transformComponent(component);
   }
+
+  // We don't know yet whether gen_snapshot will want to do obfuscation, but if
+  // it does it will need the obfuscation prohibitions.
+  obfuscationProhibitions.transformComponent(component, coreTypes);
 }
 
 /// Runs given [action] with [CompilerContext]. This is needed to
diff --git a/pkg/vm/lib/metadata/obfuscation_prohibitions.dart b/pkg/vm/lib/metadata/obfuscation_prohibitions.dart
new file mode 100644
index 0000000..f2b71e8
--- /dev/null
+++ b/pkg/vm/lib/metadata/obfuscation_prohibitions.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.metadata.obfuscation_prohibitions;
+
+import 'package:kernel/ast.dart';
+
+class ObfuscationProhibitionsMetadata {
+  final Set<String> protectedNames = Set<String>();
+
+  ObfuscationProhibitionsMetadata();
+
+  @override
+  String toString() => protectedNames.toString();
+}
+
+/// Repository for [ObfuscationProhibitionsMetadata].
+class ObfuscationProhibitionsMetadataRepository
+    extends MetadataRepository<ObfuscationProhibitionsMetadata> {
+  static final repositoryTag = 'vm.obfuscation-prohibitions.metadata';
+
+  @override
+  final String tag = repositoryTag;
+
+  @override
+  final Map<TreeNode, ObfuscationProhibitionsMetadata> mapping =
+      <TreeNode, ObfuscationProhibitionsMetadata>{};
+
+  @override
+  void writeToBinary(
+      ObfuscationProhibitionsMetadata metadata, Node node, BinarySink sink) {
+    sink.writeUInt32(metadata.protectedNames.length);
+    for (String name in metadata.protectedNames) {
+      sink.writeStringReference(name);
+    }
+  }
+
+  @override
+  ObfuscationProhibitionsMetadata readFromBinary(
+      Node node, BinarySource source) {
+    final metadata = ObfuscationProhibitionsMetadata();
+    int length = source.readUint32();
+    for (int i = 0; i < length; ++i) {
+      metadata.protectedNames.add(source.readStringReference());
+    }
+    return metadata;
+  }
+}
diff --git a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
new file mode 100644
index 0000000..8ff744d
--- /dev/null
+++ b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.transformations.obfuscation_prohibitions_annotator;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import '../metadata/obfuscation_prohibitions.dart';
+import 'pragma.dart';
+
+void transformComponent(Component component, CoreTypes coreTypes) {
+  final repo = new ObfuscationProhibitionsMetadataRepository();
+  component.addMetadataRepository(repo);
+  final visitor =
+      ObfuscationProhibitionsVisitor(ConstantPragmaAnnotationParser(coreTypes));
+  visitor.visitComponent(component);
+  repo.mapping[component] = visitor.metadata;
+}
+
+class ObfuscationProhibitionsVisitor extends RecursiveVisitor {
+  final PragmaAnnotationParser parser;
+  final metadata = ObfuscationProhibitionsMetadata();
+
+  ObfuscationProhibitionsVisitor(this.parser);
+
+  void _addIfEntryPoint(
+      List<Expression> annotations, String name, TreeNode node) {
+    for (var ann in annotations) {
+      ParsedPragma pragma = parser.parsePragma(ann);
+      if (pragma is ParsedEntryPointPragma) {
+        metadata.protectedNames.add(name);
+        if (node is Field) {
+          metadata.protectedNames.add(name + "=");
+        }
+        final parent = node.parent;
+        if (parent is Class) {
+          metadata.protectedNames.add(parent.name);
+        }
+        break;
+      }
+    }
+  }
+
+  @override
+  visitClass(Class klass) {
+    _addIfEntryPoint(klass.annotations, klass.name, klass);
+    klass.visitChildren(this);
+  }
+
+  @override
+  visitProcedure(Procedure proc) {
+    _addIfEntryPoint(proc.annotations, proc.name.name, proc);
+  }
+
+  @override
+  visitField(Field field) {
+    _addIfEntryPoint(field.annotations, field.name.name, field);
+  }
+}
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
new file mode 100644
index 0000000..3252cc3
--- /dev/null
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.transformations.pragma;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+const kEntryPointPragmaName = "vm:entry-point";
+const kExactResultTypePragmaName = "vm:exact-result-type";
+
+abstract class ParsedPragma {}
+
+enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
+
+class ParsedEntryPointPragma extends ParsedPragma {
+  final PragmaEntryPointType type;
+  ParsedEntryPointPragma(this.type);
+}
+
+class ParsedResultTypeByTypePragma extends ParsedPragma {
+  final DartType type;
+  ParsedResultTypeByTypePragma(this.type);
+}
+
+class ParsedResultTypeByPathPragma extends ParsedPragma {
+  final String path;
+  ParsedResultTypeByPathPragma(this.path);
+}
+
+abstract class PragmaAnnotationParser {
+  /// May return 'null' if the annotation does not represent a recognized
+  /// @pragma.
+  ParsedPragma parsePragma(Expression annotation);
+}
+
+class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
+  final CoreTypes coreTypes;
+
+  ConstantPragmaAnnotationParser(this.coreTypes);
+
+  ParsedPragma parsePragma(Expression annotation) {
+    InstanceConstant pragmaConstant;
+    if (annotation is ConstantExpression) {
+      Constant constant = annotation.constant;
+      if (constant is InstanceConstant) {
+        if (constant.classReference.node == coreTypes.pragmaClass) {
+          pragmaConstant = constant;
+        }
+      }
+    }
+    if (pragmaConstant == null) return null;
+
+    String pragmaName;
+    Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
+    if (name is StringConstant) {
+      pragmaName = name.value;
+    } else {
+      return null;
+    }
+
+    Constant options =
+        pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
+    assert(options != null);
+
+    switch (pragmaName) {
+      case kEntryPointPragmaName:
+        PragmaEntryPointType type;
+        if (options is NullConstant) {
+          type = PragmaEntryPointType.Always;
+        } else if (options is BoolConstant && options.value == true) {
+          type = PragmaEntryPointType.Always;
+        } else if (options is StringConstant) {
+          if (options.value == "get") {
+            type = PragmaEntryPointType.GetterOnly;
+          } else if (options.value == "set") {
+            type = PragmaEntryPointType.SetterOnly;
+          } else {
+            throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) "
+                "must be either 'get' or 'set'.";
+          }
+        }
+        return type != null ? new ParsedEntryPointPragma(type) : null;
+      case kExactResultTypePragmaName:
+        if (options == null) return null;
+        if (options is TypeLiteralConstant) {
+          return new ParsedResultTypeByTypePragma(options.type);
+        } else if (options is StringConstant) {
+          return new ParsedResultTypeByPathPragma(options.value);
+        }
+        throw "ERROR: Unsupported option to '$kExactResultTypePragmaName' "
+            "pragma: $options";
+      default:
+        return null;
+    }
+  }
+}
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 903431c..a7dc830 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -22,6 +22,7 @@
 import 'summary_collector.dart';
 import 'types.dart';
 import 'utils.dart';
+import '../pragma.dart';
 
 // TODO(alexmarkov)
 // Unordered list of various improvements in type flow analysis,
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index 8497461..cb6b7ce 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -8,12 +8,12 @@
 import 'dart:core' hide Type;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/library_index.dart' show LibraryIndex;
 
 import 'calls.dart';
 import 'types.dart';
 import 'utils.dart';
+import '../pragma.dart';
 
 abstract class EntryPointsListener {
   /// Add call by the given selector with arbitrary ('raw') arguments.
@@ -33,96 +33,6 @@
   void recordMemberCalledViaThis(Member target);
 }
 
-abstract class ParsedPragma {}
-
-enum PragmaEntryPointType { Always, GetterOnly, SetterOnly }
-
-class ParsedEntryPointPragma extends ParsedPragma {
-  final PragmaEntryPointType type;
-  ParsedEntryPointPragma(this.type);
-}
-
-class ParsedResultTypeByTypePragma extends ParsedPragma {
-  final DartType type;
-  ParsedResultTypeByTypePragma(this.type);
-}
-
-class ParsedResultTypeByPathPragma extends ParsedPragma {
-  final String path;
-  ParsedResultTypeByPathPragma(this.path);
-}
-
-const kEntryPointPragmaName = "vm:entry-point";
-const kExactResultTypePragmaName = "vm:exact-result-type";
-
-abstract class PragmaAnnotationParser {
-  /// May return 'null' if the annotation does not represent a recognized
-  /// @pragma.
-  ParsedPragma parsePragma(Expression annotation);
-}
-
-class ConstantPragmaAnnotationParser extends PragmaAnnotationParser {
-  final CoreTypes coreTypes;
-
-  ConstantPragmaAnnotationParser(this.coreTypes);
-
-  ParsedPragma parsePragma(Expression annotation) {
-    InstanceConstant pragmaConstant;
-    if (annotation is ConstantExpression) {
-      Constant constant = annotation.constant;
-      if (constant is InstanceConstant) {
-        if (constant.classReference.node == coreTypes.pragmaClass) {
-          pragmaConstant = constant;
-        }
-      }
-    }
-    if (pragmaConstant == null) return null;
-
-    String pragmaName;
-    Constant name = pragmaConstant.fieldValues[coreTypes.pragmaName.reference];
-    if (name is StringConstant) {
-      pragmaName = name.value;
-    } else {
-      return null;
-    }
-
-    Constant options =
-        pragmaConstant.fieldValues[coreTypes.pragmaOptions.reference];
-    assertx(options != null);
-
-    switch (pragmaName) {
-      case kEntryPointPragmaName:
-        PragmaEntryPointType type;
-        if (options is NullConstant) {
-          type = PragmaEntryPointType.Always;
-        } else if (options is BoolConstant && options.value == true) {
-          type = PragmaEntryPointType.Always;
-        } else if (options is StringConstant) {
-          if (options.value == "get") {
-            type = PragmaEntryPointType.GetterOnly;
-          } else if (options.value == "set") {
-            type = PragmaEntryPointType.SetterOnly;
-          } else {
-            throw "Error: string directive to @pragma('$kEntryPointPragmaName', ...) "
-                "must be either 'get' or 'set'.";
-          }
-        }
-        return type != null ? new ParsedEntryPointPragma(type) : null;
-      case kExactResultTypePragmaName:
-        if (options == null) return null;
-        if (options is TypeLiteralConstant) {
-          return new ParsedResultTypeByTypePragma(options.type);
-        } else if (options is StringConstant) {
-          return new ParsedResultTypeByPathPragma(options.value);
-        }
-        throw "ERROR: Unsupported option to '$kExactResultTypePragmaName' "
-            "pragma: $options";
-      default:
-        return null;
-    }
-  }
-}
-
 class PragmaEntryPointsVisitor extends RecursiveVisitor {
   final EntryPointsListener entryPoints;
   final NativeCodeOracle nativeCodeOracle;
@@ -145,13 +55,15 @@
 
   @override
   visitClass(Class klass) {
-    var type = _annotationsDefineRoot(klass.annotations);
-    if (type != null) {
-      if (type != PragmaEntryPointType.Always) {
-        throw "Error: pragma entry-point definition on a class must evaluate "
-            "to null, true or false. See entry_points_pragma.md.";
+    if (!klass.isAbstract) {
+      var type = _annotationsDefineRoot(klass.annotations);
+      if (type != null) {
+        if (type != PragmaEntryPointType.Always) {
+          throw "Error: pragma entry-point definition on a class must evaluate "
+              "to null, true or false. See entry_points_pragma.md.";
+        }
+        entryPoints.addAllocatedClass(klass);
       }
-      entryPoints.addAllocatedClass(klass);
     }
     currentClass = klass;
     klass.visitChildren(this);
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index bc6bb28..0937ab8 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -15,11 +15,11 @@
 import 'package:kernel/type_environment.dart';
 
 import 'analysis.dart';
-import 'native_code.dart';
 import 'calls.dart';
 import 'summary_collector.dart';
 import 'types.dart';
 import 'utils.dart';
+import '../pragma.dart';
 import '../devirtualization.dart' show Devirtualization;
 import '../../metadata/direct_call.dart';
 import '../../metadata/inferred_type.dart';
diff --git a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart b/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
index cd3e21c..1b959c5 100644
--- a/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
+++ b/pkg/vm/test/transformations/type_flow/annotation_matcher.dart
@@ -4,8 +4,8 @@
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
-import 'package:vm/transformations/type_flow/native_code.dart';
 import 'package:vm/transformations/type_flow/utils.dart';
+import 'package:vm/transformations/pragma.dart';
 
 // Since we don't run the constants transformation in this test, we can't
 // recognize all pragma annotations precisely. Instead, we pattern match on
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index 7141c73..a9b3637 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -60,6 +60,7 @@
       new _RandomAccessFileOpsImpl(pointer);
 }
 
+@pragma("vm:entry-point")
 class _RandomAccessFileOpsImpl extends NativeFieldWrapperClass1
     implements _RandomAccessFileOps {
   _RandomAccessFileOpsImpl._();
diff --git a/runtime/bin/namespace_patch.dart b/runtime/bin/namespace_patch.dart
index 0b85a14..488aaf5 100644
--- a/runtime/bin/namespace_patch.dart
+++ b/runtime/bin/namespace_patch.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+@pragma("vm:entry-point")
 class _NamespaceImpl extends NativeFieldWrapperClass1 implements _Namespace {
   _NamespaceImpl._();
 
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 432b42c..5d61f88 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -18,6 +18,7 @@
 }
 
 @patch
+@pragma("vm:entry-point")
 class X509Certificate {
   @patch
   @pragma("vm:entry-point")
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 366ee58..a4b8956 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -373,6 +373,12 @@
       }
       await new Future<Null>.delayed(const Duration(seconds: 1));
     }
+    if (_service.isExiting) {
+      serverPrint('Observatory HTTP server exiting before listening as '
+          'vm service has received exit request\n');
+      await shutdown(true);
+      return this;
+    }
     _server.listen(_requestHandler, cancelOnError: true);
     serverPrint('Observatory listening on $serverAddress');
     if (Platform.isFuchsia) {
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 96ed0ac..4f53173 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -148,6 +148,7 @@
 }
 
 @patch
+@pragma("vm:entry-point")
 class UnsupportedError {
   static _throwNew(String msg) {
     throw new UnsupportedError(msg);
@@ -205,6 +206,7 @@
   // The compiler emits a call to _throwNew when it cannot resolve a static
   // method at compile time. The receiver is actually the literal class of the
   // unresolved method.
+  @pragma("vm:entry-point")
   static void _throwNew(Object receiver, String memberName, int invocation_type,
       Object typeArguments, List arguments, List argumentNames) {
     throw new NoSuchMethodError._withType(receiver, memberName, invocation_type,
diff --git a/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart b/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
index b40c5a9..fbe62fa 100644
--- a/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
+++ b/runtime/tests/vm/dart/error_messages_in_null_checks_test.dart
@@ -9,14 +9,17 @@
 import "package:expect/expect.dart";
 
 class A {
+  @pragma("vm:entry-point") // Prevent obfuscation
   void foo() {
     Expect.fail('A.foo should not be reachable');
   }
 
+  @pragma("vm:entry-point") // Prevent obfuscation
   dynamic get bar {
     Expect.fail('A.bar should not be reachable');
   }
 
+  @pragma("vm:entry-point") // Prevent obfuscation
   set bazz(int x) {
     Expect.fail('A.bazz should not be reachable');
   }
diff --git a/runtime/tests/vm/dart/inline_stack_frame_test.dart b/runtime/tests/vm/dart/inline_stack_frame_test.dart
index 673d4c9..68c8584 100644
--- a/runtime/tests/vm/dart/inline_stack_frame_test.dart
+++ b/runtime/tests/vm/dart/inline_stack_frame_test.dart
@@ -17,6 +17,7 @@
 //       func2 is not inlined as func1 has not been optimized.
 
 class Test {
+  @pragma("vm:entry-point")
   String func1(var k) {
     try {
       for (var i = 0; i <= 50; i++) {
@@ -29,6 +30,7 @@
     }
   }
 
+  @pragma("vm:entry-point")
   int func2(var i) {
     var result = 0;
     for (var k = 0; k <= 10; k++) {
@@ -37,6 +39,7 @@
     return result;
   }
 
+  @pragma("vm:entry-point")
   int func3(var i) {
     var result = 0;
     for (var l = 0; l <= 1; l++) {
@@ -45,6 +48,7 @@
     return result;
   }
 
+  @pragma("vm:entry-point")
   int func4(var i) {
     var result = 0;
     for (var j = 0; j <= 10; j++) {
@@ -53,6 +57,7 @@
     return result;
   }
 
+  @pragma("vm:entry-point")
   int func5(var i) {
     if (i >= 520) throw "show me inlined functions";
     return i;
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d4ed053..cfd49dc 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -355,3 +355,7 @@
 
 [ ($runtime == vm || $runtime == dart_precompiled) && !$preview_dart_2 ]
 *:SkipByDesign # Deprecating all Dart1 modes of execution
+
+[ $builder_tag == obfuscated && $compiler == dartkp ]
+dart/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
+dart/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 484dcd5..37d6578 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -90,8 +90,13 @@
     return ApiError::New(msg, Heap::kOld);
   }
   kernel::KernelLoader loader(program);
+
   Isolate* isolate = thread->isolate();
 
+  if (isolate->obfuscate()) {
+    loader.ReadObfuscationProhibitions();
+  }
+
   // Load the bootstrap libraries in order (see object_store.h).
   Library& library = Library::Handle(zone);
   String& dart_name = String::Handle(zone);
diff --git a/runtime/vm/compiler/aot/entry_points_pragma.md b/runtime/vm/compiler/aot/entry_points_pragma.md
index 363bea3..dfdecfe 100644
--- a/runtime/vm/compiler/aot/entry_points_pragma.md
+++ b/runtime/vm/compiler/aot/entry_points_pragma.md
@@ -15,11 +15,16 @@
 methods which call into Dart, the entry points are required for the correctness
 of compilation.
 
+In addition, when obfuscation is enabled, the precompiler needs to know which
+symbols need to be preserved to ensure they can be resolved from native code.
+
 # Pragma annotation
 
 The annotation `@pragma("vm:entry-point", ...)` can be placed on a class or
-member to indicate that it may be allocated or invoked directly from native or
-VM code. The allowed uses of the annotation are as follows.
+member to indicate that it may be resolved, allocated or invoked directly from
+native or VM code.
+
+The allowed uses of the annotation are as follows.
 
 ## Classes
 
@@ -35,6 +40,10 @@
 If the second parameter is missing, `null` or `true`, the class will be
 available for allocation directly from native or VM code.
 
+Note that `@pragma("vm:entry-point")` may be added to abstract classes -- in
+this case, their name will survive obfuscation, but they won't have any
+allocation stubs.
+
 ## Procedures
 
 Any one of the following forms may be attached to a procedure (including
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index ea575f2..c272742 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2565,10 +2565,6 @@
 }
 
 void Obfuscator::InitializeRenamingMap(Isolate* isolate) {
-  // Prevent renaming of classes and method names mentioned in the
-  // entry points lists.
-  PreventRenaming(isolate->embedder_entry_points());
-
 // Prevent renaming of all pseudo-keywords and operators.
 // Note: not all pseudo-keywords are mentioned in DART_KEYWORD_LIST
 // (for example 'hide', 'show' and async related keywords are omitted).
@@ -2674,25 +2670,6 @@
   return renamed_.raw();
 }
 
-void Obfuscator::PreventRenaming(Dart_QualifiedFunctionName entry_points[]) {
-  for (intptr_t i = 0; entry_points[i].function_name != NULL; i++) {
-    const char* class_name = entry_points[i].class_name;
-    const char* function_name = entry_points[i].function_name;
-
-    const size_t class_name_len = strlen(class_name);
-    if (strncmp(function_name, class_name, class_name_len) == 0 &&
-        function_name[class_name_len] == '.') {
-      const char* ctor_name = function_name + class_name_len + 1;
-      if (ctor_name[0] != '\0') {
-        PreventRenaming(ctor_name);
-      }
-    } else {
-      PreventRenaming(function_name);
-    }
-    PreventRenaming(class_name);
-  }
-}
-
 static const char* const kGetterPrefix = "get:";
 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix);
 static const char* const kSetterPrefix = "set:";
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index c07ff41..a884b26 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -9,6 +9,7 @@
 #include "vm/hash_map.h"
 #include "vm/hash_table.h"
 #include "vm/object.h"
+#include "vm/symbols.h"
 
 namespace dart {
 
@@ -439,13 +440,13 @@
   // Serialize renaming map as a malloced array of strings.
   static const char** SerializeMap(Thread* thread);
 
+  void PreventRenaming(const char* name);
+  void PreventRenaming(const String& name) { state_->PreventRenaming(name); }
+
  private:
   // Populate renaming map with names that should have identity renaming.
   // (or in other words: with those names that should not be renamed).
   void InitializeRenamingMap(Isolate* isolate);
-  void PreventRenaming(Dart_QualifiedFunctionName* entry_points);
-  void PreventRenaming(const char* name);
-  void PreventRenaming(const String& name) { state_->PreventRenaming(name); }
 
   // ObjectStore::obfuscation_map() is an Array with two elements:
   // first element is the last used rename and the second element is
@@ -562,6 +563,7 @@
     return name.raw();
   }
 
+  void PreventRenaming(const String& name) {}
   static void ObfuscateSymbolInstance(Thread* thread,
                                       const Instance& instance) {}
 
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 548ec56..cd8350c 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1793,9 +1793,9 @@
       break;
   }
 
-  if ((kSmiBits < 32) && (unboxed == kTagged) && phi->Type()->IsInt() &&
+  if ((unboxed == kTagged) && phi->Type()->IsInt() &&
       RangeUtils::Fits(phi->range(), RangeBoundary::kRangeBoundaryInt64)) {
-    // On 32-bit platforms conservatively unbox phis that:
+    // Conservatively unbox phis that:
     //   - are proven to be of type Int;
     //   - fit into 64bits range;
     //   - have either constants or Box() operations as inputs;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 4240758..f3d72fb 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -320,8 +320,7 @@
   if (destination.IsRegister()) {
     if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
-      const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
-                                           : Mint::Cast(value_).value();
+      const int64_t value = Integer::Cast(value_).AsInt64Value();
       __ LoadImmediate(destination.reg(), value);
     } else {
       ASSERT(representation() == kTagged);
@@ -346,9 +345,12 @@
     ASSERT(destination.IsStackSlot());
     ASSERT(tmp != kNoRegister);
     const intptr_t dest_offset = destination.ToStackSlotOffset();
-    if (value_.IsSmi() && representation() == kUnboxedInt32) {
-      __ LoadImmediate(tmp, static_cast<int32_t>(Smi::Cast(value_).Value()));
+    if (representation() == kUnboxedInt32 ||
+        representation() == kUnboxedInt64) {
+      const int64_t value = Integer::Cast(value_).AsInt64Value();
+      __ LoadImmediate(tmp, value);
     } else {
+      ASSERT(representation() == kTagged);
       __ LoadObject(tmp, value_);
     }
     __ StoreToOffset(tmp, destination.base_reg(), dest_offset);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 4f02fbd..a4709d6 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -291,8 +291,7 @@
   if (destination.IsRegister()) {
     if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
-      const int64_t value = value_.IsSmi() ? Smi::Cast(value_).Value()
-                                           : Mint::Cast(value_).value();
+      const int64_t value = Integer::Cast(value_).AsInt64Value();
       if (value == 0) {
         __ xorl(destination.reg(), destination.reg());
       } else {
@@ -322,10 +321,12 @@
     __ movsd(destination.ToStackSlotAddress(), XMM0);
   } else {
     ASSERT(destination.IsStackSlot());
-    if (value_.IsSmi() && representation() == kUnboxedInt32) {
-      __ movl(destination.ToStackSlotAddress(),
-              Immediate(Smi::Cast(value_).Value()));
+    if (representation() == kUnboxedInt32 ||
+        representation() == kUnboxedInt64) {
+      const int64_t value = Integer::Cast(value_).AsInt64Value();
+      __ movq(destination.ToStackSlotAddress(), Immediate(value));
     } else {
+      ASSERT(representation() == kTagged);
       __ StoreObject(destination.ToStackSlotAddress(), value_);
     }
   }
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index 28eb035..988d0834 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -223,6 +223,7 @@
   INVOKE_PASS(TypePropagation);
   INVOKE_PASS(ApplyClassIds);
   INVOKE_PASS(TypePropagation);
+  INVOKE_PASS(ApplyICData);
   INVOKE_PASS(Canonicalize);
   INVOKE_PASS(BranchSimplify);
   INVOKE_PASS(IfConvert);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index d5676ab..df8096b 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1422,12 +1422,12 @@
     Reader reader(H.metadata_mappings());
     reader.set_offset(mappings_offset);
 
-    intptr_t prev_node_offset = 0;
+    intptr_t prev_node_offset = -1;
     for (intptr_t i = 0; i < mappings_num; ++i) {
       intptr_t node_offset = reader.ReadUInt32();
       intptr_t md_offset = reader.ReadUInt32();
 
-      ASSERT((node_offset > 0) && (md_offset >= 0));
+      ASSERT((node_offset >= 0) && (md_offset >= 0));
       ASSERT(node_offset > prev_node_offset);
       prev_node_offset = node_offset;
     }
@@ -1715,6 +1715,28 @@
   return metadata;
 }
 
+ObfuscationProhibitionsMetadataHelper::ObfuscationProhibitionsMetadataHelper(
+    KernelReaderHelper* helper)
+    : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
+
+void ObfuscationProhibitionsMetadataHelper::ReadMetadata(intptr_t node_offset) {
+  intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
+  if (md_offset < 0) {
+    return;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+  Obfuscator O(Thread::Current(), String::Handle());
+
+  intptr_t len = helper_->ReadUInt32();
+  for (int i = 0; i < len; ++i) {
+    StringIndex name = helper_->ReadStringReference();
+    O.PreventRenaming(translation_helper_.DartSymbolPlain(name));
+  }
+  return;
+}
+
 CallSiteAttributesMetadataHelper::CallSiteAttributesMetadataHelper(
     KernelReaderHelper* helper,
     TypeTranslator* type_translator)
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index cb7dc87..949c0b5 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -903,6 +903,20 @@
   DISALLOW_COPY_AND_ASSIGN(ProcedureAttributesMetadataHelper);
 };
 
+class ObfuscationProhibitionsMetadataHelper : public MetadataHelper {
+ public:
+  static const char* tag() { return "vm.obfuscation-prohibitions.metadata"; }
+
+  explicit ObfuscationProhibitionsMetadataHelper(KernelReaderHelper* helper);
+
+  void ReadProhibitions() { ReadMetadata(0); }
+
+ private:
+  void ReadMetadata(intptr_t node_offset);
+
+  DISALLOW_COPY_AND_ASSIGN(ObfuscationProhibitionsMetadataHelper);
+};
+
 struct CallSiteAttributesMetadata {
   const AbstractType* receiver_type = nullptr;
 };
@@ -1065,6 +1079,7 @@
   friend class TypeParameterHelper;
   friend class TypeTranslator;
   friend class VariableDeclarationHelper;
+  friend class ObfuscationProhibitionsMetadataHelper;
   friend bool NeedsDynamicInvocationForwarder(const Function& function);
 
  private:
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index a658ab7..92e7895 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5029,6 +5029,14 @@
   RETURN_TYPE_ERROR(Z, library, Library);
 }
 
+static void CheckIsEntryPoint(const Class& klass) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  // This is not a completely thorough check that the class is an entry-point,
+  // but it catches most missing annotations.
+  RELEASE_ASSERT(klass.has_pragma());
+#endif
+}
+
 DART_EXPORT Dart_Handle Dart_GetClass(Dart_Handle library,
                                       Dart_Handle class_name) {
   DARTSCOPE(Thread::Current());
@@ -5047,6 +5055,7 @@
     return Api::NewError("Class '%s' not found in library '%s'.",
                          cls_name.ToCString(), lib_name.ToCString());
   }
+  CheckIsEntryPoint(cls);
   return Api::NewHandle(T, cls.RareType());
 }
 
@@ -5075,6 +5084,7 @@
     return Api::NewError("Type '%s' not found in library '%s'.",
                          name_str.ToCString(), lib_name.ToCString());
   }
+  CheckIsEntryPoint(cls);
   if (cls.NumTypeArguments() == 0) {
     if (number_of_type_arguments != 0) {
       return Api::NewError(
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 36aead1..2a5ed7e 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -122,6 +122,8 @@
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
+  ASSERT(!function.IsNull());
+
   // Get the entrypoint corresponding to the function specified, this
   // will result in a compilation of the function if it is not already
   // compiled.
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 92c0a87..c1c1adf 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -203,6 +203,11 @@
   InitializeFields();
 }
 
+void KernelLoader::ReadObfuscationProhibitions() {
+  ObfuscationProhibitionsMetadataHelper helper(&helper_);
+  helper.ReadProhibitions();
+}
+
 Object& KernelLoader::LoadEntireProgram(Program* program,
                                         bool process_pending_classes) {
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index bb4a16b..b8a99fd 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -174,6 +174,8 @@
 
   static void FinishLoading(const Class& klass);
 
+  void ReadObfuscationProhibitions();
+
   const Array& ReadConstantTable();
 
   // Check for the presence of a (possibly const) constructor for the
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 015c414..e569785 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -493,6 +493,7 @@
  * This [Error] is thrown when an instance cannot implement one of the methods
  * in its signature.
  */
+@pragma("vm:entry-point")
 class UnsupportedError extends Error {
   final String message;
   @pragma("vm:entry-point")
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index d782b67..74870cb 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -49,6 +49,7 @@
   * An [OSError] object holds information about an error from the
   * operating system.
   */
+@pragma("vm:entry-point")
 class OSError {
   /** Constant used to indicate that no OS error code is available. */
   static const int noErrorCode = -1;
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 2fc0930..2f141cb 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -111,6 +111,7 @@
  *   a tutorial about writing command-line apps, includes information about
  *   files and directories.
  */
+@pragma("vm:entry-point")
 abstract class Directory implements FileSystemEntity {
   /**
    * Gets the path of this directory.
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 6fe447f..a7f4c66 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -237,6 +237,7 @@
  *   a tutorial about writing command-line apps, includes information about
  *   files and directories.
  */
+@pragma("vm:entry-point")
 abstract class File implements FileSystemEntity {
   /**
    * Creates a [File] object.
@@ -956,6 +957,7 @@
 /**
  * Exception thrown when a file operation fails.
  */
+@pragma("vm:entry-point")
 class FileSystemException implements IOException {
   /**
    * Message describing the error. This does not include any detailed
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 45cfc29..01b1d67 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -8,6 +8,7 @@
  * [Link] objects are references to filesystem links.
  *
  */
+@pragma("vm:entry-point")
 abstract class Link implements FileSystemEntity {
   /**
    * Creates a Link object.
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index eb3504f..787762b 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -377,6 +377,7 @@
  * X509Certificate represents an SSL certificate, with accessors to
  * get the fields of the certificate.
  */
+@pragma("vm:entry-point")
 abstract class X509Certificate {
   @pragma("vm:entry-point")
   external factory X509Certificate._();
@@ -1288,6 +1289,7 @@
  * An exception that happens in the handshake phase of establishing
  * a secure network connection.
  */
+@pragma("vm:entry-point")
 class HandshakeException extends TlsException {
   @pragma("vm:entry-point")
   const HandshakeException([String message = "", OSError osError = null])
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index e8a5600..2cccb59 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -204,6 +204,9 @@
   /// Collection of currently running isolates.
   RunningIsolates runningIsolates = new RunningIsolates();
 
+  /// Flag to indicate VM service is exiting.
+  bool isExiting = false;
+
   /// A port used to receive events from the VM.
   final RawReceivePort eventPort;
 
@@ -323,6 +326,8 @@
   }
 
   Future _exit() async {
+    isExiting = true;
+
     // Stop the server.
     if (VMServiceEmbedderHooks.serverStop != null) {
       await VMServiceEmbedderHooks.serverStop();
@@ -342,6 +347,7 @@
     if (VMServiceEmbedderHooks.cleanup != null) {
       await VMServiceEmbedderHooks.cleanup();
     }
+
     // Notify the VM that we have exited.
     _onExit();
   }
diff --git a/tests/corelib_2/apply_test.dart b/tests/corelib_2/apply_test.dart
index 9a3e94b..01f2e1c 100644
--- a/tests/corelib_2/apply_test.dart
+++ b/tests/corelib_2/apply_test.dart
@@ -31,7 +31,6 @@
 
 main() {
   testMap(res, func, map) {
-    map = symbolMapToStringMap(map);
     Expect.equals(res, Function.apply(func, null, map));
     Expect.equals(res, Function.apply(func, [], map));
   }
@@ -45,17 +44,16 @@
   testListTyped(res, Function func, list) => testList(res, func, list);
 
   test(res, func, list, map) {
-    map = symbolMapToStringMap(map);
     Expect.equals(res, Function.apply(func, list, map));
   }
 
   testList(42, test0, null);
   testList(42, test0, []);
-  testMap(42, test0a, {"a": 5});
+  testMap(42, test0a, {#a: 5});
   testList(42, test1, [41]);
-  test(42, test1a, [20], {"a": 22});
+  test(42, test1a, [20], {#a: 22});
   testList(42, test2, [20, 22]);
-  test(42, test2a, [10, 15], {"a": 17});
+  test(42, test2a, [10, 15], {#a: 17});
 
   // Test that "this" is correct when calling closurized functions.
   var cfoo = new C().foo;
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 8291f39..2723fd2 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -132,6 +132,12 @@
 [ $arch == x64 && $system == windows ]
 stopwatch_test: Skip # Flaky test due to expected performance behaviour.
 
+[ $builder_tag == obfuscated && $runtime == dart_precompiled ]
+apply_generic_function_test: SkipByDesign # Function.apply with named args
+apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
+dynamic_nosuchmethod_test: SkipByDesign # Expects names in NSM
+error_stack_trace1_test: SkipByDesign # Expects unobfuscated stack trace
+
 # All static_tests have expected compile-time errors.
 [ $compiler != app_jitk && $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $compiler != fasta && $strong ]
 core_runtime_types_static_test: MissingCompileTimeError
@@ -310,10 +316,6 @@
 [ $mode == release && $hot_reload && ($compiler == dartk || $compiler == dartkb) ]
 bigint_parse_radix_test: Crash
 
-[ $runtime == dart_precompiled && $minified ]
-apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
-error_stack_trace1_test: Skip # Expects unobfuscated stack trace
-
 [ $runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk) ]
 bit_twiddling_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
 compare_to2_test: RuntimeError, OK # Requires fixed-size int64 support.
diff --git a/tests/kernel/kernel.status b/tests/kernel/kernel.status
index fd35205..bb0a776 100644
--- a/tests/kernel/kernel.status
+++ b/tests/kernel/kernel.status
@@ -11,6 +11,9 @@
 [ !$fasta ]
 unsorted/loop_test: Skip # This test uses optional new/const.
 
+[ $builder_tag == obfuscated && $runtime == dart_precompiled ]
+unsorted/symbol_literal_test: RuntimeError # Issue 34911
+
 [ $compiler != app_jitk && $compiler != dart2js && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $runtime != none ]
 unsorted/types_test: RuntimeError
 
@@ -29,8 +32,5 @@
 [ $compiler != dartk && $compiler != dartkb && $compiler != dartkp && !$strong ]
 unsorted/invocation_errors_test/00: MissingCompileTimeError # This test has been tuned for dart 2.
 
-[ $runtime == dart_precompiled && $minified ]
-unsorted/symbol_literal_test: Skip # Expects unobfuscated Symbol.toString.
-
 [ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # Deprecating all Dart1 modes of execution
diff --git a/tests/language_2/cyclic_type_test.dart b/tests/language_2/cyclic_type_test.dart
index ada6b6e..3031f62 100644
--- a/tests/language_2/cyclic_type_test.dart
+++ b/tests/language_2/cyclic_type_test.dart
@@ -6,25 +6,33 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Base<T> {
   get t => T;
 }
 
 // Derived<T> is contractive.
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived<T> extends Base<Derived<T>> {} // //# 00: ok
 
 // Derived<T> is contractive.
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived<T> extends Base<Derived<Derived<int>>> {} // //# 01: ok
 
 // Derived<T> is non-contractive.
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived<T> extends Base<Derived<Derived<T>>> {} // //# 02: ok
 
 // Derived1<U> and Derived2<V> are contractive.
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived1<U> extends Base<Derived2<U>> {} //  //# 03: ok
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived2<V> extends Base<Derived1<V>> {} //  //# 03: ok
 
 // Derived1<U> and Derived2<V> are non-contractive.
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived1<U> extends Base<Derived2<U>> {} //  //# 04: ok
+@pragma("vm:entry-point")  // Prevent obfuscation
 class Derived2<V> extends Base<Derived1<Derived2<V>>> {} //  //# 04: ok
 
 main() {
diff --git a/tests/language_2/f_bounded_quantification5_test.dart b/tests/language_2/f_bounded_quantification5_test.dart
index e496ff9..412cc95 100644
--- a/tests/language_2/f_bounded_quantification5_test.dart
+++ b/tests/language_2/f_bounded_quantification5_test.dart
@@ -6,8 +6,10 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point")
 class A<T extends B<dynamic>> {}
 
+@pragma("vm:entry-point")
 class B<T extends Object> {}
 
 main() {
diff --git a/tests/language_2/full_stacktrace1_test.dart b/tests/language_2/full_stacktrace1_test.dart
index 65c89be..42963f2 100644
--- a/tests/language_2/full_stacktrace1_test.dart
+++ b/tests/language_2/full_stacktrace1_test.dart
@@ -4,14 +4,17 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point") // Prevents obfuscation
 void func1() {
   throw new Exception("Test full stacktrace");
 }
 
+@pragma("vm:entry-point") // Prevents obfuscation
 void func2() {
   func1();
 }
 
+@pragma("vm:entry-point") // Prevents obfuscation
 void func3() {
   try {
     func2();
@@ -27,16 +30,19 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevents obfuscation
 int func4() {
   func3();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevents obfuscation
 int func5() {
   func4();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevents obfuscation
 int func6() {
   func5();
   return 1;
diff --git a/tests/language_2/full_stacktrace2_test.dart b/tests/language_2/full_stacktrace2_test.dart
index 8b7dfb2..fc15d54 100644
--- a/tests/language_2/full_stacktrace2_test.dart
+++ b/tests/language_2/full_stacktrace2_test.dart
@@ -4,14 +4,17 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 void func1() {
   throw new Exception("Test full stacktrace");
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 void func2() {
   func1();
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 void func3() {
   try {
     func2();
@@ -30,11 +33,13 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 int func4() {
   func3();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 int func5() {
   try {
     func4();
@@ -52,11 +57,13 @@
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 int func6() {
   func5();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation.
 int func7() {
   func6();
   return 1;
diff --git a/tests/language_2/full_stacktrace3_test.dart b/tests/language_2/full_stacktrace3_test.dart
index 2475f37..f6b28a3 100644
--- a/tests/language_2/full_stacktrace3_test.dart
+++ b/tests/language_2/full_stacktrace3_test.dart
@@ -4,14 +4,17 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point") // Prevent obfuscation
 void func1() {
   throw new Exception("Test full stacktrace");
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 void func2() {
   func1();
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 void func3() {
   try {
     func2();
@@ -29,11 +32,13 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 int func4() {
   func3();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 int func5() {
   try {
     func4();
@@ -51,11 +56,13 @@
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 int func6() {
   func5();
   return 1;
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 int func7() {
   func6();
   return 1;
diff --git a/tests/language_2/generic_function_dcall_test.dart b/tests/language_2/generic_function_dcall_test.dart
index e05fcc2..6de579f 100644
--- a/tests/language_2/generic_function_dcall_test.dart
+++ b/tests/language_2/generic_function_dcall_test.dart
@@ -53,5 +53,5 @@
   testCallsToGenericFn();
   testGenericFnAsArg();
   testGenericFnAsGenericFnArg();
-  testGenericFnTypeToString();
+  testGenericFnTypeToString(); //# 01: ok
 }
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4fd51d6..a99dd0f 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -251,7 +251,7 @@
 full_stacktrace2_test: RuntimeError # Issue 12698
 full_stacktrace3_test: RuntimeError # Issue 12698
 generalized_void_syntax_test: CompileTimeError # Issue #30176.
-generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
+generic_function_dcall_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
 generic_typedef_test: RuntimeError
 identical_closure2_test: RuntimeError # non JS number semantics
@@ -505,7 +505,7 @@
 full_stacktrace3_test: RuntimeError # Issue 12698
 function_subtype_inline2_test: RuntimeError
 generic_function_bounds_test: RuntimeError
-generic_function_dcall_test: RuntimeError
+generic_function_dcall_test/01: RuntimeError
 generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_methods_bounds_test/02: MissingRuntimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 75d0043..9bb75b0 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -238,6 +238,26 @@
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 
+[ $builder_tag == obfuscated && $compiler == dartkp ]
+generic_function_dcall_test/01: SkipByDesign # Prints type names
+invocation_mirror_test: RuntimeError # Issue 34911
+many_named_arguments_test: SkipByDesign # Checks names of arguments
+mixin_generic_test: SkipByDesign # Prints type names
+mixin_mixin3_test: SkipByDesign # Prints type names
+mixin_mixin5_test: SkipByDesign # Prints type names
+mixin_mixin6_test: SkipByDesign # Prints type names
+mixin_mixin_bound2_test: SkipByDesign # Prints type names
+no_such_method_native_test: RuntimeError # Compares symbol #foobar with string "foobar" in noSuchMethod
+recursive_generic_test: RuntimeError # Compares a (dynamic) toString call to 'C<D>'
+symbol_literal_test/02: SkipByDesign # We don't obfuscate const Symbol constructor
+tearoff_dynamic_test: RuntimeError # Compares call to "foo" (noSuchMethod) with string "foo"
+type_literal_test: SkipByDesign # Uses lots of strings with type names in them
+vm/bool_check_stack_traces_test: SkipByDesign # Looks for filenames in stacktrace output
+vm/no_such_args_error_message_vm_test: SkipByDesign # Looks for function name in error message
+vm/no_such_method_error_message_callable_vm_test: SkipByDesign # Expects unobfuscated method names
+vm/no_such_method_error_message_vm_test: SkipByDesign # Looks for unobfuscated name in error message
+vm/regress_28325_test: SkipByDesign # Looks for filename in stack trace
+
 [ $compiler == app_jitk && $mode == product ]
 vm/causal_async_exception_stack2_test: RuntimeError
 vm/causal_async_exception_stack_test: RuntimeError
@@ -630,11 +650,6 @@
 [ $compiler == dartkp && $system == windows ]
 disassemble_test: Pass, Slow
 
-[ $compiler == dartkp && $minified ]
-no_such_method_native_test: RuntimeError # Compares symbol #foobar with string "foobar" in noSuchMethod
-recursive_generic_test: RuntimeError # Compares a (dynamic) toString call to 'C<D>'
-tearoff_dynamic_test: RuntimeError # Compares call to "foo" (noSuchMethod) with string "foo"
-
 [ $compiler == fasta && $strong ]
 compile_time_constant_static4_test/02: MissingCompileTimeError
 compile_time_constant_static4_test/03: MissingCompileTimeError
diff --git a/tests/language_2/mixin_mixin_type_arguments_test.dart b/tests/language_2/mixin_mixin_type_arguments_test.dart
index 55d796f..08a3d9c 100644
--- a/tests/language_2/mixin_mixin_type_arguments_test.dart
+++ b/tests/language_2/mixin_mixin_type_arguments_test.dart
@@ -4,34 +4,45 @@
 
 import 'package:expect/expect.dart' show Expect;
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class A {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class B {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class C {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class D {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class E {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class F {}
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class M1<Tm1> {
   m1() => "M1<$Tm1>";
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class M2<Tm2> {
   m2() => "M2<$Tm2>";
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class M3<Tm3> {
   m3() => "M3<$Tm3>";
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class M4<Tm4> {
   m4() => "M4<$Tm4>";
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 class M5<Tm5> {
   m5() => "M5<$Tm5>";
 }
diff --git a/tests/language_2/mock_writable_final_field_test.dart b/tests/language_2/mock_writable_final_field_test.dart
index 6105a58..88919a9 100644
--- a/tests/language_2/mock_writable_final_field_test.dart
+++ b/tests/language_2/mock_writable_final_field_test.dart
@@ -9,12 +9,14 @@
 class Mock {
   noSuchMethod(Invocation i) {
     var expected = i.isGetter ? #x : const Symbol("x=");
-    Expect.equals(expected, i.memberName);
+    Expect.equals(expected.toString(), i.memberName.toString());
     values.add(i.positionalArguments[0]);
   }
 }
 
 class Foo {
+  // Prevent obfuscation of 'x'.
+  @pragma("vm:entry-point")
   int x;
 }
 
diff --git a/tests/language_2/mock_writable_final_private_field_test.dart b/tests/language_2/mock_writable_final_private_field_test.dart
index afb337c..c592878 100644
--- a/tests/language_2/mock_writable_final_private_field_test.dart
+++ b/tests/language_2/mock_writable_final_private_field_test.dart
@@ -16,6 +16,8 @@
 }
 
 class Foo {
+  // Prevent obfuscation of '_x'.
+  @pragma("vm:entry-point")
   int _x;
 }
 
diff --git a/tests/language_2/no_such_method_dispatcher_test.dart b/tests/language_2/no_such_method_dispatcher_test.dart
index 0228b65..d0042dc 100644
--- a/tests/language_2/no_such_method_dispatcher_test.dart
+++ b/tests/language_2/no_such_method_dispatcher_test.dart
@@ -27,7 +27,7 @@
       Expect.equals(posArgs[i], m.positionalArguments[i]);
     }
     for (var k in namedArgs.keys) {
-      Expect.equals(namedArgs[k], m.namedArguments[new Symbol(k)]);
+      Expect.equals(namedArgs[k], m.namedArguments[k]);
     }
     return 123;
   }
@@ -55,7 +55,7 @@
   }
 
   // Test named and positional arguments.
-  var c = new C(1, 2, [100], {"n1": 101, "n2": 102}) as dynamic;
+  var c = new C(1, 2, [100], {#n1: 101, #n2: 102}) as dynamic;
   for (var i = 0; i < 20; ++i) {
     Expect.equals(123, c.bar(100, n1: 101, n2: 102));
     Expect.equals(123, c.bar(100, n2: 102, n1: 101));
diff --git a/tests/language_2/regress_21795_test.dart b/tests/language_2/regress_21795_test.dart
index c264ef3..2ca18a3 100644
--- a/tests/language_2/regress_21795_test.dart
+++ b/tests/language_2/regress_21795_test.dart
@@ -4,6 +4,7 @@
 
 // Regression test for issue 21795.
 
+@pragma("vm:entry-point") // Prevent obfuscation
 foo(t) {
   try {
     if (t == 123) throw 42;
diff --git a/tests/language_2/stack_trace_test.dart b/tests/language_2/stack_trace_test.dart
index 1cf429e..5e4d7c6 100644
--- a/tests/language_2/stack_trace_test.dart
+++ b/tests/language_2/stack_trace_test.dart
@@ -87,6 +87,7 @@
 class RethrowStacktraceTest {
   var config = 0;
 
+  @pragma("vm:entry-point") // Prevent obfuscation
   issue12940() {
     throw "Progy";
   }
diff --git a/tests/language_2/stacktrace_rethrow_error_test.dart b/tests/language_2/stacktrace_rethrow_error_test.dart
index ef3116a..4cdbaa6 100644
--- a/tests/language_2/stacktrace_rethrow_error_test.dart
+++ b/tests/language_2/stacktrace_rethrow_error_test.dart
@@ -8,6 +8,7 @@
 
 // == Rethrow, skipping through typed handlers. ==
 
+@pragma("vm:entry-point") // Prevent obfuscation
 aa1() {
   try {
     bb1();
@@ -21,8 +22,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 bb1() => cc1();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 cc1() {
   try {
     dd1();
@@ -33,8 +36,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 dd1() => ee1();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ee1() {
   try {
     ff1();
@@ -43,12 +48,15 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ff1() => gg1();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 gg1() => throw new SubclassOfError();
 
 // == Rethrow, rethrow again in typed handler. ==
 
+@pragma("vm:entry-point") // Prevent obfuscation
 aa2() {
   try {
     bb2();
@@ -62,8 +70,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 bb2() => cc2();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 cc2() {
   try {
     dd2();
@@ -74,8 +84,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 dd2() => ee2();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ee2() {
   try {
     ff2();
@@ -84,12 +96,15 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ff2() => gg2();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 gg2() => throw new SubclassOfError();
 
 // == Rethrow, with intervening catch without a trace parameter.
 
+@pragma("vm:entry-point") // Prevent obfuscation
 aa3() {
   try {
     bb3();
@@ -103,8 +118,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 bb3() => cc3();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 cc3() {
   try {
     dd3();
@@ -113,8 +130,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 dd3() => ee3();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ee3() {
   try {
     ff3();
@@ -123,8 +142,10 @@
   }
 }
 
+@pragma("vm:entry-point") // Prevent obfuscation
 ff3() => gg3();
 
+@pragma("vm:entry-point") // Prevent obfuscation
 gg3() => throw new SubclassOfError();
 
 expectTrace(functionNames, stacktrace) {
diff --git a/tests/language_2/stacktrace_rethrow_nonerror_test.dart b/tests/language_2/stacktrace_rethrow_nonerror_test.dart
index 57c8a15..304d591 100644
--- a/tests/language_2/stacktrace_rethrow_nonerror_test.dart
+++ b/tests/language_2/stacktrace_rethrow_nonerror_test.dart
@@ -8,6 +8,7 @@
 
 // == Rethrow, skipping through typed handlers. ==
 
+@pragma("vm:entry-point")
 aa1() {
   try {
     bb1();
@@ -17,8 +18,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 bb1() => cc1();
 
+@pragma("vm:entry-point")
 cc1() {
   try {
     dd1();
@@ -29,8 +32,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 dd1() => ee1();
 
+@pragma("vm:entry-point")
 ee1() {
   try {
     ff1();
@@ -39,12 +44,15 @@
   }
 }
 
+@pragma("vm:entry-point")
 ff1() => gg1();
 
+@pragma("vm:entry-point")
 gg1() => throw new NotASubclassOfError();
 
 // == Rethrow, rethrow again in typed handler. ==
 
+@pragma("vm:entry-point")
 aa2() {
   try {
     bb2();
@@ -54,8 +62,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 bb2() => cc2();
 
+@pragma("vm:entry-point")
 cc2() {
   try {
     dd2();
@@ -66,8 +76,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 dd2() => ee2();
 
+@pragma("vm:entry-point")
 ee2() {
   try {
     ff2();
@@ -76,12 +88,15 @@
   }
 }
 
+@pragma("vm:entry-point")
 ff2() => gg2();
 
+@pragma("vm:entry-point")
 gg2() => throw new NotASubclassOfError();
 
 // == Rethrow, with intervening catch without a trace parameter.
 
+@pragma("vm:entry-point")
 aa3() {
   try {
     bb3();
@@ -91,8 +106,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 bb3() => cc3();
 
+@pragma("vm:entry-point")
 cc3() {
   try {
     dd3();
@@ -101,8 +118,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 dd3() => ee3();
 
+@pragma("vm:entry-point")
 ee3() {
   try {
     ff3();
@@ -111,8 +130,10 @@
   }
 }
 
+@pragma("vm:entry-point")
 ff3() => gg3();
 
+@pragma("vm:entry-point")
 gg3() => throw new NotASubclassOfError();
 
 expectTrace(functionNames, stacktrace) {
diff --git a/tests/language_2/symbol_literal_test.dart b/tests/language_2/symbol_literal_test.dart
index f111da8..aa89fef 100644
--- a/tests/language_2/symbol_literal_test.dart
+++ b/tests/language_2/symbol_literal_test.dart
@@ -24,15 +24,19 @@
 }
 
 main() {
-  check(const Symbol("a"), #a);
-  check(const Symbol("a"), #a);
-  check(const Symbol("ab"), #ab);
-  check(const Symbol("ab"), #ab);
-  check(const Symbol("a.b"), #a.b);
-  check(const Symbol("a.b"), #a.b);
-  check(const Symbol("=="), #==);
-  check(const Symbol("=="), #==);
-  check(const Symbol("a.toString"), #a.toString);
+  bool doChecks = false;
+  doChecks = true; //# 02: ok
+  if (doChecks) {
+    check(const Symbol("a"), #a);
+    check(const Symbol("a"), #a);
+    check(const Symbol("ab"), #ab);
+    check(const Symbol("ab"), #ab);
+    check(const Symbol("a.b"), #a.b);
+    check(const Symbol("a.b"), #a.b);
+    check(const Symbol("=="), #==);
+    check(const Symbol("=="), #==);
+    check(const Symbol("a.toString"), #a.toString);
+  }
 
   Expect.equals(1, testSwitch(#abc));
 
diff --git a/tests/language_2/vm/regress_flutter_23879_test.dart b/tests/language_2/vm/regress_flutter_23879_test.dart
new file mode 100644
index 0000000..102493e
--- /dev/null
+++ b/tests/language_2/vm/regress_flutter_23879_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Bug in unboxed int spilling (https://github.com/flutter/flutter/issues/23879).
+//
+// VMOptions=--deterministic
+
+import "package:expect/expect.dart";
+
+List<int> list = new List<int>(10);
+
+List<int> expected_values = [null, 152, 168, 184, 200, 216, 232, 248, 264, 280];
+
+int count = 0;
+
+bool getNext() {
+  return ++count <= 9;
+}
+
+int foo() {
+  int a = 1;
+  int b = 2;
+  int c = 3;
+  int d = 4;
+  int e = 5;
+  int f = 6;
+  int g = 7;
+  int h = 8;
+  int i = 9;
+  int j = 10;
+  int k = 11;
+  int l = 12;
+  int m = 13;
+  int n = 14;
+  int o = 15;
+  int p = 16;
+  count = 0;
+  int componentIndex = 1;
+  while (getNext()) {
+    // Make spilling likely.
+    a++;
+    b++;
+    c++;
+    d++;
+    e++;
+    f++;
+    g++;
+    h++;
+    i++;
+    j++;
+    k++;
+    l++;
+    m++;
+    n++;
+    o++;
+    p++;
+    list[componentIndex] =
+        a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p;
+    componentIndex++;
+  }
+  return componentIndex;
+}
+
+void main() {
+  int x = foo();
+  Expect.equals(10, x);
+  Expect.equals(10, count);
+  for (int i = 0; i < 10; i++) {
+    Expect.equals(expected_values[i], list[i]);
+  }
+}
diff --git a/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart b/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart
index 09b9197..b1d9f88 100644
--- a/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart
+++ b/tests/language_2/vm/tree_shake_type_args_in_constant_test.dart
@@ -7,6 +7,7 @@
 
 import "package:expect/expect.dart";
 
+@pragma("vm:entry-point") // Prevent obfuscation
 abstract class A {}
 
 class B<T> {
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index fe15c91..081f26e 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -57,6 +57,9 @@
 [ $arch == x64 && $mode == debug && $runtime == vm && $strong && ($compiler == dartk || $compiler == dartkb) ]
 mirrors/invocation_fuzz_test: Skip # Because it times out, issue 29439.
 
+[ $builder_tag == obfuscated && $compiler == dartkp ]
+collection/list_test: RuntimeError # Issue 34911
+
 [ $builder_tag == optimization_counter_threshold && ($compiler == dartk || $compiler == dartkb) ]
 isolate/unresolved_ports_test: CompileTimeError, Pass, Timeout # Fails to compile on opt counter builder (#31838)
 mirrors/invocation_fuzz_test/emptyarray: Pass, Crash, RuntimeError # Flaky on vm-kernel-optcounter-threshold-linux-release-x64, bug #31838
diff --git a/tools/VERSION b/tools/VERSION
index fe36fde..5361581 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 1
 PATCH 0
 PRERELEASE 9
-PRERELEASE_PATCH 3
+PRERELEASE_PATCH 4