Version 2.11.0-272.0.dev

Merge commit 'f8fdb4be05e2ee8f4e4ad68332e7f7280a6f2f5e' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2611829..5e40af4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,14 +4,8 @@
 
 #### `dart:io`
 
-* `HttpRequest` will now correctly follow HTTP 308 redirects
-  (`HttpStatus.permanentRedirect`).
-
-#### `dart:isolate`
-
-* Added `debugName` positional parameter to `ReceivePort` and `RawReceivePort`
-  constructors, a name which can be associated with the port and displayed in
-  tooling.
+*   `HttpRequest` will now correctly follow HTTP 308 redirects
+    (`HttpStatus.permanentRedirect`).
 
 ### Dart VM
 
diff --git a/DEPS b/DEPS
index 8d3fa01..610a69f 100644
--- a/DEPS
+++ b/DEPS
@@ -51,6 +51,9 @@
   "benchmarks_internal_rev": "354c978979c57e4a76f62e22cf644ed0804f4421",
   "checkout_benchmarks_internal": False,
 
+  # Checkout Android dependencies only on Mac and Linux.
+  "download_android_deps": 'host_os == "mac" or host_os == "linux"',
+
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
   # The list of revisions for these tools comes from Fuchsia, here:
@@ -77,7 +80,7 @@
   "chrome_rev" : "19997",
   "cli_util_rev" : "335ed165887d0ec97c2a09173ebf22dcf56a6c4e",
   "clock_rev" : "a494269254ba978e7ef8f192c5f7fec3fc05b9d3",
-  "collection_rev": "60e6ee2228586980826b07ec1df633bd879f42ea",
+  "collection_rev": "e4bb038ce2d8e66fb15818aa40685c68d53692ab",
   "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
   "csslib_rev": "6f77b3dcee957d3e2d5083f666221a220e9ed1f1",
@@ -491,6 +494,61 @@
       "dep_type": "cipd",
   },
 
+  Var("dart_root") + "/third_party/android_tools/ndk": {
+      "packages": [
+          {
+            "package": "flutter/android/ndk/${{platform}}",
+            "version": "version:r21.0.6113669"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/build-tools": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/build-tools/${{platform}}",
+            "version": "version:30.0.1"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/platform-tools": {
+     "packages": [
+          {
+            "package": "flutter/android/sdk/platform-tools/${{platform}}",
+            "version": "version:29.0.2"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/platforms": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/platforms",
+            "version": "version:30r3"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/third_party/android_tools/sdk/tools": {
+      "packages": [
+          {
+            "package": "flutter/android/sdk/tools/${{platform}}",
+            "version": "version:26.1.1"
+          }
+      ],
+      "condition": "download_android_deps",
+      "dep_type": "cipd",
+  },
+
   Var("dart_root") + "/buildtools/" + Var("host_os") + "-" + Var("host_cpu") + "/rust": {
       "packages": [
           {
@@ -640,11 +698,6 @@
                '--arch', 'arm64'],
   },
   {
-    'name': 'download_android_tools',
-    'pattern': '.',
-    'action': ['python', 'sdk/tools/android/download_android_tools.py'],
-  },
-  {
     'name': 'buildtools',
     'pattern': '.',
     'action': ['python', 'sdk/tools/buildtools/update.py'],
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart b/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart
new file mode 100644
index 0000000..8ee78dd
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/EventLoopLatencyJson350KB.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:isolate';
+
+import 'json_benchmark.dart';
+import 'latency.dart';
+
+main() async {
+  // Start GC pressure from helper isolate.
+  final exitPort = ReceivePort();
+  final exitFuture = exitPort.first;
+  final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort);
+
+  // Measure event loop latency.
+  const tickDuration = const Duration(milliseconds: 1);
+  const numberOfTicks = 8 * 1000; // min 8 seconds.
+  final EventLoopLatencyStats stats =
+      await measureEventLoopLatency(tickDuration, numberOfTicks);
+
+  // Kill isolate & wait until it's dead.
+  isolate.kill(priority: Isolate.immediate);
+  await exitFuture;
+
+  // Report event loop latency statistics.
+  stats.report('EventLoopLatencyJson350KB');
+}
+
+void run(dynamic msg) {
+  while (true) {
+    JsonRoundTripBenchmark().run();
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart b/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart
new file mode 100644
index 0000000..5b819ba
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/json_benchmark.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:math';
+import 'dart:convert';
+
+class JsonRoundTripBenchmark {
+  void run() {
+    final res = json.decode(jsonData);
+    final out = json.encode(res);
+    if (out[0] != jsonData[0]) {
+      throw 'json conversion error';
+    }
+  }
+}
+
+// Builds around 350 KB of json data - small enough so the decoded object graph
+// fits into new space.
+final String jsonData = () {
+  final rnd = Random(42);
+  dynamic buildTree(int depth) {
+    final int coin = rnd.nextInt(1000);
+    if (depth == 0) {
+      if (coin % 2 == 0) return coin;
+      return 'foo-$coin';
+    }
+
+    if (coin % 2 == 0) {
+      final map = <String, dynamic>{};
+      final int length = rnd.nextInt(19);
+      for (int i = 0; i < length; ++i) {
+        map['bar-$i'] = buildTree(depth - 1);
+      }
+      return map;
+    } else {
+      final list = <dynamic>[];
+      final int length = rnd.nextInt(18);
+      for (int i = 0; i < length; ++i) {
+        list.add(buildTree(depth - 1));
+      }
+      return list;
+    }
+  }
+
+  return json.encode({'data': buildTree(5)});
+}();
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart b/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart
new file mode 100644
index 0000000..5da9f4e
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart/latency.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2020, 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.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+/// Measures event loop responsiveness.
+///
+/// Schedules new timer events, [tickDuration] in the future, and measures how
+/// long it takes for these events to actually arrive.
+///
+/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats].
+Future<EventLoopLatencyStats> measureEventLoopLatency(
+    Duration tickDuration, int numberOfTicks) {
+  final completer = Completer<EventLoopLatencyStats>();
+
+  final tickDurationInUs = tickDuration.inMicroseconds;
+  final buffer = _TickLatencies(numberOfTicks);
+  final sw = Stopwatch()..start();
+  int lastTimestamp = 0;
+
+  void trigger() {
+    final int currentTimestamp = sw.elapsedMicroseconds;
+
+    // Every tick we missed to schedule we'll add with difference to when we
+    // would've scheduled it and when we became responsive again.
+    bool done = false;
+    while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) {
+      done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs);
+      lastTimestamp += tickDurationInUs;
+    }
+
+    if (!done) {
+      lastTimestamp = currentTimestamp;
+      Timer(tickDuration, trigger);
+    } else {
+      completer.complete(buffer.makeStats());
+    }
+  }
+
+  Timer(tickDuration, trigger);
+
+  return completer.future;
+}
+
+/// Result of the event loop latency measurement.
+class EventLoopLatencyStats {
+  /// Minimum latency between scheduling a tick and it's arrival (in ms).
+  final double minLatency;
+
+  /// Average latency between scheduling a tick and it's arrival (in ms).
+  final double avgLatency;
+
+  /// Maximum latency between scheduling a tick and it's arrival (in ms).
+  final double maxLatency;
+
+  /// The 50th percentile (median) (in ms).
+  final double percentile50th;
+
+  /// The 90th percentile (in ms).
+  final double percentile90th;
+
+  /// The 95th percentile (in ms).
+  final double percentile95th;
+
+  /// The 99th percentile (in ms).
+  final double percentile99th;
+
+  /// The maximum RSS of the process.
+  final int maxRss;
+
+  EventLoopLatencyStats(
+      this.minLatency,
+      this.avgLatency,
+      this.maxLatency,
+      this.percentile50th,
+      this.percentile90th,
+      this.percentile95th,
+      this.percentile99th,
+      this.maxRss);
+
+  void report(String name) {
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
+    print('$name.MaxRss(MemoryUse): $maxRss');
+  }
+}
+
+/// Accumulates tick latencies and makes statistics for it.
+class _TickLatencies {
+  final Uint64List _timestamps;
+  int _index = 0;
+
+  _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks);
+
+  /// Returns `true` while the buffer has not been filled yet.
+  bool add(int latencyInUs) {
+    _timestamps[_index++] = latencyInUs;
+    return _index < _timestamps.length;
+  }
+
+  EventLoopLatencyStats makeStats() {
+    if (_index != _timestamps.length) {
+      throw 'Buffer has not been fully filled yet.';
+    }
+
+    _timestamps.sort();
+    final length = _timestamps.length;
+    final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length;
+    final int min = _timestamps.fold(0x7fffffffffffffff, math.min);
+    final int max = _timestamps.fold(0, math.max);
+    final percentile50th = _timestamps[50 * length ~/ 100];
+    final percentile90th = _timestamps[90 * length ~/ 100];
+    final percentile95th = _timestamps[95 * length ~/ 100];
+    final percentile99th = _timestamps[99 * length ~/ 100];
+
+    return EventLoopLatencyStats(
+        min / 1000,
+        avg / 1000,
+        max / 1000,
+        percentile50th / 1000,
+        percentile90th / 1000,
+        percentile95th / 1000,
+        percentile99th / 1000,
+        ProcessInfo.maxRss);
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart
new file mode 100644
index 0000000..64e6721
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/EventLoopLatencyJson350KB.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:isolate';
+
+import 'json_benchmark.dart';
+import 'latency.dart';
+
+main() async {
+  // Start GC pressure from helper isolate.
+  final exitPort = ReceivePort();
+  final exitFuture = exitPort.first;
+  final isolate = await Isolate.spawn(run, null, onExit: exitPort.sendPort);
+
+  // Measure event loop latency.
+  const tickDuration = const Duration(milliseconds: 1);
+  const numberOfTicks = 8 * 1000; // min 8 seconds.
+  final EventLoopLatencyStats stats =
+      await measureEventLoopLatency(tickDuration, numberOfTicks);
+
+  // Kill isolate & wait until it's dead.
+  isolate.kill(priority: Isolate.immediate);
+  await exitFuture;
+
+  // Report event loop latency statistics.
+  stats.report('EventLoopLatencyJson350KB');
+}
+
+void run(dynamic msg) {
+  while (true) {
+    JsonRoundTripBenchmark().run();
+  }
+}
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart
new file mode 100644
index 0000000..ba09949
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/json_benchmark.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:math';
+import 'dart:convert';
+
+class JsonRoundTripBenchmark {
+  void run() {
+    final res = json.decode(jsonData);
+    final out = json.encode(res);
+    if (out[0] != jsonData[0]) {
+      throw 'json conversion error';
+    }
+  }
+}
+
+// Builds around 350 KB of json data - small enough so the decoded object graph
+// fits into new space.
+final String jsonData = () {
+  final rnd = Random(42);
+  dynamic buildTree(int depth) {
+    final int coin = rnd.nextInt(1000);
+    if (depth == 0) {
+      if (coin % 2 == 0) return coin;
+      return 'foo-$coin';
+    }
+
+    if (coin % 2 == 0) {
+      final map = <String, dynamic>{};
+      final int length = rnd.nextInt(19);
+      for (int i = 0; i < length; ++i) {
+        map['bar-$i'] = buildTree(depth - 1);
+      }
+      return map;
+    } else {
+      final list = <dynamic>[];
+      final int length = rnd.nextInt(18);
+      for (int i = 0; i < length; ++i) {
+        list.add(buildTree(depth - 1));
+      }
+      return list;
+    }
+  }
+
+  return json.encode({'data': buildTree(5)});
+}();
diff --git a/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart b/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart
new file mode 100644
index 0000000..44ecae6
--- /dev/null
+++ b/benchmarks/EventLoopLatencyJson350KB/dart2/latency.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2020, 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.
+
+// @dart=2.9
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+/// Measures event loop responsiveness.
+///
+/// Schedules new timer events, [tickDuration] in the future, and measures how
+/// long it takes for these events to actually arrive.
+///
+/// Runs [numberOfTicks] times before completing with [EventLoopLatencyStats].
+Future<EventLoopLatencyStats> measureEventLoopLatency(
+    Duration tickDuration, int numberOfTicks) {
+  final completer = Completer<EventLoopLatencyStats>();
+
+  final tickDurationInUs = tickDuration.inMicroseconds;
+  final buffer = _TickLatencies(numberOfTicks);
+  final sw = Stopwatch()..start();
+  int lastTimestamp = 0;
+
+  void trigger() {
+    final int currentTimestamp = sw.elapsedMicroseconds;
+
+    // Every tick we missed to schedule we'll add with difference to when we
+    // would've scheduled it and when we became responsive again.
+    bool done = false;
+    while (!done && lastTimestamp < (currentTimestamp - tickDurationInUs)) {
+      done = !buffer.add(currentTimestamp - lastTimestamp - tickDurationInUs);
+      lastTimestamp += tickDurationInUs;
+    }
+
+    if (!done) {
+      lastTimestamp = currentTimestamp;
+      Timer(tickDuration, trigger);
+    } else {
+      completer.complete(buffer.makeStats());
+    }
+  }
+
+  Timer(tickDuration, trigger);
+
+  return completer.future;
+}
+
+/// Result of the event loop latency measurement.
+class EventLoopLatencyStats {
+  /// Minimum latency between scheduling a tick and it's arrival (in ms).
+  final double minLatency;
+
+  /// Average latency between scheduling a tick and it's arrival (in ms).
+  final double avgLatency;
+
+  /// Maximum latency between scheduling a tick and it's arrival (in ms).
+  final double maxLatency;
+
+  /// The 50th percentile (median) (in ms).
+  final double percentile50th;
+
+  /// The 90th percentile (in ms).
+  final double percentile90th;
+
+  /// The 95th percentile (in ms).
+  final double percentile95th;
+
+  /// The 99th percentile (in ms).
+  final double percentile99th;
+
+  /// The maximum RSS of the process.
+  final int maxRss;
+
+  EventLoopLatencyStats(
+      this.minLatency,
+      this.avgLatency,
+      this.maxLatency,
+      this.percentile50th,
+      this.percentile90th,
+      this.percentile95th,
+      this.percentile99th,
+      this.maxRss);
+
+  void report(String name) {
+    print('$name.Min(RunTimeRaw): $minLatency ms.');
+    print('$name.Avg(RunTimeRaw): $avgLatency ms.');
+    print('$name.Percentile50(RunTimeRaw): $percentile50th ms.');
+    print('$name.Percentile90(RunTimeRaw): $percentile90th ms.');
+    print('$name.Percentile95(RunTimeRaw): $percentile95th ms.');
+    print('$name.Percentile99(RunTimeRaw): $percentile99th ms.');
+    print('$name.Max(RunTimeRaw): $maxLatency ms.');
+    print('$name.MaxRss(MemoryUse): $maxRss');
+  }
+}
+
+/// Accumulates tick latencies and makes statistics for it.
+class _TickLatencies {
+  final Uint64List _timestamps;
+  int _index = 0;
+
+  _TickLatencies(int numberOfTicks) : _timestamps = Uint64List(numberOfTicks);
+
+  /// Returns `true` while the buffer has not been filled yet.
+  bool add(int latencyInUs) {
+    _timestamps[_index++] = latencyInUs;
+    return _index < _timestamps.length;
+  }
+
+  EventLoopLatencyStats makeStats() {
+    if (_index != _timestamps.length) {
+      throw 'Buffer has not been fully filled yet.';
+    }
+
+    _timestamps.sort();
+    final length = _timestamps.length;
+    final double avg = _timestamps.fold(0, (int a, int b) => a + b) / length;
+    final int min = _timestamps.fold(0x7fffffffffffffff, math.min);
+    final int max = _timestamps.fold(0, math.max);
+    final percentile50th = _timestamps[50 * length ~/ 100];
+    final percentile90th = _timestamps[90 * length ~/ 100];
+    final percentile95th = _timestamps[95 * length ~/ 100];
+    final percentile99th = _timestamps[99 * length ~/ 100];
+
+    return EventLoopLatencyStats(
+        min / 1000,
+        avg / 1000,
+        max / 1000,
+        percentile50th / 1000,
+        percentile90th / 1000,
+        percentile95th / 1000,
+        percentile99th / 1000,
+        ProcessInfo.maxRss);
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index d701947..177e1ae 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -5902,6 +5902,42 @@
         tip: r"""Try replacing them with named parameters instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateJsInteropDartClassExtendsJSClass = const Template<
+        Message Function(String name, String name2)>(
+    messageTemplate:
+        r"""Dart class '#name' cannot extend JS interop class '#name2'.""",
+    tipTemplate:
+        r"""Try adding the JS interop annotation or removing it from the parent class.""",
+    withArguments: _withArgumentsJsInteropDartClassExtendsJSClass);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeJsInteropDartClassExtendsJSClass =
+    const Code<Message Function(String name, String name2)>(
+  "JsInteropDartClassExtendsJSClass",
+  templateJsInteropDartClassExtendsJSClass,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsJsInteropDartClassExtendsJSClass(
+    String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  return new Message(codeJsInteropDartClassExtendsJSClass,
+      message:
+          """Dart class '${name}' cannot extend JS interop class '${name2}'.""",
+      tip:
+          """Try adding the JS interop annotation or removing it from the parent class.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropEnclosingClassJSAnnotation =
     messageJsInteropEnclosingClassJSAnnotation;
 
@@ -5934,6 +5970,42 @@
     tip: r"""Try replacing with a normal method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        String
+            name2)> templateJsInteropJSClassExtendsDartClass = const Template<
+        Message Function(String name, String name2)>(
+    messageTemplate:
+        r"""JS interop class '#name' cannot extend Dart class '#name2'.""",
+    tipTemplate:
+        r"""Try removing the JS interop annotation or adding it to the parent class.""",
+    withArguments: _withArgumentsJsInteropJSClassExtendsDartClass);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+    codeJsInteropJSClassExtendsDartClass =
+    const Code<Message Function(String name, String name2)>(
+  "JsInteropJSClassExtendsDartClass",
+  templateJsInteropJSClassExtendsDartClass,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsJsInteropJSClassExtendsDartClass(
+    String name, String name2) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  return new Message(codeJsInteropJSClassExtendsDartClass,
+      message:
+          """JS interop class '${name}' cannot extend Dart class '${name2}'.""",
+      tip:
+          """Try removing the JS interop annotation or adding it to the parent class.""",
+      arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropNamedParameters = messageJsInteropNamedParameters;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 922d458..260937a 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.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.
 
+import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
@@ -14,16 +15,19 @@
         messageJsInteropIndexNotSupported,
         messageJsInteropNamedParameters,
         messageJsInteropNonExternalConstructor,
-        messageJsInteropNonExternalMember;
+        messageJsInteropNonExternalMember,
+        templateJsInteropDartClassExtendsJSClass,
+        templateJsInteropJSClassExtendsDartClass;
 
 import 'src/js_interop.dart';
 
 class JsInteropChecks extends RecursiveVisitor<void> {
+  final CoreTypes _coreTypes;
   final DiagnosticReporter<Message, LocatedMessage> _diagnosticsReporter;
   bool _classHasJSAnnotation = false;
   bool _libraryHasJSAnnotation = false;
 
-  JsInteropChecks(this._diagnosticsReporter);
+  JsInteropChecks(this._coreTypes, this._diagnosticsReporter);
 
   @override
   void defaultMember(Member member) {
@@ -36,6 +40,25 @@
   @override
   void visitClass(Class cls) {
     _classHasJSAnnotation = hasJSInteropAnnotation(cls);
+    var superclass = cls.superclass;
+    if (superclass != null && superclass != _coreTypes.objectClass) {
+      var superHasJSAnnotation = hasJSInteropAnnotation(superclass);
+      if (_classHasJSAnnotation && !superHasJSAnnotation) {
+        _diagnosticsReporter.report(
+            templateJsInteropJSClassExtendsDartClass.withArguments(
+                cls.name, superclass.name),
+            cls.fileOffset,
+            cls.name.length,
+            cls.location.file);
+      } else if (!_classHasJSAnnotation && superHasJSAnnotation) {
+        _diagnosticsReporter.report(
+            templateJsInteropDartClassExtendsJSClass.withArguments(
+                cls.name, superclass.name),
+            cls.fileOffset,
+            cls.name.length,
+            cls.location.file);
+      }
+    }
     super.visitClass(cls);
     _classHasJSAnnotation = false;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index e24981c..dfece89 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -41,6 +41,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_interpolation_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_non_null_assertion.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_this_expression.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
@@ -332,7 +333,10 @@
   /// A map from an error code to a generator used to create the correction
   /// producer used to build a fix for that diagnostic. The generators used for
   /// lint rules are in the [lintProducerMap].
-  static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {};
+  static const Map<ErrorCode, ProducerGenerator> nonLintProducerMap = {
+    StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION:
+        RemoveNonNullAssertion.newInstance,
+  };
 
   /// Information about the workspace containing the libraries in which changes
   /// will be produced.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
new file mode 100644
index 0000000..ff01bf5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_non_null_assertion.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, 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.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveNonNullAssertion extends CorrectionProducer {
+  @override
+  FixKind get fixKind => DartFixKind.REMOVE_NON_NULL_ASSERTION;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    final expression = node;
+
+    if (expression is PostfixExpression &&
+        expression.operator.type == TokenType.BANG) {
+      var bangToken = expression.operator;
+
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addDeletion(range.startStart(bangToken, bangToken.next));
+      });
+    }
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static RemoveNonNullAssertion newInstance() => RemoveNonNullAssertion();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 534d910..fe6cbc4 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -365,6 +365,8 @@
       'dart.fix.remove.methodDeclaration', 50, 'Remove method declaration');
   static const REMOVE_NAME_FROM_COMBINATOR = FixKind(
       'dart.fix.remove.nameFromCombinator', 50, "Remove name from '{0}'");
+  static const REMOVE_NON_NULL_ASSERTION =
+      FixKind('dart.fix.remove.nonNullAssertion', 50, "Remove the '!'");
   static const REMOVE_OPERATOR =
       FixKind('dart.fix.remove.operator', 50, 'Remove the operator');
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index f7ef511..ef8c359 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -101,6 +101,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_interpolation_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_method_declaration.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_name_from_combinator.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_non_null_assertion.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_operator.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_parameters_in_getter_declaration.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_parentheses_in_getter_invocation.dart';
@@ -1074,6 +1075,9 @@
     StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH: [
       AddMissingEnumCaseClauses.newInstance,
     ],
+    StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION: [
+      RemoveNonNullAssertion.newInstance,
+    ],
   };
 
   final DartFixContext fixContext;
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 8d42a9b7..7d5e49a 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
@@ -79,9 +78,8 @@
 
   String get workspaceRootPath => '/home';
 
-  Source addSource(String path, String content, [Uri uri]) {
-    var file = newFile(path, content: content);
-    return file.createSource(uri);
+  void addSource(String path, String content) {
+    newFile(path, content: content);
   }
 
   Future<void> analyzeTestPackageFiles() async {
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index b0ff7f7..504662a 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer/src/test_utilities/platform.dart';
 import 'package:test/test.dart';
@@ -27,7 +26,6 @@
 
   String testCode;
   String testFile;
-  Source testSource;
   ResolvedUnitResult testAnalysisResult;
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
@@ -35,19 +33,19 @@
   FindNode findNode;
 
   @override
-  Source addSource(String path, String content, [Uri uri]) {
+  void addSource(String path, String content) {
     if (useLineEndingsForPlatform) {
       content = normalizeNewlinesForPlatform(content);
     }
-    return super.addSource(path, content, uri);
+    super.addSource(path, content);
   }
 
-  void addTestSource(String code, [Uri uri]) {
+  void addTestSource(String code) {
     if (useLineEndingsForPlatform) {
       code = normalizeNewlinesForPlatform(code);
     }
     testCode = code;
-    testSource = addSource(testFile, code, uri);
+    addSource(testFile, code);
   }
 
   Element findElement(String name, [ElementKind kind]) {
diff --git a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
index 0e1da88..9dfcaf7 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
@@ -77,8 +77,8 @@
     field = {2: local};
   }
 
-  Map field;
-  static int staticField;
+  Map field = {3: 4};
+  static int staticField = 0;
 
   method() {
     // End of line comment
@@ -110,7 +110,7 @@
   return async.Future.wait([]);
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 ''';
     await computeHighlights(pathname, text);
     // There should be 1 error due to the fact that unresolvedIdentifier is
@@ -141,10 +141,10 @@
     check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
     check(HighlightRegionType.LITERAL_BOOLEAN, ['true']);
     check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
-    check(HighlightRegionType.LITERAL_INTEGER, ['2', '42']);
+    check(HighlightRegionType.LITERAL_INTEGER, ['2', '3', '4', '0', '42']);
     check(HighlightRegionType.LITERAL_LIST, ['[]']);
-    check(
-        HighlightRegionType.LITERAL_MAP, ['{1.0: [].toList()}', '{2: local}']);
+    check(HighlightRegionType.LITERAL_MAP,
+        ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
     check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
     check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_DECLARATION, ['local']);
     check(HighlightRegionType.DYNAMIC_LOCAL_VARIABLE_REFERENCE, ['local']);
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index c7bce82..63f668b 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -66,8 +66,8 @@
     field = {2: local};
   }
 
-  Map field;
-  static int staticField;
+  Map field = {3: 4};
+  static int staticField = 0;
 
   method() {
     // End of line comment
@@ -98,7 +98,7 @@
   return async.Future.wait([]);
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 ''';
     await computeHighlights(pathname, text);
     // There should be 1 error due to the fact that unresolvedIdentifier is
@@ -128,10 +128,10 @@
     check(HighlightRegionType.KEYWORD, ['class', 'extends', 'true', 'return']);
     check(HighlightRegionType.LITERAL_BOOLEAN, ['true']);
     check(HighlightRegionType.LITERAL_DOUBLE, ['1.0']);
-    check(HighlightRegionType.LITERAL_INTEGER, ['2', '42']);
+    check(HighlightRegionType.LITERAL_INTEGER, ['2', '3', '4', '0', '42']);
     check(HighlightRegionType.LITERAL_LIST, ['[]']);
-    check(
-        HighlightRegionType.LITERAL_MAP, ['{1.0: [].toList()}', '{2: local}']);
+    check(HighlightRegionType.LITERAL_MAP,
+        ['{1.0: [].toList()}', '{2: local}', '{3: 4}']);
     check(HighlightRegionType.LITERAL_STRING, ["'dart:async'", "'string'"]);
     //check(HighlightRegionType.LOCAL_VARIABLE, ['local']);
     //check(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, ['local']);
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 9ba891d..b913d75 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -28,7 +28,7 @@
 class Class<TypeParameter> {
   Class.constructor(); /* constructor declaration */
 
-  TypeParameter field;
+  TypeParameter field = (throw 0);
 
   method() {}
 }
@@ -39,7 +39,7 @@
   print(parameter());
 }
 
-int topLevelVariable;
+int topLevelVariable = 0;
 
 main() {
   Class<int> localVariable = new Class<int>.constructor(); // usage
@@ -115,21 +115,21 @@
         'constructor(); // usage',
         'constructor(); /* constructor declaration */',
         ElementKind.CONSTRUCTOR);
-    checkLocal('field;', 'field;', ElementKind.FIELD);
+    checkLocal('field = (', 'field = (', ElementKind.FIELD);
     checkLocal('function(() => localVariable.field)',
         'function(FunctionTypeAlias parameter)', ElementKind.FUNCTION);
     checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();',
         ElementKind.FUNCTION_TYPE_ALIAS);
-    checkLocal('field)', 'field;', ElementKind.GETTER);
+    checkLocal('field)', 'field = (', ElementKind.GETTER);
     checkRemote("'dart:async'", r'async\.dart$', ElementKind.LIBRARY);
     checkLocal(
         'localVariable.field', 'localVariable =', ElementKind.LOCAL_VARIABLE);
     checkLocal('method();', 'method() {', ElementKind.METHOD);
     checkLocal('parameter());', 'parameter) {', ElementKind.PARAMETER);
-    checkLocal('field = 1', 'field;', ElementKind.SETTER);
-    checkLocal('topLevelVariable;', 'topLevelVariable;',
+    checkLocal('field = 1', 'field = (', ElementKind.SETTER);
+    checkLocal('topLevelVariable = 0;', 'topLevelVariable = 0;',
         ElementKind.TOP_LEVEL_VARIABLE);
-    checkLocal(
-        'TypeParameter field;', 'TypeParameter>', ElementKind.TYPE_PARAMETER);
+    checkLocal('TypeParameter field = (', 'TypeParameter>',
+        ElementKind.TYPE_PARAMETER);
   }
 }
diff --git a/pkg/analysis_server/test/integration/edit/get_assists_test.dart b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
index b500903..015a385 100644
--- a/pkg/analysis_server/test/integration/edit/get_assists_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
@@ -21,7 +21,7 @@
     var text = r'''
 import 'dart:async';
 
-Completer c;
+var c = Completer();
 ''';
     writeFile(pathname, text);
     standardAnalysisSetup();
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 9315f3a..4b8aa22 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -581,7 +581,7 @@
 
   Future<void> _computeUnitAndErrors(String code) async {
     addTestSource(code);
-    var result = await session.getResolvedUnit(testSource.fullName);
+    var result = await session.getResolvedUnit(testFile);
     testUnit = result.unit;
     testErrors = result.errors;
   }
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index 4c50509..88cc25d 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -924,7 +924,7 @@
 
   Future<void> _parseTestUnit(String code) async {
     addTestSource(code);
-    var result = session.getParsedUnit(testSource.fullName);
+    var result = session.getParsedUnit(testFile);
     testUnit = result.unit;
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 5f7b090..fc03973 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -468,7 +468,7 @@
         RefactoringWorkspace([driverFor(testFile)], searchEngine);
     // Allow passing an oldName for when we don't want to rename testSource,
     // but otherwise fall back to testSource.fullname
-    oldFile = convertPath(oldFile ?? testSource.fullName);
+    oldFile = convertPath(oldFile ?? testFile);
     refactoring = MoveFileRefactoring(
         resourceProvider, refactoringWorkspace, testAnalysisResult, oldFile);
     refactoring.newFile = convertPath(newFile);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
index cac4641..b6ac127 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
@@ -35,7 +35,7 @@
   }
 
   @override
-  void addTestSource(String code, [Uri uri]) {
+  void addTestSource(String code) {
     if (useLineEndingsForPlatform) {
       code = normalizeNewlinesForPlatform(code);
     }
@@ -61,7 +61,7 @@
         _length = 0;
       }
     }
-    super.addTestSource(code, uri);
+    super.addTestSource(code);
   }
 
   void assertExitPosition({String before, String after}) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart
new file mode 100644
index 0000000..eeacfbc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_non_null_assertion_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../../abstract_context.dart';
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveNonNullAssertionWithNullSafetyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveNonNullAssertionWithNullSafetyTest extends BulkFixProcessorTest
+    with WithNullSafetyMixin {
+  Future<void> test_singleFile() async {
+    await resolveTestCode('''
+void f(String a) {
+  print(a!!);
+}
+''');
+    await assertHasFix('''
+void f(String a) {
+  print(a);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 5ceaaa3..3b98bfd 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -43,6 +43,7 @@
 import 'remove_initializer_test.dart' as remove_initializer;
 import 'remove_interpolation_braces_test.dart' as remove_interpolation_braces;
 import 'remove_method_declaration_test.dart' as remove_method_declaration;
+import 'remove_non_null_assertion_test.dart' as remove_non_null_assertion;
 import 'remove_operator_test.dart' as remove_operator;
 import 'remove_this_expression_test.dart' as remove_this_expression;
 import 'remove_type_annotation_test.dart' as remove_type_annotation;
@@ -98,6 +99,7 @@
     remove_empty_statement.main();
     remove_interpolation_braces.main();
     remove_method_declaration.main();
+    remove_non_null_assertion.main();
     remove_operator.main();
     remove_this_expression.main();
     remove_type_annotation.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index 55525ff..39a4c16 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -47,11 +47,7 @@
     newFile('$workspaceRootPath/p/lib/lib.dart', content: content);
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(
-          name: 'p',
-          rootPath: '$workspaceRootPath/p',
-          languageVersion: '2.9',
-        ),
+        ..add(name: 'p', rootPath: '$workspaceRootPath/p'),
     );
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 98bd8db..3420914 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -31,8 +31,10 @@
     );
 
     addSource('/home/test/pubspec.yaml', '');
-    var testSource = addSource('/home/test/lib/test.dart', '');
-    var result = await session.getResolvedLibrary(testSource.fullName);
+
+    var testFile = convertPath('/home/test/lib/test.dart');
+    addSource(testFile, '');
+    var result = await session.getResolvedLibrary(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(2));
   }
@@ -41,8 +43,9 @@
     // addTestPackageDependency('p1', '/.pub-cache/p1');
     // addTestPackageDependency('p2', '/.pub-cache/p2');
     addSource('/home/test/pubspec.yaml', '');
-    var testSource = addSource('/home/test/lib/test.dart', '');
-    var result = await session.getResolvedLibrary(testSource.fullName);
+    var testFile = convertPath('/home/test/lib/test.dart');
+    addSource(testFile, '');
+    var result = await session.getResolvedLibrary(testFile);
     var sets = manager.forLibrary(result.element);
     expect(sets, hasLength(0));
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index 27092f2..b474c5a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -29,9 +29,6 @@
 /// A base class defining support for writing fix processor tests that are
 /// specific to fixes associated with lints that use the FixKind.
 abstract class FixProcessorLintTest extends FixProcessorTest {
-  /// The offset of the lint marker in the code being analyzed.
-  int lintOffset = -1;
-
   /// Return the lint code being tested.
   String get lintCode;
 
@@ -45,21 +42,6 @@
   void _createAnalysisOptionsFile() {
     createAnalysisOptionsFile(experiments: experiments, lints: [lintCode]);
   }
-
-  /// Find the error that is to be fixed by computing the errors in the file,
-  /// using the [errorFilter] to filter out errors that should be ignored, and
-  /// expecting that there is a single remaining error. The error filter should
-  /// return `true` if the error should not be ignored.
-  @override
-  Future<AnalysisError> _findErrorToFix(
-      bool Function(AnalysisError) errorFilter,
-      {int length}) async {
-    if (lintOffset < 0) {
-      return super._findErrorToFix(errorFilter, length: 0);
-    }
-    return AnalysisError(
-        testSource, lintOffset, length ?? 0, LintCode(lintCode, '<ignored>'));
-  }
 }
 
 /// A base class defining support for writing fix processor tests.
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart
new file mode 100644
index 0000000..d66f1b8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_non_null_assertion_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../abstract_context.dart';
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveNonNullAssertionWithNullSafetyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveNonNullAssertionWithNullSafetyTest extends FixProcessorTest
+    with WithNullSafetyMixin {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_NON_NULL_ASSERTION;
+
+  Future<void> test_nonNullable() async {
+    await resolveTestCode('''
+void f(String a) {
+  print(a!);
+}
+''');
+    await assertHasFix('''
+void f(String a) {
+  print(a);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index d795e61..6b82811 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -115,6 +115,7 @@
 import 'remove_interpolation_braces_test.dart' as remove_interpolation_braces;
 import 'remove_method_declaration_test.dart' as remove_method_declaration;
 import 'remove_name_from_combinator_test.dart' as remove_name_from_combinator;
+import 'remove_non_null_assertion_test.dart' as remove_non_null_assertion_test;
 import 'remove_operator_test.dart' as remove_operator;
 import 'remove_parameters_in_getter_declaration_test.dart'
     as remove_parameters_in_getter_declaration;
@@ -271,6 +272,7 @@
     remove_interpolation_braces.main();
     remove_method_declaration.main();
     remove_name_from_combinator.main();
+    remove_non_null_assertion_test.main();
     remove_operator.main();
     remove_parameters_in_getter_declaration.main();
     remove_parentheses_in_getter_invocation.main();
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 6177894..57c4895 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -85,7 +85,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 112;
+  static const int DATA_VERSION = 113;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index cd7f1bb..0093170 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/deprecated_member_use_verifier.dart';
 import 'package:analyzer/src/error/must_call_super_verifier.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -46,10 +47,6 @@
   /// in the scope of a class.
   ClassElementImpl _enclosingClass;
 
-  /// A flag indicating whether a surrounding member (compilation unit or class)
-  /// is deprecated.
-  bool _inDeprecatedMember;
-
   /// A flag indicating whether a surrounding member is annotated as
   /// `@doNotStore`.
   bool _inDoNotStoreMember;
@@ -71,6 +68,8 @@
 
   final _InvalidAccessVerifier _invalidAccessVerifier;
 
+  final DeprecatedMemberUseVerifier _deprecatedVerifier;
+
   final MustCallSuperVerifier _mustCallSuperVerifier;
 
   /// The [WorkspacePackage] in which [_currentLibrary] is declared.
@@ -107,9 +106,11 @@
         _inheritanceManager = inheritanceManager,
         _invalidAccessVerifier = _InvalidAccessVerifier(
             _errorReporter, _currentLibrary, workspacePackage),
+        _deprecatedVerifier =
+            DeprecatedMemberUseVerifier(workspacePackage, _errorReporter),
         _mustCallSuperVerifier = MustCallSuperVerifier(_errorReporter),
         _workspacePackage = workspacePackage {
-    _inDeprecatedMember = _currentLibrary.hasDeprecated;
+    _deprecatedVerifier.pushInDeprecatedValue(_currentLibrary.hasDeprecated);
     _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
 
     _linterContext = LinterContextImpl(
@@ -267,17 +268,6 @@
   }
 
   @override
-  void visitArgumentList(ArgumentList node) {
-    for (Expression argument in node.arguments) {
-      ParameterElement parameter = argument.staticParameterElement;
-      if (parameter?.isOptionalPositional == true) {
-        _checkForDeprecatedMemberUse(parameter, argument);
-      }
-    }
-    super.visitArgumentList(node);
-  }
-
-  @override
   void visitAsExpression(AsExpression node) {
     if (isUnnecessaryCast(node, _typeSystem)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
@@ -287,17 +277,14 @@
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    TokenType operatorType = node.operator.type;
-    if (operatorType != TokenType.EQ) {
-      _checkForDeprecatedMemberUse(node.staticElement, node);
-    }
+    _deprecatedVerifier.assignmentExpression(node);
     super.visitAssignmentExpression(node);
   }
 
   @override
   void visitBinaryExpression(BinaryExpression node) {
     _checkForDivisionOptimizationHint(node);
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.binaryExpression(node);
     _checkForInvariantNullComparison(node);
     super.visitBinaryExpression(node);
   }
@@ -314,11 +301,8 @@
     _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = element;
 
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -332,7 +316,7 @@
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
@@ -362,13 +346,13 @@
 
   @override
   void visitConstructorName(ConstructorName node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.constructorName(node);
     super.visitConstructorName(node);
   }
 
   @override
   void visitExportDirective(ExportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
+    _deprecatedVerifier.exportDirective(node);
     _checkForInternalExport(node);
     super.visitExportDirective(node);
   }
@@ -381,10 +365,7 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedMetadata(node.metadata);
 
     try {
       super.visitFieldDeclaration(node);
@@ -421,7 +402,7 @@
         _checkForAssignmentOfDoNotStore(field.initializer);
       }
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
@@ -433,12 +414,9 @@
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -454,7 +432,7 @@
           body: node.functionExpression.body);
       super.visitFunctionDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
@@ -480,12 +458,7 @@
 
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    var callElement = node.staticElement;
-    if (callElement is MethodElement &&
-        callElement.name == FunctionElement.CALL_METHOD_NAME) {
-      _checkForDeprecatedMemberUse(callElement, node);
-    }
-
+    _deprecatedVerifier.functionExpressionInvocation(node);
     super.visitFunctionExpressionInvocation(node);
   }
 
@@ -525,7 +498,7 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
-    _checkForDeprecatedMemberUse(node.uriElement, node);
+    _deprecatedVerifier.importDirective(node);
     ImportElement importElement = node.element;
     if (importElement != null && importElement.isDeferred) {
       _checkForLoadLibraryFunction(node, importElement);
@@ -536,12 +509,13 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.indexExpression(node);
     super.visitIndexExpression(node);
   }
 
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _deprecatedVerifier.instanceCreationExpression(node);
     _checkForLiteralConstructorUse(node);
     super.visitInstanceCreationExpression(node);
   }
@@ -554,7 +528,6 @@
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     ExecutableElement element = node.declaredElement;
     Element enclosingElement = element?.enclosingElement;
@@ -576,9 +549,7 @@
                 forSuper: true)
             : null;
 
-    if (element != null && element.hasDeprecated) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
     if (element != null && element.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
@@ -608,26 +579,25 @@
 
       super.visitMethodDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
       _inDoNotStoreMember = wasInDoNotStoreMember;
     }
   }
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
+    _deprecatedVerifier.methodInvocation(node);
     _checkForNullAwareHints(node, node.operator);
     super.visitMethodInvocation(node);
   }
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
-    _enclosingClass = node.declaredElement;
+    var element = node.declaredElement;
+    _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = _enclosingClass;
 
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedValue(element.hasDeprecated);
 
     try {
       _checkForImmutable(node);
@@ -636,19 +606,19 @@
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.postfixExpression(node);
     super.visitPostfixExpression(node);
   }
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.prefixExpression(node);
     super.visitPrefixExpression(node);
   }
 
@@ -661,7 +631,7 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.redirectingConstructorInvocation(node);
     super.visitRedirectingConstructorInvocation(node);
   }
 
@@ -679,24 +649,22 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    _checkForDeprecatedMemberUseAtIdentifier(node);
+    _deprecatedVerifier.simpleIdentifier(node);
     _invalidAccessVerifier.verify(node);
     super.visitSimpleIdentifier(node);
   }
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _checkForDeprecatedMemberUse(node.staticElement, node);
+    _deprecatedVerifier.superConstructorInvocation(node);
     _invalidAccessVerifier.verifySuperConstructorInvocation(node);
     super.visitSuperConstructorInvocation(node);
   }
 
   @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    bool wasInDeprecatedMember = _inDeprecatedMember;
-    if (_hasDeprecatedAnnotation(node.metadata)) {
-      _inDeprecatedMember = true;
-    }
+    _deprecatedVerifier.pushInDeprecatedMetadata(node.metadata);
+
     for (var decl in node.variables.variables) {
       _checkForAssignmentOfDoNotStore(decl.initializer);
     }
@@ -704,7 +672,7 @@
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      _inDeprecatedMember = wasInDeprecatedMember;
+      _deprecatedVerifier.popInDeprecated();
     }
   }
 
@@ -804,114 +772,6 @@
     }
   }
 
-  /// Given some [element], look at the associated metadata and report the use
-  /// of the member if it is declared as deprecated. If a diagnostic is reported
-  /// it should be reported at the given [node].
-  void _checkForDeprecatedMemberUse(Element element, AstNode node) {
-    bool isDeprecated(Element element) {
-      if (element is PropertyAccessorElement && element.isSynthetic) {
-        // TODO(brianwilkerson) Why isn't this the implementation for PropertyAccessorElement?
-        Element variable = element.variable;
-        if (variable == null) {
-          return false;
-        }
-        return variable.hasDeprecated;
-      }
-      return element.hasDeprecated;
-    }
-
-    bool isLocalParameter(Element element, AstNode node) {
-      if (element is ParameterElement) {
-        ExecutableElement definingFunction = element.enclosingElement;
-        FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
-        while (body != null) {
-          ExecutableElement enclosingFunction;
-          AstNode parent = body.parent;
-          if (parent is ConstructorDeclaration) {
-            enclosingFunction = parent.declaredElement;
-          } else if (parent is FunctionExpression) {
-            enclosingFunction = parent.declaredElement;
-          } else if (parent is MethodDeclaration) {
-            enclosingFunction = parent.declaredElement;
-          }
-          if (enclosingFunction == definingFunction) {
-            return true;
-          }
-          body = parent?.thisOrAncestorOfType<FunctionBody>();
-        }
-      }
-      return false;
-    }
-
-    if (!_inDeprecatedMember &&
-        element != null &&
-        isDeprecated(element) &&
-        !isLocalParameter(element, node)) {
-      String displayName = element.displayName;
-      if (element is ConstructorElement) {
-        // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
-        // or have the logic centralized elsewhere, instead of doing this logic
-        // here.
-        displayName = element.enclosingElement.displayName;
-        if (element.displayName.isNotEmpty) {
-          displayName = "$displayName.${element.displayName}";
-        }
-      } else if (element is LibraryElement) {
-        displayName = element.definingCompilationUnit.source.uri.toString();
-      } else if (node is MethodInvocation &&
-          displayName == FunctionElement.CALL_METHOD_NAME) {
-        var invokeType = node.staticInvokeType as InterfaceType;
-        if (invokeType is InterfaceType) {
-          var invokeClass = invokeType.element;
-          displayName = "${invokeClass.name}.${element.displayName}";
-        }
-      }
-      LibraryElement library =
-          element is LibraryElement ? element : element.library;
-      String message = _deprecatedMessage(element);
-      if (message == null || message.isEmpty) {
-        HintCode hintCode = _isLibraryInWorkspacePackage(library)
-            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
-            : HintCode.DEPRECATED_MEMBER_USE;
-        _errorReporter.reportErrorForNode(hintCode, node, [displayName]);
-      } else {
-        HintCode hintCode = _isLibraryInWorkspacePackage(library)
-            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE
-            : HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE;
-        _errorReporter
-            .reportErrorForNode(hintCode, node, [displayName, message]);
-      }
-    }
-  }
-
-  /// For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
-  /// if the node is not in a declaration context.
-  ///
-  /// Also, if the identifier is a constructor name in a constructor invocation,
-  /// then calls to the deprecated constructor will be caught by
-  /// [visitInstanceCreationExpression] and
-  /// [visitSuperConstructorInvocation], and can be ignored by
-  /// this visit method.
-  ///
-  /// @param identifier some simple identifier to check for deprecated use of
-  /// @return `true` if and only if a hint code is generated on the passed node
-  /// See [HintCode.DEPRECATED_MEMBER_USE].
-  void _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
-    if (identifier.inDeclarationContext()) {
-      return;
-    }
-    AstNode parent = identifier.parent;
-    if ((parent is ConstructorName && identical(identifier, parent.name)) ||
-        (parent is ConstructorDeclaration &&
-            identical(identifier, parent.returnType)) ||
-        (parent is SuperConstructorInvocation &&
-            identical(identifier, parent.constructorName)) ||
-        parent is HideCombinator) {
-      return;
-    }
-    _checkForDeprecatedMemberUse(identifier.writeOrReadElement, identifier);
-  }
-
   /// Check for the passed binary expression for the
   /// [HintCode.DIVISION_OPTIMIZATION].
   ///
@@ -1746,35 +1606,6 @@
     return true;
   }
 
-  /// Return the message in the deprecated annotation on the given [element], or
-  /// `null` if the element doesn't have a deprecated annotation or if the
-  /// annotation does not have a message.
-  static String _deprecatedMessage(Element element) {
-    // Implicit getters/setters.
-    if (element.isSynthetic && element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    ElementAnnotationImpl annotation = element.metadata.firstWhere(
-      (e) => e.isDeprecated,
-      orElse: () => null,
-    );
-    if (annotation == null || annotation.element is PropertyAccessorElement) {
-      return null;
-    }
-    DartObject constantValue = annotation.computeConstantValue();
-    return constantValue?.getField('message')?.toStringValue() ??
-        constantValue?.getField('expires')?.toStringValue();
-  }
-
-  static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
-    for (var i = 0; i < annotations.length; i++) {
-      if (annotations[i].elementAnnotation.isDeprecated) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   static bool _hasNonVirtualAnnotation(ExecutableElement element) {
     if (element == null) {
       return false;
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
new file mode 100644
index 0000000..25c7280
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -0,0 +1,335 @@
+// Copyright (c) 2020, 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.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/constant/value.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+
+class DeprecatedMemberUseVerifier {
+  final WorkspacePackage _workspacePackage;
+  final ErrorReporter _errorReporter;
+
+  /// We push a new value every time when we enter into a scope which
+  /// can be marked as deprecated - a class, a method, fields (multiple).
+  final List<bool> _inDeprecatedMemberStack = [false];
+
+  DeprecatedMemberUseVerifier(this._workspacePackage, this._errorReporter);
+
+  void assignmentExpression(AssignmentExpression node) {
+    _checkForDeprecated(node.readElement, node.leftHandSide);
+    _checkForDeprecated(node.writeElement, node.leftHandSide);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void binaryExpression(BinaryExpression node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void constructorName(ConstructorName node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void exportDirective(ExportDirective node) {
+    _checkForDeprecated(node.uriElement, node);
+  }
+
+  void functionExpressionInvocation(FunctionExpressionInvocation node) {
+    var callElement = node.staticElement;
+    if (callElement is MethodElement &&
+        callElement.name == FunctionElement.CALL_METHOD_NAME) {
+      _checkForDeprecated(callElement, node);
+    }
+  }
+
+  void importDirective(ImportDirective node) {
+    _checkForDeprecated(node.uriElement, node);
+  }
+
+  void indexExpression(IndexExpression node) {
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void instanceCreationExpression(InstanceCreationExpression node) {
+    _invocationArguments(
+      node.constructorName.staticElement,
+      node.argumentList,
+    );
+  }
+
+  void methodInvocation(MethodInvocation node) {
+    _invocationArguments(
+      node.methodName.staticElement,
+      node.argumentList,
+    );
+  }
+
+  void popInDeprecated() {
+    _inDeprecatedMemberStack.removeLast();
+  }
+
+  void postfixExpression(PostfixExpression node) {
+    _checkForDeprecated(node.readElement, node.operand);
+    _checkForDeprecated(node.writeElement, node.operand);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void prefixExpression(PrefixExpression node) {
+    _checkForDeprecated(node.readElement, node.operand);
+    _checkForDeprecated(node.writeElement, node.operand);
+    _checkForDeprecated(node.staticElement, node);
+  }
+
+  void pushInDeprecatedMetadata(List<Annotation> metadata) {
+    var hasDeprecated = _hasDeprecatedAnnotation(metadata);
+    pushInDeprecatedValue(hasDeprecated);
+  }
+
+  void pushInDeprecatedValue(bool value) {
+    var newValue = _inDeprecatedMemberStack.last || value;
+    _inDeprecatedMemberStack.add(newValue);
+  }
+
+  void redirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _checkForDeprecated(node.staticElement, node);
+    _invocationArguments(node.staticElement, node.argumentList);
+  }
+
+  void simpleIdentifier(SimpleIdentifier node) {
+    // Don't report declared identifiers.
+    if (node.inDeclarationContext()) {
+      return;
+    }
+
+    // Report full ConstructorName, not just the constructor name.
+    AstNode parent = node.parent;
+    if (parent is ConstructorName && identical(node, parent.name)) {
+      return;
+    }
+
+    // Report full SuperConstructorInvocation, not just the constructor name.
+    if (parent is SuperConstructorInvocation &&
+        identical(node, parent.constructorName)) {
+      return;
+    }
+
+    // HideCombinator is forgiving.
+    if (parent is HideCombinator) {
+      return;
+    }
+
+    _simpleIdentifier(node);
+  }
+
+  void superConstructorInvocation(SuperConstructorInvocation node) {
+    _checkForDeprecated(node.staticElement, node);
+    _invocationArguments(node.staticElement, node.argumentList);
+  }
+
+  /// Given some [element], look at the associated metadata and report the use
+  /// of the member if it is declared as deprecated. If a diagnostic is reported
+  /// it should be reported at the given [node].
+  void _checkForDeprecated(Element element, AstNode node) {
+    if (!_isDeprecated(element)) {
+      return;
+    }
+
+    if (_inDeprecatedMemberStack.last) {
+      return;
+    }
+
+    if (_isLocalParameter(element, node)) {
+      return;
+    }
+
+    var errorNode = node;
+    var parent = node.parent;
+    if (parent is AssignmentExpression && parent.leftHandSide == node) {
+      if (node is SimpleIdentifier) {
+        errorNode = node;
+      } else if (node is PrefixedIdentifier) {
+        errorNode = node.identifier;
+      } else if (node is PropertyAccess) {
+        errorNode = node.propertyName;
+      }
+    } else if (node is NamedExpression) {
+      errorNode = node.name.label;
+    }
+
+    String displayName = element.displayName;
+    if (element is ConstructorElement) {
+      // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
+      // or have the logic centralized elsewhere, instead of doing this logic
+      // here.
+      displayName = element.enclosingElement.displayName;
+      if (element.displayName.isNotEmpty) {
+        displayName = "$displayName.${element.displayName}";
+      }
+    } else if (element is LibraryElement) {
+      displayName = element.definingCompilationUnit.source.uri.toString();
+    } else if (node is MethodInvocation &&
+        displayName == FunctionElement.CALL_METHOD_NAME) {
+      var invokeType = node.staticInvokeType as InterfaceType;
+      if (invokeType is InterfaceType) {
+        var invokeClass = invokeType.element;
+        displayName = "${invokeClass.name}.${element.displayName}";
+      }
+    }
+    LibraryElement library =
+        element is LibraryElement ? element : element.library;
+    String message = _deprecatedMessage(element);
+    if (message == null || message.isEmpty) {
+      _errorReporter.reportErrorForNode(
+        _isLibraryInWorkspacePackage(library)
+            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
+            : HintCode.DEPRECATED_MEMBER_USE,
+        errorNode,
+        [displayName],
+      );
+    } else {
+      _errorReporter.reportErrorForNode(
+        _isLibraryInWorkspacePackage(library)
+            ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE_WITH_MESSAGE
+            : HintCode.DEPRECATED_MEMBER_USE_WITH_MESSAGE,
+        errorNode,
+        [displayName, message],
+      );
+    }
+  }
+
+  void _invocationArguments(Element element, ArgumentList arguments) {
+    element = element?.declaration;
+    if (element is ExecutableElement) {
+      _visitParametersAndArguments(
+        element.parameters,
+        arguments.arguments,
+        (parameter, argument) {
+          if (parameter.isOptional) {
+            _checkForDeprecated(parameter, argument);
+          }
+        },
+      );
+    }
+  }
+
+  bool _isLibraryInWorkspacePackage(LibraryElement library) {
+    // Better to not make a big claim that they _are_ in the same package,
+    // if we were unable to determine what package [_currentLibrary] is in.
+    if (_workspacePackage == null || library == null) {
+      return false;
+    }
+    return _workspacePackage.contains(library.source);
+  }
+
+  void _simpleIdentifier(SimpleIdentifier identifier) {
+    _checkForDeprecated(identifier.staticElement, identifier);
+  }
+
+  /// Return the message in the deprecated annotation on the given [element], or
+  /// `null` if the element doesn't have a deprecated annotation or if the
+  /// annotation does not have a message.
+  static String _deprecatedMessage(Element element) {
+    // Implicit getters/setters.
+    if (element.isSynthetic && element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    ElementAnnotationImpl annotation = element.metadata.firstWhere(
+      (e) => e.isDeprecated,
+      orElse: () => null,
+    );
+    if (annotation == null || annotation.element is PropertyAccessorElement) {
+      return null;
+    }
+    DartObject constantValue = annotation.computeConstantValue();
+    return constantValue?.getField('message')?.toStringValue() ??
+        constantValue?.getField('expires')?.toStringValue();
+  }
+
+  static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
+    for (var i = 0; i < annotations.length; i++) {
+      if (annotations[i].elementAnnotation.isDeprecated) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool _isDeprecated(Element element) {
+    if (element == null) {
+      return false;
+    }
+
+    if (element is PropertyAccessorElement && element.isSynthetic) {
+      // TODO(brianwilkerson) Why isn't this the implementation for PropertyAccessorElement?
+      Element variable = element.variable;
+      if (variable == null) {
+        return false;
+      }
+      return variable.hasDeprecated;
+    }
+    return element.hasDeprecated;
+  }
+
+  /// Return `true` if [element] is a [ParameterElement] declared in [node].
+  static bool _isLocalParameter(Element element, AstNode node) {
+    if (element is ParameterElement) {
+      ExecutableElement definingFunction = element.enclosingElement;
+      FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
+      while (body != null) {
+        ExecutableElement enclosingFunction;
+        AstNode parent = body.parent;
+        if (parent is ConstructorDeclaration) {
+          enclosingFunction = parent.declaredElement;
+        } else if (parent is FunctionExpression) {
+          enclosingFunction = parent.declaredElement;
+        } else if (parent is MethodDeclaration) {
+          enclosingFunction = parent.declaredElement;
+        }
+        if (enclosingFunction == definingFunction) {
+          return true;
+        }
+        body = parent?.thisOrAncestorOfType<FunctionBody>();
+      }
+    }
+    return false;
+  }
+
+  static void _visitParametersAndArguments(
+    List<ParameterElement> parameters,
+    List<Expression> arguments,
+    void Function(ParameterElement, Expression) f,
+  ) {
+    Map<String, ParameterElement> namedParameters;
+
+    var positionalIndex = 0;
+    for (var argument in arguments) {
+      if (argument is NamedExpression) {
+        if (namedParameters == null) {
+          namedParameters = {};
+          for (var parameter in parameters) {
+            if (parameter.isNamed) {
+              namedParameters[parameter.name] = parameter;
+            }
+          }
+        }
+        var name = argument.name.label.name;
+        var parameter = namedParameters[name];
+        if (parameter != null) {
+          f(parameter, argument);
+        }
+      } else {
+        if (positionalIndex < parameters.length) {
+          var parameter = parameters[positionalIndex++];
+          if (parameter.isPositional) {
+            f(parameter, argument);
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 995916b..9e1b27e 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -510,6 +510,7 @@
     _token(node.functionKeyword);
     node.typeParameters?.accept(this);
     node.parameters.accept(this);
+    _token(node.question);
   }
 
   @override
@@ -931,6 +932,7 @@
   void visitTypeName(TypeName node) {
     node.name.accept(this);
     node.typeArguments?.accept(this);
+    _token(node.question);
   }
 
   @override
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index f9f9e2e..854de9d 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -11,6 +11,8 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedMemberUse_BasicWorkspaceTest);
+    defineReflectiveTests(
+        DeprecatedMemberUse_BasicWorkspace_WithNullSafetyTest);
     defineReflectiveTests(DeprecatedMemberUse_BazelWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest);
@@ -28,7 +30,89 @@
 }
 
 @reflectiveTest
-class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest {
+class DeprecatedMemberUse_BasicWorkspace_WithNullSafetyTest
+    extends PubPackageResolutionTest
+    with WithNullSafetyMixin, DeprecatedMemberUse_BasicWorkspaceTestCases {
+  test_instanceCreation_namedParameter_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  A({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f() {
+  A(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 60, 1),
+    ]);
+  }
+
+  test_methodInvocation_namedParameter_ofFunction_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+void foo({@deprecated int a}) {}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f() {
+  foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 62, 1),
+    ]);
+  }
+
+  test_methodInvocation_namedParameter_ofMethod_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  void foo({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+void f(A a) {
+  a.foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 67, 1),
+    ]);
+  }
+
+  test_superConstructorInvocation_namedParameter_fromLegacy() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  A({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+import 'package:aaa/a.dart';
+
+class B extends A {
+  B() : super(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 79, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUse_BasicWorkspaceTest extends PubPackageResolutionTest
+    with DeprecatedMemberUse_BasicWorkspaceTestCases {}
+
+mixin DeprecatedMemberUse_BasicWorkspaceTestCases on PubPackageResolutionTest {
   @override
   void setUp() {
     super.setUp();
@@ -45,8 +129,6 @@
 library a;
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode('''
 export 'package:aaa/a.dart';
 ''', [
@@ -62,8 +144,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -83,8 +163,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -102,8 +180,6 @@
 library a;
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 // ignore:unused_import
 import 'package:aaa/a.dart';
@@ -121,8 +197,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -142,8 +216,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -155,6 +227,40 @@
     ]);
   }
 
+  test_parameter_named_ofFunction() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+void foo({@deprecated int a}) {}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f() {
+  foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 47, 1),
+    ]);
+  }
+
+  test_parameter_named_ofMethod() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
+class A {
+  void foo({@deprecated int a}) {}
+}
+''');
+
+    await assertErrorsInCode(r'''
+import 'package:aaa/a.dart';
+
+void f(A a) {
+  a.foo(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE, 52, 1),
+    ]);
+  }
+
   test_setterInvocation() async {
     newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 class A {
@@ -163,8 +269,6 @@
 }
 ''');
 
-    assertBasicWorkspaceFor(testFilePath);
-
     await assertErrorsInCode(r'''
 import 'package:aaa/a.dart';
 
@@ -175,6 +279,12 @@
       error(HintCode.DEPRECATED_MEMBER_USE, 48, 3),
     ]);
   }
+
+  @override
+  void verifyCreatedCollection() {
+    super.verifyCreatedCollection();
+    assertBasicWorkspaceFor(testFilePath);
+  }
 }
 
 @reflectiveTest
@@ -354,6 +464,77 @@
 @reflectiveTest
 class DeprecatedMemberUseFromSamePackage_BasicWorkspaceTest
     extends PubPackageResolutionTest {
+  test_assignmentExpression_compound_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x += 2;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_assignmentExpression_compound_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x += 2;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_assignmentExpression_simple_deprecatedGetter() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x = 0;
+}
+''');
+  }
+
+  test_assignmentExpression_simple_deprecatedGetterSetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x = 0;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_assignmentExpression_simple_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x = 0;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
   test_call() async {
     await assertErrorsInCode(r'''
 class A {
@@ -412,6 +593,21 @@
     ]);
   }
 
+  test_extensionOverride() async {
+    await assertErrorsInCode(r'''
+@deprecated
+extension E on int {
+  int get foo => 0;
+}
+
+void f() {
+  E(0).foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 69, 1),
+    ]);
+  }
+
   test_field() async {
     await assertErrorsInCode(r'''
 class A {
@@ -440,6 +636,18 @@
     ]);
   }
 
+  test_hideCombinator() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+@deprecated
+class A {}
+''');
+    await assertErrorsInCode('''
+import 'a.dart' hide A;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 8),
+    ]);
+  }
+
   test_import() async {
     newFile('$testPackageLibPath/deprecated_library.dart', content: r'''
 @deprecated
@@ -698,14 +906,159 @@
 ''');
   }
 
-  test_parameter_positional() async {
+  test_parameter_positionalOptional() async {
     await assertErrorsInCode(r'''
 class A {
-  m([@deprecated int x]) {}
-  n() {m(1);}
+  void foo([@deprecated int x]) {}
+}
+
+void f(A a) {
+  a.foo(0);
 }
 ''', [
-      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 70, 1),
+    ]);
+  }
+
+  test_parameter_positionalRequired() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  void foo(@deprecated int x) {}
+}
+
+void f(A a) {
+  a.foo(0);
+}
+''');
+  }
+
+  test_postfixExpression_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_postfixExpression_deprecatedNothing() async {
+    await assertNoErrorsInCode(r'''
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''');
+  }
+
+  test_postfixExpression_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  x++;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 59, 1),
+    ]);
+  }
+
+  test_prefixedIdentifier_identifier() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  static const foo = 0;
+}
+
+void f() {
+  A.foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 3),
+    ]);
+  }
+
+  test_prefixedIdentifier_prefix() async {
+    await assertErrorsInCode(r'''
+@deprecated
+class A {
+  static const foo = 0;
+}
+
+void f() {
+  A.foo;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 62, 1),
+    ]);
+  }
+
+  test_prefixExpression_deprecatedGetter() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int get x => 0;
+
+set x(int _) {}
+
+void f() {
+  ++x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1),
+    ]);
+  }
+
+  test_prefixExpression_deprecatedSetter() async {
+    await assertErrorsInCode(r'''
+int get x => 0;
+
+@deprecated
+set x(int _) {}
+
+void f() {
+  ++x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 61, 1),
+    ]);
+  }
+
+  test_propertyAccess_super() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  int get foo => 0;
+}
+
+class B extends A {
+  void bar() {
+    super.foo;
+  }
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 92, 3),
+    ]);
+  }
+
+  test_redirectingConstructorInvocation_namedParameter() async {
+    await assertErrorsInCode(r'''
+class A {
+  A({@deprecated int a}) {}
+  A.named() : this(a: 0);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 57, 1),
     ]);
   }
 
@@ -723,6 +1076,19 @@
     ]);
   }
 
+  test_showCombinator() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+@deprecated
+class A {}
+''');
+    await assertErrorsInCode('''
+import 'a.dart' show A;
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 21, 1),
+      error(HintCode.UNUSED_IMPORT, 7, 8),
+    ]);
+  }
+
   test_superConstructor_namedConstructor() async {
     await assertErrorsInCode(r'''
 class A {
@@ -751,7 +1117,178 @@
     ]);
   }
 
-  test_topLevelVariable() async {
+  test_topLevelVariable_argument() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  print(x);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
+    ]);
+  }
+
+  test_topLevelVariable_assignment_right() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f(int a) {
+  a = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1),
+    ]);
+  }
+
+  test_topLevelVariable_binaryExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x + 1;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_topLevelVariable_constructorFieldInitializer() async {
+    await assertErrorsInCode(r'''
+@deprecated
+const int x = 1;
+
+class A {
+  final int f;
+  A() : f = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 67, 1),
+    ]);
+  }
+
+  test_topLevelVariable_expressionFunctionBody() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+int f() => x;
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 35, 1),
+    ]);
+  }
+
+  test_topLevelVariable_expressionStatement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 37, 1),
+    ]);
+  }
+
+  test_topLevelVariable_forElement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  [for (;x;) 0];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+    ]);
+  }
+
+  test_topLevelVariable_forStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  for (;x;) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 46, 1),
+    ]);
+  }
+
+  test_topLevelVariable_ifElement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  [if (x) 0];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_ifStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  if (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 44, 1),
+    ]);
+  }
+
+  test_topLevelVariable_listLiteral() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  [x];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1),
+    ]);
+  }
+
+  test_topLevelVariable_mapLiteralEntry() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  ({0: x, x: 0});
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 42, 1),
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_namedExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void g({int a = 0}) {}
+
+void f() {
+  g(a: x);
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 66, 1),
+    ]);
+  }
+
+  test_topLevelVariable_returnStatement() async {
     await assertErrorsInCode(r'''
 @deprecated
 int x = 1;
@@ -763,6 +1300,101 @@
       error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
     ]);
   }
+
+  test_topLevelVariable_setLiteral() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  ({x});
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 39, 1),
+    ]);
+  }
+
+  test_topLevelVariable_spreadElement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = [0];
+
+void f() {
+  [...x];
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 43, 1),
+    ]);
+  }
+
+  test_topLevelVariable_switchCase() async {
+    await assertErrorsInCode(r'''
+@deprecated
+const int x = 1;
+
+void f(int a) {
+  switch (a) {
+    case x:
+      break;
+  }
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 70, 1),
+    ]);
+  }
+
+  test_topLevelVariable_switchStatement() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  switch (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 45, 1),
+    ]);
+  }
+
+  test_topLevelVariable_unaryExpression() async {
+    await assertErrorsInCode(r'''
+@deprecated
+int x = 1;
+
+void f() {
+  -x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 38, 1),
+    ]);
+  }
+
+  test_topLevelVariable_variableDeclaration_initializer() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = 1;
+
+void f() {
+  // ignore:unused_local_variable
+  var v = x;
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 79, 1),
+    ]);
+  }
+
+  test_topLevelVariable_whileStatement_condition() async {
+    await assertErrorsInCode(r'''
+@deprecated
+var x = true;
+
+void f() {
+  while (x) {}
+}
+''', [
+      error(HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE, 47, 1),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart b/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
index 4adaadd..9fd3a24 100644
--- a/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
+++ b/pkg/analyzer/test/src/summary2/ast_text_printer_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/summary2/ast_text_printer.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,6 +13,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AstTextPrinterTest);
+    defineReflectiveTests(AstTextPrinterWithNullSafetyTest);
   });
 }
 
@@ -119,3 +122,23 @@
 ''');
   }
 }
+
+@reflectiveTest
+class AstTextPrinterWithNullSafetyTest extends ParseBase {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.10.0', additionalFeatures: [Feature.non_nullable]);
+
+  test_genericFunctionType_question() async {
+    assertParseCodeAndPrintAst(this, '''
+void Function()? a;
+''');
+  }
+
+  test_typeName_question() async {
+    assertParseCodeAndPrintAst(this, '''
+int? a;
+''');
+  }
+}
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
index 05bc617..67f7c2a 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
@@ -11,5 +11,6 @@
   } else
     ; // Empty else statement
 
-  // Missing return
+  0 as int; // Unnecessary cast
+  return 0;
 }
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
index 89c0bf6a..a7d39be 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/pkg/foo/lib/foo_package_options.yaml
@@ -2,8 +2,8 @@
   strong-mode: true
   errors:
     unused_local_variable: ignore
-    missing_return: error
     undefined_function: warning
+    unnecessary_cast: error
   language:
     enableSuperMixins: true
 
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index cae931f..33f0529 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -1072,8 +1072,7 @@
       options: path.join(testDir, 'analysis_options.yaml'),
     );
     expect(exitCode, 3);
-    expect(outSink.toString(),
-        contains('but doesn\'t end with a return statement'));
+    expect(outSink.toString(), contains('Unnecessary cast.'));
     expect(outSink.toString(), contains('isn\'t defined'));
     expect(outSink.toString(), contains('Avoid empty else statements'));
   }
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 2efebfa..a0be968 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -73,7 +73,6 @@
   INVALID_PACKAGE_CONFIG,
   INVALID_PACKAGE_URI,
   INVALID_STRING_FROM_ENVIRONMENT_DEFAULT_VALUE_TYPE,
-  JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
   JS_INTEROP_FIELD_NOT_SUPPORTED,
   JS_INTEROP_NON_EXTERNAL_MEMBER,
   JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
@@ -173,27 +172,6 @@
           MessageKind.STRING_EXPECTED,
           "Expected a 'String', but got an instance of '#{type}'."),
 
-      MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS:
-          const MessageTemplate(
-              MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
-              "Js-interop class '#{cls}' cannot extend from the non js-interop "
-              "class '#{superclass}'.",
-              howToFix: "Annotate the superclass with @JS.",
-              examples: const [
-            """
-              import 'package:js/js.dart';
-
-              class Foo { }
-
-              @JS()
-              class Bar extends Foo { }
-
-              main() {
-                new Bar();
-              }
-              """
-          ]),
-
       MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER: const MessageTemplate(
           MessageKind.JS_INTEROP_NON_EXTERNAL_MEMBER,
           "Js-interop members must be 'external'."),
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index 5ae38ec..3ea0ee2 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -60,9 +60,6 @@
   void extractNativeAnnotations(LibraryEntity library);
 
   void extractJsInteropAnnotations(LibraryEntity library);
-
-  void processJsInteropAnnotations(
-      NativeBasicData nativeBasicData, NativeDataBuilder nativeDataBuilder);
 }
 
 /// Class that deletes the contents of an [WorldImpact] cache.
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index f11b3fb..fad1f0f8 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1275,11 +1275,17 @@
     if (commonElements.isNamedListConstructor('generate', constructor)) {
       // We have something like `List.generate(len, generator)`.
       int length = _findLength(arguments);
-      // TODO(sra): What we really want here is the result of calling the
-      // `generator` parameter with a non-negative integer.
-      TypeInformation elementType = _types.dynamicType;
       TypeInformation baseType =
           _listBaseType(arguments, defaultGrowable: true);
+      TypeInformation closureArgumentInfo = argumentsTypes.positional[1];
+      // If the argument is an immediate closure, the element type is that
+      // returned by the closure.
+      TypeInformation elementType;
+      if (closureArgumentInfo is ClosureTypeInformation) {
+        FunctionEntity closure = closureArgumentInfo.closure;
+        elementType = _types.getInferredTypeOfMember(closure);
+      }
+      elementType ??= _types.dynamicType;
       return _inferrer.concreteTypes.putIfAbsent(
           node,
           () => _types.allocateList(
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index c93e774..07cb160 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -114,6 +114,7 @@
       ChangedStructureNotifier changedStructureNotifier}) {
     for (var library in libraries) {
       JsInteropChecks(
+              coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
           .visitLibrary(library);
     }
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index b8959e9..2bc723d 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -223,12 +223,7 @@
   }
 
   @override
-  void onResolutionEnd() {
-    assert(_annotationProcessor != null,
-        "AnnotationProcessor has not been created.");
-    _annotationProcessor.processJsInteropAnnotations(
-        nativeBasicData, nativeDataBuilder);
-  }
+  void onResolutionEnd() {}
 
   @override
   NativeBasicData get nativeBasicData {
diff --git a/pkg/compiler/lib/src/kernel/native_basic_data.dart b/pkg/compiler/lib/src/kernel/native_basic_data.dart
index 54e0f83..0b83ce2 100644
--- a/pkg/compiler/lib/src/kernel/native_basic_data.dart
+++ b/pkg/compiler/lib/src/kernel/native_basic_data.dart
@@ -178,38 +178,4 @@
           name: libraryName);
     }
   }
-
-  @override
-  void processJsInteropAnnotations(
-      NativeBasicData nativeBasicData, NativeDataBuilder nativeDataBuilder) {
-    DiagnosticReporter reporter = elementMap.reporter;
-    KElementEnvironment elementEnvironment = elementMap.elementEnvironment;
-    KCommonElements commonElements = elementMap.commonElements;
-
-    for (LibraryEntity library in elementEnvironment.libraries) {
-      // Error checking for class inheritance must happen after the first pass
-      // through all the classes because it is possible to declare a subclass
-      // before a superclass that has not yet had "markJsInteropClass" called on
-      // it.
-      elementEnvironment.forEachClass(library, (ClassEntity cls) {
-        ir.Class classNode = elementMap.getClassNode(cls);
-        String className = annotationData.getJsInteropClassName(classNode);
-        if (className != null) {
-          bool implementsJsJavaScriptObjectClass = false;
-          elementEnvironment.forEachSupertype(cls, (InterfaceType supertype) {
-            if (supertype.element == commonElements.jsJavaScriptObjectClass) {
-              implementsJsJavaScriptObjectClass = true;
-            }
-          });
-          if (!implementsJsJavaScriptObjectClass) {
-            reporter.reportErrorMessage(
-                cls, MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS, {
-              'cls': cls.name,
-              'superclass': elementEnvironment.getSuperClass(cls).name
-            });
-          }
-        }
-      });
-    }
-  }
 }
diff --git a/pkg/compiler/test/inference/data/list2.dart b/pkg/compiler/test/inference/data/list2.dart
index 40ab257..b11b756 100644
--- a/pkg/compiler/test/inference/data/list2.dart
+++ b/pkg/compiler/test/inference/data/list2.dart
@@ -71,21 +71,21 @@
 
 // -------- List.generate --------
 
-/*member: listGenerateDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateDefault:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
 get listGenerateDefault => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'x$i');
 
-/*member: listGenerateGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateGrowable:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
 get listGenerateGrowable => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'g$i',
     growable: true);
 
-/*member: listGenerateFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateFixed:Container([exact=JSFixedArray], element: [exact=JSString], length: 8)*/
 get listGenerateFixed => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'f$i',
     growable: false);
 
-/*member: listGenerateEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: 8)*/
+/*member: listGenerateEither:Container([subclass=JSMutableArray], element: [exact=JSString], length: 8)*/
 get listGenerateEither => List.generate(
     8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'e$i',
     growable: boolFlag);
diff --git a/pkg/compiler/test/jsinterop/declaration_test.dart b/pkg/compiler/test/jsinterop/declaration_test.dart
index 5561004..fd61ba4 100644
--- a/pkg/compiler/test/jsinterop/declaration_test.dart
+++ b/pkg/compiler/test/jsinterop/declaration_test.dart
@@ -111,23 +111,6 @@
 ''',
       warnings: const [MessageKind.ABSTRACT_GETTER],
       skipForKernel: true),
-  const Test('Js-interop class that extends a regular class.', '''
-@JS()
-library test;
-
-import 'package:js/js.dart';
-
-abstract class A {
-  method();
-}
-
-@JS()
-class B extends A {
-  external method();
-}
-
-main() => new B();
-''', errors: const [MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS]),
   const Test('Js-interop class that extends a js-interop class.', '''
 @JS()
 library test;
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 1a75867..74b77aa 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -11,6 +11,7 @@
 import 'package:cli_util/cli_logging.dart';
 import 'package:dart_style/src/cli/format_command.dart';
 import 'package:nnbd_migration/migration_cli.dart';
+import 'package:pedantic/pedantic.dart';
 import 'package:usage/usage.dart';
 
 import 'src/analytics.dart';
@@ -32,7 +33,7 @@
 /// [io.exit(code)] directly.
 Future<void> runDartdev(List<String> args, SendPort port) async {
   VmInteropHandler.initialize(port);
-  final stopwatch = Stopwatch();
+
   int result;
 
   // The exit code for the dartdev process; null indicates that it has not been
@@ -77,10 +78,7 @@
     io.exit(0);
   }
 
-  String commandName;
-
   try {
-    stopwatch.start();
     final runner = DartdevRunner(args);
 
     // Run can't be called with the '--disable-dartdev-analytics' flag; remove
@@ -106,16 +104,6 @@
       args = PubUtils.modifyArgs(args);
     }
 
-    // For the commands format and migrate, dartdev itself sends the
-    // sendScreenView notification to analytics; for all other dartdev commands
-    // (instances of DartdevCommand) the commands send it to analytics.
-    commandName = ArgParserUtils.getCommandStr(args);
-    if (analytics.enabled &&
-        (commandName == formatCmdName || commandName == migrateCmdName)) {
-      // ignore: unawaited_futures
-      analytics.sendScreenView(commandName);
-    }
-
     // Finally, call the runner to execute the command; see DartdevRunner.
     result = await runner.run(args);
   } catch (e, st) {
@@ -131,41 +119,18 @@
       exitCode = 1;
     }
   } finally {
-    stopwatch.stop();
-
     // Set the exitCode, if it wasn't set in the catch block above.
     exitCode ??= result ?? 0;
 
     // Send analytics before exiting
     if (analytics.enabled) {
-      // For commands that are not DartdevCommand instances, we manually create
-      // and send the UsageEvent from here:
-      if (commandName == formatCmdName) {
-        // ignore: unawaited_futures
-        FormatUsageEvent(
-          exitCode: exitCode,
-          args: args,
-        ).send(analyticsInstance);
-      } else if (commandName == migrateCmdName) {
-        // TODO(devoncarew): Remove this special casing once the migrate command
-        // subclasses DartdevCommand.
-        // ignore: unawaited_futures
-        MigrateUsageEvent(
-          exitCode: exitCode,
-          args: args,
-        ).send(analyticsInstance);
-      }
-
-      // ignore: unawaited_futures
-      analytics.sendTiming(commandName, stopwatch.elapsedMilliseconds,
-          category: 'commands');
-
       // And now send the exceptions and events to Google Analytics:
       if (exception != null) {
-        // ignore: unawaited_futures
-        analytics.sendException(
-            '${exception.runtimeType}\n${sanitizeStacktrace(stackTrace)}',
-            fatal: true);
+        unawaited(
+          analytics.sendException(
+              '${exception.runtimeType}\n${sanitizeStacktrace(stackTrace)}',
+              fatal: true),
+        );
       }
 
       await analytics.waitForLastPing(
@@ -259,6 +224,7 @@
 
   @override
   Future<int> runCommand(ArgResults topLevelResults) async {
+    final stopwatch = Stopwatch()..start();
     assert(!topLevelResults.arguments.contains('--disable-dartdev-analytics'));
 
     if (topLevelResults.command == null &&
@@ -292,6 +258,60 @@
       }
     }
 
-    return await super.runCommand(topLevelResults);
+    var command = topLevelResults.command;
+    final commandNames = [];
+    while (command != null) {
+      commandNames.add(command.name);
+      if (command.command == null) break;
+      command = command.command;
+    }
+
+    final path = commandNames.join('/');
+    // Send the screen view to analytics
+    unawaited(
+      analyticsInstance.sendScreenView(path),
+    );
+
+    final topLevelCommand = topLevelResults.command == null
+        ? null
+        : commands[topLevelResults.command.name];
+
+    try {
+      final exitCode = await super.runCommand(topLevelResults);
+
+      if (path != null &&
+          analyticsInstance != null &&
+          analyticsInstance.enabled) {
+        // Send the event to analytics
+        unawaited(
+          sendUsageEvent(
+            analyticsInstance,
+            path,
+            exitCode: exitCode,
+            commandFlags:
+                // This finds the options that where explicitly given to the command
+                // (and not for an eventual subcommand) without including the actual
+                // value.
+                //
+                // Note that this will also conflate short-options and long-options.
+                command?.options?.where(command.wasParsed)?.toList(),
+            specifiedExperiments: topLevelCommand?.specifiedExperiments,
+          ),
+        );
+      }
+
+      return exitCode;
+    } finally {
+      stopwatch.stop();
+      if (analyticsInstance.enabled) {
+        unawaited(
+          analyticsInstance.sendTiming(
+            path ?? '',
+            stopwatch.elapsedMilliseconds,
+            category: 'commands',
+          ),
+        );
+      }
+    }
   }
 }
diff --git a/pkg/dartdev/lib/src/analytics.dart b/pkg/dartdev/lib/src/analytics.dart
index 803629a..c42129d 100644
--- a/pkg/dartdev/lib/src/analytics.dart
+++ b/pkg/dartdev/lib/src/analytics.dart
@@ -53,7 +53,6 @@
 
   if (Platform.environment['_DARTDEV_LOG_ANALYTICS'] != null) {
     // Used for testing what analytics messages are sent.
-    print('Logging analytics');
     _instance = _LoggingAnalytics();
   } else if (disableAnalytics) {
     // Dartdev tests pass a hidden 'disable-dartdev-analytics' flag which is
diff --git a/pkg/dartdev/lib/src/commands/analyze.dart b/pkg/dartdev/lib/src/commands/analyze.dart
index e13413f..554d623 100644
--- a/pkg/dartdev/lib/src/commands/analyze.dart
+++ b/pkg/dartdev/lib/src/commands/analyze.dart
@@ -5,12 +5,10 @@
 import 'dart:async';
 import 'dart:io' as io;
 
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 import '../utils.dart';
 
@@ -36,7 +34,7 @@
   String get invocation => '${super.invocation} [<directory>]';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (argResults.rest.length > 1) {
       usageException('Only one directory is expected.');
     }
@@ -154,19 +152,4 @@
       return 0;
     }
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => AnalyzeUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-}
-
-/// The [UsageEvent] for the analyze command.
-class AnalyzeUsageEvent extends UsageEvent {
-  AnalyzeUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(AnalyzeCommand.cmdName, usagePath,
-            label: label, args: args, exitCode: exitCode);
 }
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 9e8f0fe..024bea8 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -6,11 +6,9 @@
 import 'dart:io';
 
 import 'package:dart2native/generate.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
 
@@ -66,7 +64,7 @@
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(sdk.dart2jsSnapshot)) {
       return 255;
     }
@@ -127,7 +125,7 @@
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       // This throws.
@@ -203,7 +201,7 @@
   String get invocation => '${super.invocation} <dart entry point>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(genKernel) ||
         !Sdk.checkArtifactExists(genSnapshot)) {
       return 255;
@@ -243,13 +241,6 @@
   CompileSubcommandCommand(String name, String description,
       {bool hidden = false})
       : super(name, description, hidden: hidden);
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => CompileUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
 }
 
 class CompileCommand extends DartdevCommand {
@@ -280,23 +271,4 @@
       format: 'aot',
     ));
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => null;
-
-  @override
-  FutureOr<int> runImpl() {
-    // do nothing, this command is never run
-    return 0;
-  }
-}
-
-/// The [UsageEvent] for all compile commands, we could have each compile
-/// event be its own class instance, but for the time being [usagePath] takes
-/// care of the only difference.
-class CompileUsageEvent extends UsageEvent {
-  CompileUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(CompileCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
 }
diff --git a/pkg/dartdev/lib/src/commands/create.dart b/pkg/dartdev/lib/src/commands/create.dart
index 647e2f2..e8aecd4 100644
--- a/pkg/dartdev/lib/src/commands/create.dart
+++ b/pkg/dartdev/lib/src/commands/create.dart
@@ -7,12 +7,10 @@
 import 'dart:io' as io;
 import 'dart:math' as math;
 
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
 import 'package:stagehand/stagehand.dart' as stagehand;
 
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 
 /// A command to create a new project from a set of templates.
@@ -64,7 +62,7 @@
   String get invocation => '${super.invocation} <directory>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (argResults['list-templates']) {
       log.stdout(_availableTemplatesJson());
       return 0;
@@ -143,13 +141,6 @@
   }
 
   @override
-  UsageEvent createUsageEvent(int exitCode) => CreateUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-
-  @override
   String get usageFooter {
     int width = legalTemplateIds.map((s) => s.length).reduce(math.max);
     String desc = generators.map((g) {
@@ -180,14 +171,6 @@
   }
 }
 
-/// The [UsageEvent] for the create command.
-class CreateUsageEvent extends UsageEvent {
-  CreateUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(CreateCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
-}
-
 class DirectoryGeneratorTarget extends stagehand.GeneratorTarget {
   final stagehand.Generator generator;
   final io.Directory dir;
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index 718c215..18a92a0 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -6,12 +6,10 @@
 import 'dart:io' as io;
 
 import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
-import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
 import '../core.dart';
-import '../events.dart';
 import '../sdk.dart';
 import '../utils.dart';
 
@@ -22,14 +20,7 @@
   FixCommand() : super(cmdName, 'Fix Dart source code.', hidden: true);
 
   @override
-  UsageEvent createUsageEvent(int exitCode) => FixUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        args: argResults.arguments,
-      );
-
-  @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     log.stdout('\n*** The `fix` command is provisional and subject to change '
         'or removal in future releases. ***\n');
 
@@ -97,11 +88,3 @@
     return files.length;
   }
 }
-
-/// The [UsageEvent] for the fix command.
-class FixUsageEvent extends UsageEvent {
-  FixUsageEvent(String usagePath,
-      {String label, @required int exitCode, @required List<String> args})
-      : super(FixCommand.cmdName, usagePath,
-            label: label, exitCode: exitCode, args: args);
-}
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index 9d1da3f..d77dce6 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -5,10 +5,8 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
@@ -57,26 +55,8 @@
     VmInteropHandler.run(command, args);
   }
 
-  /// Since the pub subcommands are not subclasses of DartdevCommand, we
-  /// override [usagePath] here as a special case to cover the first subcommand
-  /// under pub, i.e. we will have the path pub/cache
   @override
-  String get usagePath {
-    if (argResults == null) {
-      return name;
-    }
-    var args = argResults.arguments;
-    var cmdIndex = args.indexOf(name) ?? 0;
-    for (int i = cmdIndex + 1; i < args.length; i++) {
-      if (pubSubcommands.contains(args[i])) {
-        return '$name/${args[i]}';
-      }
-    }
-    return name;
-  }
-
-  @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     if (!Sdk.checkArtifactExists(sdk.pubSnapshot)) {
       return 255;
     }
@@ -106,26 +86,4 @@
     VmInteropHandler.run(command, args);
     return 0;
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => PubUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
-}
-
-/// The [UsageEvent] for the pub command.
-class PubUsageEvent extends UsageEvent {
-  PubUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(PubCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
 }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index f7aa5d6..52dab76 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -8,11 +8,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../utils.dart';
@@ -36,10 +34,7 @@
     );
   }
 
-  @override
-  final bool verbose;
-
-  RunCommand({this.verbose = false})
+  RunCommand({bool verbose = false})
       : super(
           cmdName,
           'Run a Dart program.',
@@ -156,7 +151,7 @@
   String get invocation => '${super.invocation} <dart file | package target>';
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     // The command line arguments after 'run'
     var args = argResults.arguments.toList();
     // --launch-dds is provided by the VM if the VM service is to be enabled. In
@@ -261,14 +256,6 @@
     VmInteropHandler.run(path, runArgs);
     return 0;
   }
-
-  @override
-  UsageEvent createUsageEvent(int exitCode) => RunUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
 }
 
 class _DebuggingSession {
@@ -317,17 +304,3 @@
     }
   }
 }
-
-/// The [UsageEvent] for the run command.
-class RunUsageEvent extends UsageEvent {
-  RunUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(RunCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
-}
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index 167a6dc..43117fa 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -5,10 +5,8 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
-import 'package:meta/meta.dart';
 
 import '../core.dart';
-import '../events.dart';
 import '../experiments.dart';
 import '../sdk.dart';
 import '../vm_interop_handler.dart';
@@ -30,7 +28,7 @@
   }
 
   @override
-  FutureOr<int> runImpl() async {
+  FutureOr<int> run() async {
     return _runImpl(argResults.arguments.toList());
   }
 
@@ -74,14 +72,6 @@
     return 0;
   }
 
-  @override
-  UsageEvent createUsageEvent(int exitCode) => TestUsageEvent(
-        usagePath,
-        exitCode: exitCode,
-        specifiedExperiments: specifiedExperiments,
-        args: argResults.arguments,
-      );
-
   void _printNoPubspecMessage(bool wasHelpCommand) {
     log.stdout('''
 No pubspec.yaml file found; please run this command from the root of your project.
@@ -130,20 +120,6 @@
   }
 }
 
-/// The [UsageEvent] for the test command.
-class TestUsageEvent extends UsageEvent {
-  TestUsageEvent(String usagePath,
-      {String label,
-      @required int exitCode,
-      @required List<String> specifiedExperiments,
-      @required List<String> args})
-      : super(TestCommand.cmdName, usagePath,
-            label: label,
-            exitCode: exitCode,
-            specifiedExperiments: specifiedExperiments,
-            args: args);
-}
-
 const String _terseHelp = 'Run tests in this package.';
 
 const String _usageHelp = 'Usage: dart test [files or directories...]';
diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart
index 4a98629..6a75987 100644
--- a/pkg/dartdev/lib/src/core.dart
+++ b/pkg/dartdev/lib/src/core.dart
@@ -11,8 +11,6 @@
 import 'package:cli_util/cli_logging.dart';
 import 'package:path/path.dart' as path;
 
-import 'analytics.dart';
-import 'events.dart';
 import 'experiments.dart';
 import 'sdk.dart';
 import 'utils.dart';
@@ -42,55 +40,6 @@
   @override
   ArgParser get argParser => _argParser ??= createArgParser();
 
-  /// This method should not be overridden by subclasses, instead classes should
-  /// override [runImpl] and [createUsageEvent]. If analytics is enabled by this
-  /// command and the user, a [sendScreenView] is called to analytics, and then
-  /// after the command is run, an event is sent to analytics.
-  ///
-  /// If analytics is not enabled by this command or the user, then [runImpl] is
-  /// called and the exitCode value is returned.
-  @override
-  FutureOr<int> run() async {
-    var path = usagePath;
-    if (path != null &&
-        analyticsInstance != null &&
-        analyticsInstance.enabled) {
-      // Send the screen view to analytics
-      // ignore: unawaited_futures
-      analyticsInstance.sendScreenView(path);
-
-      // Run this command
-      var exitCode = await runImpl();
-
-      // Send the event to analytics
-      // ignore: unawaited_futures
-      createUsageEvent(exitCode)?.send(analyticsInstance);
-
-      // Finally return the exit code
-      return exitCode;
-    } else {
-      // Analytics is not enabled, run the command and return the exit code
-      return runImpl();
-    }
-  }
-
-  UsageEvent createUsageEvent(int exitCode);
-
-  FutureOr<int> runImpl();
-
-  /// The command name path to send to Google Analytics. Return null to disable
-  /// tracking of the command.
-  String get usagePath {
-    if (parent is DartdevCommand) {
-      final commandParent = parent as DartdevCommand;
-      final parentPath = commandParent.usagePath;
-      // Don't report for parents that return null for usagePath.
-      return parentPath == null ? null : '$parentPath/$name';
-    } else {
-      return name;
-    }
-  }
-
   /// Create the ArgParser instance for this command.
   ///
   /// Subclasses can override this in order to create a customized ArgParser.
@@ -98,7 +47,9 @@
       ArgParser(usageLineLength: dartdevUsageLineLength);
 
   Project get project => _project ??= Project();
+}
 
+extension DartDevCommand on Command {
   /// Return whether commands should emit verbose output.
   bool get verbose => globalResults['verbose'];
 
@@ -109,7 +60,6 @@
   bool get wereExperimentsSpecified =>
       globalResults?.wasParsed(experimentFlagName) ?? false;
 
-  /// Return the list of Dart experiment flags specified by the user.
   List<String> get specifiedExperiments => globalResults[experimentFlagName];
 }
 
diff --git a/pkg/dartdev/lib/src/events.dart b/pkg/dartdev/lib/src/events.dart
index 6cc5547..29395dc 100644
--- a/pkg/dartdev/lib/src/events.dart
+++ b/pkg/dartdev/lib/src/events.dart
@@ -5,200 +5,81 @@
 import 'package:meta/meta.dart';
 import 'package:usage/usage.dart';
 
-import 'commands/analyze.dart';
-import 'commands/compile.dart';
-import 'commands/create.dart';
-import 'commands/fix.dart';
-import 'commands/pub.dart';
-import 'commands/run.dart';
-
-/// A list of all commands under dartdev.
-const List<String> allCommands = [
-  'help',
-  AnalyzeCommand.cmdName,
-  CreateCommand.cmdName,
-  CompileCommand.cmdName,
-  FixCommand.cmdName,
-  formatCmdName,
-  migrateCmdName,
-  PubCommand.cmdName,
-  RunCommand.cmdName,
-  'test'
-];
-
 /// The [String] identifier `dartdev`, used as the category in the events sent
 /// to analytics.
 const String _dartdev = 'dartdev';
 
-/// The [String] identifier `format`.
-const String formatCmdName = 'format';
-
-/// The [String] identifier `migrate`.
-const String migrateCmdName = 'migrate';
-
-/// The separator used to for joining the flag sets sent to analytics.
-const String _flagSeparator = ',';
-
-/// When some unknown command is used, for instance `dart foo`, the command is
-/// designated with this identifier.
-const String _unknownCommand = '<unknown>';
-
 /// The collection of custom dimensions understood by the analytics backend.
 /// When adding to this list, first ensure that the custom dimension is
 /// defined in the backend, or will be defined shortly after the relevant PR
 /// lands. The pattern here matches the flutter cli.
-enum CustomDimensions {
+enum _CustomDimensions {
   commandExitCode, // cd1
   enabledExperiments, // cd2
   commandFlags, // cd3
 }
 
-String cdKey(CustomDimensions cd) => 'cd${cd.index + 1}';
+String _cdKey(_CustomDimensions cd) => 'cd${cd.index + 1}';
 
-Map<String, String> _useCdKeys(Map<CustomDimensions, String> parameters) {
+Map<String, String> _useCdKeys(Map<_CustomDimensions, String> parameters) {
   return parameters.map(
-      (CustomDimensions k, String v) => MapEntry<String, String>(cdKey(k), v));
+    (_CustomDimensions k, String v) => MapEntry<String, String>(_cdKey(k), v),
+  );
 }
 
-/// Utilities for parsing arguments passed to dartdev.  These utilities have all
-/// been marked as static to assist with testing, see events_test.dart.
-class ArgParserUtils {
-  /// Return the first member from [args] that occurs in [allCommands],
-  /// otherwise '<unknown>' is returned.
-  ///
-  /// 'help' is special cased to have 'dart analyze help', 'dart help analyze',
-  /// and 'dart analyze --help' all be recorded as a call to 'help' instead of
-  /// 'help' and 'analyze'.
-  static String getCommandStr(List<String> args) {
-    if (args.contains('help') ||
-        args.contains('-h') ||
-        args.contains('--help')) {
-      return 'help';
-    }
-    return args.firstWhere((arg) => allCommands.contains(arg),
-        orElse: () => _unknownCommand);
-  }
-
-  /// Return true if the first character of the passed [String] is '-'.
-  static bool isFlag(String arg) => arg != null && arg.startsWith('-');
-
-  /// Returns true if and only if the passed argument equals 'help', '--help' or
-  /// '-h'.
-  static bool isHelp(String arg) =>
-      arg == 'help' || arg == '--help' || arg == '-h';
-
-  /// Given some command in args, return the set of flags after the command.
-  static List<String> parseCommandFlags(String command, List<String> args) {
-    var result = <String>[];
-    if (args == null || args.isEmpty) {
-      return result;
-    }
-
-    var indexOfCmd = args.indexOf(command);
-    if (indexOfCmd < 0) {
-      return result;
-    }
-
-    for (var i = indexOfCmd + 1; i < args.length; i++) {
-      if (!isHelp(args[i]) && isFlag(args[i])) {
-        result.add(sanitizeFlag(args[i]));
-      }
-    }
-    return result;
-  }
-
-  /// Return the passed flag, only if it is considered a flag, see [isFlag], and
-  /// if '=' is in the flag, return only the contents of the left hand side of
-  /// the '='.
-  static String sanitizeFlag(String arg) {
-    if (isFlag(arg)) {
-      if (arg.contains('=')) {
-        return arg.substring(0, arg.indexOf('='));
-      } else {
-        return arg;
-      }
-    }
-    return '';
-  }
-}
-
-/// The [UsageEvent] for the format command.
-class FormatUsageEvent extends UsageEvent {
-  FormatUsageEvent(
-      {String label, @required int exitCode, @required List<String> args})
-      : super(formatCmdName, formatCmdName,
-            label: label, exitCode: exitCode, args: args);
-}
-
-/// The [UsageEvent] for the migrate command.
-class MigrateUsageEvent extends UsageEvent {
-  MigrateUsageEvent(
-      {String label, @required int exitCode, @required List<String> args})
-      : super(migrateCmdName, migrateCmdName,
-            label: label, exitCode: exitCode, args: args);
-}
-
-/// The superclass for all dartdev events, see the [send] method to see what is
-/// sent to analytics.
-abstract class UsageEvent {
+/// Sends a usage event on [analytics].
+///
+/// [command] is the top-level command name being executed here, 'analyze' and
+/// 'pub' are examples.
+///
+/// [action] is the command, and optionally the subcommand, joined with '/',
+/// an example here is 'pub/get'.
+///
+/// [label] is not used yet used when reporting dartdev analytics, but the API
+/// is included here for possible future use.
+///
+/// [exitCode] is the exit code returned from this invocation of dartdev.
+///
+/// [specifiedExperiements] are the experiments passed into the dartdev
+/// command. If the command doesn't use the experiments, they are not reported.
+///
+/// [commandFlags] are the flags (no values) used to run this command.
+Future<void> sendUsageEvent(
+  Analytics analytics,
+  String action, {
+  String label,
+  List<String> specifiedExperiments,
+  @required int exitCode,
+  @required List<String> commandFlags,
+}) {
   /// The category stores the name of this cli tool, 'dartdev'. This matches the
   /// pattern from the flutter cli tool which always passes 'flutter' as the
   /// category.
-  final String category;
+  final category = _dartdev;
+  commandFlags = commandFlags?.toList() ?? [];
+  specifiedExperiments = specifiedExperiments?.toList() ?? [];
 
-  /// The action is the command, and optionally the subcommand, joined with '/',
-  /// an example here is 'pub/get'. The usagePath getter in each of the
-  final String action;
+  // Sort the flag lists to slightly reduce the explosion of possibilities.
+  commandFlags..sort();
+  specifiedExperiments.sort();
 
-  /// The command name being executed here, 'analyze' and 'pub' are examples.
-  final String command;
+  // Insert a seperator before and after the flags list to make it easier to filter
+  // for a specific flag:
+  final enabledExperimentsString = ' ${specifiedExperiments.join(' ')} ';
+  final commandFlagsString = ' ${commandFlags.join(' ')} ';
 
-  /// Labels are not used yet used when reporting dartdev analytics, but the API
-  /// is included here for possible future use.
-  final String label;
-
-  /// The [String] list of arguments passed to dartdev, the list of args is not
-  /// passed back via analytics itself, but is used to compute other values such
-  /// as the [enabledExperiments] which are passed back as part of analytics.
-  final List<String> args;
-
-  /// The exit code returned from this invocation of dartdev.
-  final int exitCode;
-
-  /// A comma separated list of enabled experiments passed into the dartdev
-  /// command. If the command doesn't use the experiments, they are not reported
-  /// in the [UsageEvent].
-  final String enabledExperiments;
-
-  /// A comma separated list of flags on this commands
-  final String commandFlags;
-
-  UsageEvent(
-    this.command,
-    this.action, {
-    this.label,
-    List<String> specifiedExperiments,
-    @required this.exitCode,
-    @required this.args,
-  })  : category = _dartdev,
-        enabledExperiments = specifiedExperiments?.join(_flagSeparator),
-        commandFlags = ArgParserUtils.parseCommandFlags(command, args)
-            .join(_flagSeparator);
-
-  Future send(Analytics analytics) {
-    final Map<String, String> parameters =
-        _useCdKeys(<CustomDimensions, String>{
-      if (exitCode != null)
-        CustomDimensions.commandExitCode: exitCode.toString(),
-      if (enabledExperiments != null)
-        CustomDimensions.enabledExperiments: enabledExperiments,
-      if (commandFlags != null) CustomDimensions.commandFlags: commandFlags,
-    });
-    return analytics.sendEvent(
-      category,
-      action,
-      label: label,
-      parameters: parameters,
-    );
-  }
+  final Map<String, String> parameters = _useCdKeys(<_CustomDimensions, String>{
+    if (exitCode != null)
+      _CustomDimensions.commandExitCode: exitCode.toString(),
+    if (specifiedExperiments.isNotEmpty)
+      _CustomDimensions.enabledExperiments: enabledExperimentsString,
+    if (commandFlags.isNotEmpty)
+      _CustomDimensions.commandFlags: commandFlagsString,
+  });
+  return analytics.sendEvent(
+    category,
+    action,
+    label: label,
+    parameters: parameters,
+  );
 }
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index 511826b..6eb66f8 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -20,11 +20,11 @@
   nnbd_migration:
     path: ../nnbd_migration
   path: ^1.0.0
+  pedantic: ^1.9.0
   stagehand: 3.3.7
   telemetry:
     path: ../telemetry
   usage: ^3.4.0
 
 dev_dependencies:
-  pedantic: ^1.9.0
   test: ^1.0.0
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index fa9cafc..df4359d 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -26,6 +26,19 @@
       final result = p.runSync('help', []);
       expect(extractAnalytics(result), [
         {
+          'hitType': 'screenView',
+          'message': {'viewName': 'help'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'help',
+            'label': null,
+            'value': null
+          }
+        },
+        {
           'hitType': 'timing',
           'message': {
             'variableName': 'help',
@@ -52,7 +65,7 @@
             'label': null,
             'value': null,
             'cd1': '0',
-            'cd3': ''
+            'cd3': ' template ',
           }
         },
         {
@@ -73,18 +86,17 @@
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'pub/get'}
+          // TODO(sigurdm): this should be pub/get
+          'message': {'viewName': 'pub'}
         },
         {
           'hitType': 'event',
           'message': {
             'category': 'dartdev',
-            'action': 'pub/get',
+            'action': 'pub',
             'label': null,
             'value': null,
             'cd1': '0',
-            'cd2': '',
-            'cd3': '',
           }
         },
         {
@@ -115,8 +127,7 @@
             'label': null,
             'value': null,
             'cd1': '0',
-            // TODO(sigurdm): We should filter out the value here.
-            'cd3': '-l80',
+            'cd3': ' line-length ',
           }
         },
         {
@@ -130,6 +141,114 @@
         }
       ]);
     });
+
+    test('run', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args)',
+          logAnalytics: true);
+      final result = p.runSync('run', [
+        '--no-pause-isolates-on-exit',
+        '--enable-asserts',
+        'lib/main.dart',
+        '--argument'
+      ]);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'run'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'run',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' enable-asserts pause-isolates-on-exit ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'run',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('run --enable-experiments', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args)',
+          logAnalytics: true);
+      final result = p.runSync('--enable-experiment=non-nullable', [
+        'run',
+        'lib/main.dart',
+      ]);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'run'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'run',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd2': ' non-nullable ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'run',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
+
+    test('compile', () {
+      final p = project(
+          mainSrc: 'void main(List<String> args) => print(args);',
+          logAnalytics: true);
+      final result = p
+          .runSync('compile', ['kernel', 'lib/main.dart', '-o', 'main.kernel']);
+      expect(extractAnalytics(result), [
+        {
+          'hitType': 'screenView',
+          'message': {'viewName': 'compile/kernel'}
+        },
+        {
+          'hitType': 'event',
+          'message': {
+            'category': 'dartdev',
+            'action': 'compile/kernel',
+            'label': null,
+            'value': null,
+            'cd1': '0',
+            'cd3': ' output ',
+          }
+        },
+        {
+          'hitType': 'timing',
+          'message': {
+            'variableName': 'compile/kernel',
+            'time': isA<int>(),
+            'category': 'commands',
+            'label': null
+          }
+        }
+      ]);
+    });
   });
 }
 
diff --git a/pkg/dartdev/test/commands/pub_test.dart b/pkg/dartdev/test/commands/pub_test.dart
index 76c1ab3..e5a1a86 100644
--- a/pkg/dartdev/test/commands/pub_test.dart
+++ b/pkg/dartdev/test/commands/pub_test.dart
@@ -66,7 +66,7 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('pub run --enable-experiment', () {
+  test('run --enable-experiment', () {
     p = project();
     p.file('bin/main.dart',
         "void main() { int a; a = null; print('a is \$a.'); }");
diff --git a/pkg/dartdev/test/core_test.dart b/pkg/dartdev/test/core_test.dart
index 0944f88..e49c479 100644
--- a/pkg/dartdev/test/core_test.dart
+++ b/pkg/dartdev/test/core_test.dart
@@ -26,14 +26,13 @@
 
 void _dartdevCommand() {
   void _assertDartdevCommandProperties(
-      DartdevCommand command, String name, String usagePath,
+      DartdevCommand command, String name, String expectedUsagePath,
       [int subcommandCount = 0]) {
     expect(command, isNotNull);
     expect(command.name, name);
     expect(command.description, isNotEmpty);
     expect(command.project, isNotNull);
     expect(command.argParser, isNotNull);
-    expect(command.usagePath, usagePath);
     expect(command.subcommands.length, subcommandCount);
   }
 
@@ -87,7 +86,7 @@
   });
 
   test('run', () {
-    _assertDartdevCommandProperties(RunCommand(), 'run', 'run');
+    _assertDartdevCommandProperties(RunCommand(verbose: false), 'run', 'run');
   });
 
   test('test', () {
diff --git a/pkg/dartdev/test/events_test.dart b/pkg/dartdev/test/events_test.dart
deleted file mode 100644
index c39e7c4..0000000
--- a/pkg/dartdev/test/events_test.dart
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2020, 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.
-
-import 'package:dartdev/dartdev.dart';
-import 'package:dartdev/src/events.dart';
-import 'package:test/test.dart';
-
-void main() {
-  group('ArgParserUtils', _argParserUtils);
-  group('event constant', _constants);
-}
-
-void _argParserUtils() {
-  test('getCommandStr help', () {
-    expect(ArgParserUtils.getCommandStr(['help']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', 'help']), 'help');
-    expect(ArgParserUtils.getCommandStr(['help', 'analyze']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', '-h']), 'help');
-    expect(ArgParserUtils.getCommandStr(['analyze', '--help']), 'help');
-  });
-
-  test('getCommandStr command', () {
-    expect(ArgParserUtils.getCommandStr(['analyze']), 'analyze');
-    expect(ArgParserUtils.getCommandStr(['analyze', 'foo']), 'analyze');
-    expect(ArgParserUtils.getCommandStr(['foo', 'bar']), '<unknown>');
-    expect(ArgParserUtils.getCommandStr([]), '<unknown>');
-    expect(ArgParserUtils.getCommandStr(['']), '<unknown>');
-  });
-
-  test('isHelp false', () {
-    expect(ArgParserUtils.isHelp(null), isFalse);
-    expect(ArgParserUtils.isHelp(''), isFalse);
-    expect(ArgParserUtils.isHelp(' '), isFalse);
-    expect(ArgParserUtils.isHelp('-help'), isFalse);
-    expect(ArgParserUtils.isHelp('--HELP'), isFalse);
-    expect(ArgParserUtils.isHelp('--Help'), isFalse);
-    expect(ArgParserUtils.isHelp('Help'), isFalse);
-    expect(ArgParserUtils.isHelp('HELP'), isFalse);
-    expect(ArgParserUtils.isHelp('foo'), isFalse);
-  });
-
-  test('isHelp true', () {
-    expect(ArgParserUtils.isHelp('help'), isTrue);
-    expect(ArgParserUtils.isHelp('--help'), isTrue);
-    expect(ArgParserUtils.isHelp('-h'), isTrue);
-  });
-
-  test('isFlag false', () {
-    expect(ArgParserUtils.isFlag(null), isFalse);
-    expect(ArgParserUtils.isFlag(''), isFalse);
-    expect(ArgParserUtils.isFlag(' '), isFalse);
-    expect(ArgParserUtils.isFlag('help'), isFalse);
-    expect(ArgParserUtils.isFlag('_flag'), isFalse);
-  });
-
-  test('isFlag true', () {
-    expect(ArgParserUtils.isFlag('-'), isTrue);
-    expect(ArgParserUtils.isFlag('--'), isTrue);
-    expect(ArgParserUtils.isFlag('--flag'), isTrue);
-    expect(ArgParserUtils.isFlag('--help'), isTrue);
-    expect(ArgParserUtils.isFlag('-h'), isTrue);
-  });
-
-  test('parseCommandFlags analyze', () {
-    expect(
-        ArgParserUtils.parseCommandFlags('analyze', [
-          '-g',
-          'analyze',
-        ]),
-        <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('analyze', [
-          '-g',
-          'analyze',
-          '--one',
-          '--two',
-          '--three=bar',
-          '-f',
-          '--fatal-infos',
-          '-h',
-          'five'
-        ]),
-        <String>['--one', '--two', '--three', '-f', '--fatal-infos']);
-  });
-
-  test('parseCommandFlags trivial', () {
-    expect(ArgParserUtils.parseCommandFlags('foo', []), <String>[]);
-    expect(ArgParserUtils.parseCommandFlags('foo', ['']), <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['bar', '-flag']), <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['--global', 'bar', '-flag']),
-        <String>[]);
-    expect(ArgParserUtils.parseCommandFlags('foo', ['--global', 'fo', '-flag']),
-        <String>[]);
-    expect(
-        ArgParserUtils.parseCommandFlags('foo', ['--global', 'FOO', '-flag']),
-        <String>[]);
-  });
-
-  test('parseCommandFlags exclude help', () {
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', '--help']),
-        <String>['--flag']);
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', '-h']),
-        <String>['--flag']);
-    expect(
-        ArgParserUtils.parseCommandFlags(
-            'analyze', ['-g', 'analyze', '--flag', 'help']),
-        <String>['--flag']);
-  });
-
-  test('sanitizeFlag', () {
-    expect(ArgParserUtils.sanitizeFlag(null), '');
-    expect(ArgParserUtils.sanitizeFlag(''), '');
-    expect(ArgParserUtils.sanitizeFlag('foo'), '');
-    expect(ArgParserUtils.sanitizeFlag('--foo'), '--foo');
-    expect(ArgParserUtils.sanitizeFlag('--foo=bar'), '--foo');
-  });
-}
-
-void _constants() {
-  test('allCommands', () {
-    expect(allCommands, DartdevRunner([]).commands.keys.toList());
-  });
-}
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 797a9b3..291bd05 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -17,7 +17,6 @@
 import 'commands/run_test.dart' as run;
 import 'commands/test_test.dart' as test;
 import 'core_test.dart' as core;
-import 'events_test.dart' as events;
 import 'experiments_test.dart' as experiments;
 import 'sdk_test.dart' as sdk;
 import 'smoke/implicit_smoke_test.dart' as implicit_smoke;
@@ -30,7 +29,6 @@
     analytics.main();
     analyze.main();
     create.main();
-    events.main();
     experiments.main();
     fix.main();
     flag.main();
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 1755ed9..f389110 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -152,6 +152,7 @@
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
       JsInteropChecks(
+              coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>)
           .visitLibrary(library);
     }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 555f531..e45107d 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -463,10 +463,14 @@
 InvalidVoid/script2: Fail
 JsInteropAnonymousFactoryPositionalParameters/analyzerCode: Fail # Web compiler specific
 JsInteropAnonymousFactoryPositionalParameters/example: Fail # Web compiler specific
+JsInteropDartClassExtendsJSClass/analyzerCode: Fail # Web compiler specific
+JsInteropDartClassExtendsJSClass/example: Fail # Web compiler specific
 JsInteropEnclosingClassJSAnnotation/analyzerCode: Fail # Web compiler specific
 JsInteropEnclosingClassJSAnnotation/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
+JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
+JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
 JsInteropNamedParameters/example: Fail # Web compiler specific
 JsInteropNonExternalConstructor/analyzerCode: Fail # Web compiler specific
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index a90e697..53df438 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4371,6 +4371,10 @@
   template: "Factory constructors for @anonymous JS interop classes should not contain any positional parameters."
   tip: "Try replacing them with named parameters instead."
 
+JsInteropDartClassExtendsJSClass:
+  template: "Dart class '#name' cannot extend JS interop class '#name2'."
+  tip: "Try adding the JS interop annotation or removing it from the parent class."
+
 JsInteropEnclosingClassJSAnnotation:
   template: "Member has a JS interop annotation but the enclosing class does not."
   tip: "Try adding the annotation to the enclosing class."
@@ -4383,6 +4387,10 @@
   template: "JS interop classes do not support [] and []= operator methods."
   tip: "Try replacing with a normal method."
 
+JsInteropJSClassExtendsDartClass:
+  template: "JS interop class '#name' cannot extend Dart class '#name2'."
+  tip: "Try removing the JS interop annotation or adding it to the parent class."
+
 JsInteropNamedParameters:
   template: "Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class."
   tip: "Try replacing them with normal or optional parameters."
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index da5596f..a6c6e30 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -420,8 +420,21 @@
           var typeFormal = typeFormals[i];
           var oldDecoratedBound =
               DecoratedTypeParameterBounds.current.get(typeFormal);
-          var newDecoratedBound = oldDecoratedBound._substitute(substitution,
-              undecoratedResult.typeFormals[i].bound ?? oldDecoratedBound.type);
+          var undecoratedResult2 = undecoratedResult.typeFormals[i].bound;
+          if (undecoratedResult2 == null) {
+            if (oldDecoratedBound == null) {
+              assert(
+                  false, 'Could not find old decorated bound for type formal');
+              // Recover the best we can by assuming a bound of `dynamic`.
+              oldDecoratedBound = DecoratedType(
+                  DynamicTypeImpl.instance,
+                  NullabilityNode.forInferredType(
+                      NullabilityNodeTarget.text('Type parameter bound')));
+            }
+            undecoratedResult2 = oldDecoratedBound.type;
+          }
+          var newDecoratedBound =
+              oldDecoratedBound._substitute(substitution, undecoratedResult2);
           if (identical(typeFormal, undecoratedResult.typeFormals[i])) {
             assert(oldDecoratedBound == newDecoratedBound);
           } else {
diff --git a/pkg/nnbd_migration/pubspec.yaml b/pkg/nnbd_migration/pubspec.yaml
index 5b270aa..5f57739 100644
--- a/pkg/nnbd_migration/pubspec.yaml
+++ b/pkg/nnbd_migration/pubspec.yaml
@@ -1,9 +1,11 @@
 name: nnbd_migration
-description: Null Safety Migration Tooling
-homepage: https://github.com/dart-lang/sdk/blob/master/pkg/nnbd_migration/README.md
-version: 0.1.1
+
+# This package is not intended for consumption on pub.dev. DO NOT publish.
+publish_to: none
+
 environment:
   sdk: '>=2.6.0 <3.0.0'
+
 dependencies:
   _fe_analyzer_shared: ^4.0.0
   analyzer: ^0.40.4
@@ -17,6 +19,7 @@
   pub_semver: ^1.4.2
   source_span: ^1.4.1
   yaml: ^2.1.15
+
 dev_dependencies:
   http: '>=0.11.3+17 <0.13.0'
   pedantic: ^1.9.0
diff --git a/pkg/nnbd_migration/test/abstract_context.dart b/pkg/nnbd_migration/test/abstract_context.dart
index 4ea440d..c3b42f9 100644
--- a/pkg/nnbd_migration/test/abstract_context.dart
+++ b/pkg/nnbd_migration/test/abstract_context.dart
@@ -18,9 +18,6 @@
 /// TODO(paulberry): this logic is duplicated from other packages.  Find a way
 /// share it, or avoid relying on it.
 class AbstractContextTest with ResourceProviderMixin {
-  static const _homePath = '/home';
-  static const testsPath = '$_homePath/tests';
-
   OverlayResourceProvider overlayResourceProvider;
 
   AnalysisContextCollection _analysisContextCollection;
@@ -28,8 +25,12 @@
 
   AnalysisDriver get driver => _driver;
 
+  String get homePath => '/home';
+
   AnalysisSession get session => driver.currentSession;
 
+  String get testsPath => '$homePath/tests';
+
   void addMetaPackage() {
     addPackageFile('meta', 'meta.dart', r'''
 library meta;
@@ -93,7 +94,7 @@
   /// Create all analysis contexts in [_homePath].
   void createAnalysisContexts() {
     _analysisContextCollection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath(_homePath)],
+      includedPaths: [convertPath(homePath)],
       enableIndex: true,
       resourceProvider: overlayResourceProvider,
       sdkPath: convertPath('/sdk'),
@@ -241,7 +242,7 @@
 
   void _createDriver() {
     var collection = AnalysisContextCollectionImpl(
-      includedPaths: [convertPath(_homePath)],
+      includedPaths: [convertPath(homePath)],
       enableIndex: true,
       resourceProvider: resourceProvider,
       sdkPath: convertPath('/sdk'),
diff --git a/pkg/nnbd_migration/test/abstract_single_unit.dart b/pkg/nnbd_migration/test/abstract_single_unit.dart
index cd7b060..106a6a0 100644
--- a/pkg/nnbd_migration/test/abstract_single_unit.dart
+++ b/pkg/nnbd_migration/test/abstract_single_unit.dart
@@ -66,7 +66,7 @@
 
   @override
   void setUp() {
-    var testRoot = AbstractContextTest.testsPath;
+    var testRoot = testsPath;
     if (analyzeWithNnbd) {
       newFile('$testRoot/analysis_options.yaml', content: '''
 analyzer:
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index b1f06d2..2100509 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -28,12 +28,12 @@
 
 /// Base class for provisional API tests.
 abstract class _ProvisionalApiTestBase extends AbstractContextTest {
-  bool get _usePermissiveMode;
-
   String projectPath;
 
+  bool get _usePermissiveMode;
+
   void setUp() {
-    projectPath = convertPath(AbstractContextTest.testsPath);
+    projectPath = convertPath(testsPath);
     super.setUp();
   }
 
@@ -109,8 +109,7 @@
       {Map<String, String> migratedInput = const {},
       bool removeViaComments = false,
       bool warnOnWeakCode = false}) async {
-    var sourcePath =
-        convertPath('${AbstractContextTest.testsPath}/lib/test.dart');
+    var sourcePath = convertPath('$testsPath/lib/test.dart');
     await _checkMultipleFileChanges(
         {sourcePath: content}, {sourcePath: expected},
         migratedInput: migratedInput,
@@ -4583,6 +4582,33 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_many_type_variables() async {
+    try {
+      assert(false);
+    } catch (_) {
+      // When assertions are enabled, this test fails, so skip it.
+      // See https://github.com/dart-lang/sdk/issues/43945.
+      return;
+    }
+    var content = '''
+void test(C<int> x, double Function<S>(C<S>) y) {
+  x.f<double>(y);
+}
+class C<T> {
+  U f<U>(U Function<V>(C<V>) z) => throw 'foo';
+}
+''';
+    var expected = '''
+void test(C<int> x, double Function<S>(C<S>) y) {
+  x.f<double>(y);
+}
+class C<T> {
+  U f<U>(U Function<V>(C<V>) z) => throw 'foo';
+}
+''';
+    await _checkSingleFileChanges(content, expected, warnOnWeakCode: true);
+  }
+
   Future<void> test_map_nullable_input() async {
     var content = '''
 Iterable<int> f(List<int> x) => x.map((y) => g(y));
diff --git a/pkg/nnbd_migration/test/front_end/analysis_abstract.dart b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
index 2eb23ec..1302e28 100644
--- a/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
+++ b/pkg/nnbd_migration/test/front_end/analysis_abstract.dart
@@ -71,8 +71,8 @@
 
   void setUp() {
     super.setUp();
-    projectPath = convertPath(AbstractContextTest.testsPath);
-    testFolder = convertPath('${AbstractContextTest.testsPath}/bin');
-    testFile = convertPath('${AbstractContextTest.testsPath}/bin/test.dart');
+    projectPath = convertPath(testsPath);
+    testFolder = convertPath('$testsPath/bin');
+    testFile = convertPath('$testsPath/bin/test.dart');
   }
 }
diff --git a/pkg/nnbd_migration/test/front_end/region_renderer_test.dart b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
index ab9663c..d2e4953 100644
--- a/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
+++ b/pkg/nnbd_migration/test/front_end/region_renderer_test.dart
@@ -15,30 +15,16 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(RegionRendererTest);
+    defineReflectiveTests(RegionRendererTestDriveD);
   });
 }
 
 @reflectiveTest
-class RegionRendererTest extends NnbdMigrationTestBase {
-  PathMapper pathMapper;
-
+class RegionRendererTest extends RegionRendererTestBase {
   /// Returns the basename of [testFile], used in traces.
   String get _testFileBasename =>
       resourceProvider.pathContext.basename(testFile);
 
-  /// Render the region at [offset], using a [MigrationInfo] which knows only
-  /// about the library at `infos.single`.
-  EditDetails renderRegion(int offset) {
-    var migrationInfo =
-        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
-    var unitInfo = infos.single;
-    var region = unitInfo.regionAt(offset);
-    pathMapper = PathMapper(resourceProvider);
-    return RegionRenderer(
-            region, unitInfo, migrationInfo, pathMapper, 'AUTH_TOKEN')
-        .render();
-  }
-
   Future<void> test_informationalRegion_containsTrace() async {
     await buildInfoForSingleTestFile('f(int a) => a.isEven;',
         migratedContent: 'f(int  a) => a.isEven;');
@@ -75,59 +61,6 @@
         equals(resourceProvider.pathContext.toUri(_testFileBasename).path));
   }
 
-  Future<void>
-      test_informationalRegion_containsTraceLinks_separateDrive() async {
-    // See https://github.com/dart-lang/sdk/issues/43178. Linking from a file on
-    // one drive to a file on another drive can cause problems.
-    projectPath = _switchToDriveD(projectPath);
-    testFolder = _switchToDriveD(testFolder);
-    testFile = _switchToDriveD(testFile);
-    await buildInfoForSingleTestFile(r'''
-f(List<int> a) {
-  if (1 == 2) List.from(a);
-}
-g() {
-  f(null);
-}
-''', migratedContent: r'''
-f(List<int >? a) {
-  if (1 == 2) List.from(a!);
-}
-g() {
-  f(null);
-}
-''');
-    var response = renderRegion(44); // The inserted null-check.
-    expect(response.displayPath,
-        equals(_switchToDriveD(convertPath('/home/tests/bin/test.dart'))));
-    expect(response.traces, hasLength(2));
-    var trace = response.traces[1];
-    expect(trace.description, equals('Non-nullability reason'));
-    expect(trace.entries, hasLength(1));
-    var entry = trace.entries[0];
-    expect(entry.link, isNotNull);
-    var sdkCoreLib = convertPath('/sdk/lib/core/core.dart');
-    var sdkCoreLibUriPath = resourceProvider.pathContext.toUri(sdkCoreLib).path;
-    var coreLibText = resourceProvider.getFile(sdkCoreLib).readAsStringSync();
-    var expectedOffset =
-        'List.from'.allMatches(coreLibText).single.start + 'List.'.length;
-    var expectedLine =
-        '\n'.allMatches(coreLibText.substring(0, expectedOffset)).length + 1;
-    expect(
-        entry.link.href,
-        equals('$sdkCoreLibUriPath?'
-            'offset=$expectedOffset&'
-            'line=$expectedLine&'
-            'authToken=AUTH_TOKEN'));
-    // On Windows, the path will simply be the absolute path to the core
-    // library, because there is no relative route from C:\ to D:\. On Posix,
-    // the path is relative.
-    var expectedLinkPath = resourceProvider.pathContext.style == p.Style.windows
-        ? sdkCoreLibUriPath
-        : '../../..$sdkCoreLibUriPath';
-    expect(entry.link.path, equals(expectedLinkPath));
-  }
-
   Future<void> test_modifiedOutput_containsExplanation() async {
     await buildInfoForSingleTestFile('int a = null;',
         migratedContent: 'int? a = null;');
@@ -174,6 +107,84 @@
     expect(response.uriPath, equals(pathMapper.map(testFile)));
     expect(response.line, equals(1));
   }
+}
+
+class RegionRendererTestBase extends NnbdMigrationTestBase {
+  PathMapper pathMapper;
+
+  /// Render the region at [offset], using a [MigrationInfo] which knows only
+  /// about the library at `infos.single`.
+  EditDetails renderRegion(int offset) {
+    var migrationInfo =
+        MigrationInfo(infos, {}, resourceProvider.pathContext, projectPath);
+    var unitInfo = infos.single;
+    var region = unitInfo.regionAt(offset);
+    pathMapper = PathMapper(resourceProvider);
+    return RegionRenderer(
+            region, unitInfo, migrationInfo, pathMapper, 'AUTH_TOKEN')
+        .render();
+  }
+}
+
+@reflectiveTest
+class RegionRendererTestDriveD extends RegionRendererTestBase {
+  @override
+  String get homePath => _switchToDriveD(super.homePath);
+
+  @override
+  void setUp() {
+    super.setUp();
+  }
+
+  Future<void>
+      test_informationalRegion_containsTraceLinks_separateDrive() async {
+    // See https://github.com/dart-lang/sdk/issues/43178. Linking from a file on
+    // one drive to a file on another drive can cause problems.
+    await buildInfoForSingleTestFile(r'''
+f(List<int> a) {
+  if (1 == 2) List.from(a);
+}
+g() {
+  f(null);
+}
+''', migratedContent: r'''
+f(List<int >? a) {
+  if (1 == 2) List.from(a!);
+}
+g() {
+  f(null);
+}
+''');
+    var response = renderRegion(44); // The inserted null-check.
+    expect(response.displayPath,
+        equals(_switchToDriveD(convertPath('/home/tests/bin/test.dart'))));
+    expect(response.traces, hasLength(2));
+    var trace = response.traces[1];
+    expect(trace.description, equals('Non-nullability reason'));
+    expect(trace.entries, hasLength(1));
+    var entry = trace.entries[0];
+    expect(entry.link, isNotNull);
+    var sdkCoreLib = convertPath('/sdk/lib/core/core.dart');
+    var sdkCoreLibUriPath = resourceProvider.pathContext.toUri(sdkCoreLib).path;
+    var coreLibText = resourceProvider.getFile(sdkCoreLib).readAsStringSync();
+    var expectedOffset =
+        'List.from'.allMatches(coreLibText).single.start + 'List.'.length;
+    var expectedLine =
+        '\n'.allMatches(coreLibText.substring(0, expectedOffset)).length + 1;
+    expect(
+        entry.link.href,
+        equals('$sdkCoreLibUriPath?'
+            'offset=$expectedOffset&'
+            'line=$expectedLine&'
+            'authToken=AUTH_TOKEN'));
+    // On Windows, the path will simply be the absolute path to the core
+    // library, because there is no relative route from C:\ to D:\. On Posix,
+    // the path is relative.
+    var expectedLinkPath = resourceProvider.pathContext.style == p.Style.windows
+        ? sdkCoreLibUriPath
+        : '../../..$sdkCoreLibUriPath';
+    expect(entry.link.path, equals(expectedLinkPath));
+  }
 
   /// On Windows, replace the C:\ relative root in [path] with the D:\ relative
   /// root.
@@ -181,6 +192,8 @@
   /// On Posix, nothing is be replaced.
   String _switchToDriveD(String path) {
     assert(resourceProvider.pathContext.isAbsolute(path));
-    return path.replaceFirst(RegExp('^C:\\\\'), 'D:\\');
+    return resourceProvider
+        .convertPath(path)
+        .replaceFirst(RegExp('^C:\\\\'), 'D:\\');
   }
 }
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index 3a3856c..d06a022 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -140,8 +140,7 @@
 
   Future<void> analyze(String content,
       {bool removeViaComments = false, bool warnOnWeakCode = true}) async {
-    var sourcePath =
-        convertPath('${AbstractContextTest.testsPath}/lib/test.dart');
+    var sourcePath = convertPath('$testsPath/lib/test.dart');
     newFile(sourcePath, content: content);
     var listener = TestMigrationListener();
     var migration = NullabilityMigration(listener, getLineInfo,
diff --git a/pkg/testing/lib/src/zone_helper.dart b/pkg/testing/lib/src/zone_helper.dart
index e2d106d..d8d7d39 100644
--- a/pkg/testing/lib/src/zone_helper.dart
+++ b/pkg/testing/lib/src/zone_helper.dart
@@ -5,7 +5,7 @@
 /// Helper functions for running code in a Zone.
 library testing.zone_helper;
 
-import 'dart:async' show Completer, Future, ZoneSpecification, runZoned;
+import 'dart:async' show Completer, Future, ZoneSpecification, runZonedGuarded;
 
 import 'dart:io' show exit, stderr;
 
@@ -63,8 +63,11 @@
   Isolate.current.setErrorsFatal(false);
   Isolate.current.addErrorListener(errorPort.sendPort);
   return acknowledgeControlMessages(Isolate.current).then((_) {
-    runZoned(() => new Future(f).then(completer.complete),
-        zoneSpecification: specification, onError: handleUncaughtError);
+    runZonedGuarded(
+      () => new Future(f).then(completer.complete),
+      handleUncaughtError,
+      zoneSpecification: specification,
+    );
 
     return completer.future.whenComplete(() {
       errorPort.close();
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 778ccc0..fb5d3f1 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -732,10 +732,10 @@
   final bool enableAsserts = request[9];
   final List<String> experimentalFlags =
       request[10] != null ? request[10].cast<String>() : null;
-  final String packageConfig = request[12];
-  final String multirootFilepaths = request[13];
-  final String multirootScheme = request[14];
-  final String workingDirectory = request[15];
+  final String packageConfig = request[11];
+  final String multirootFilepaths = request[12];
+  final String multirootScheme = request[13];
+  final String workingDirectory = request[14];
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -981,7 +981,6 @@
     false /* suppress warnings */,
     false /* enable asserts */,
     null /* experimental_flags */,
-    null /* unused */,
     null /* package_config */,
     null /* multirootFilepaths */,
     null /* multirootScheme */,
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index bbb753e..9299ed5 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,12 +1,4 @@
 # Changelog
-
-## 5.4.0
-- Update to version `3.41.0` of the spec.
-- Added `PortList` class.
-- Added `getPorts` RPC.
-- Added optional properties `portId`, `allocationLocation`, and `debugName` to
-  `InstanceRef` and `Instance`.
-
 ## 5.3.1
 - Rename `State` class to `_State` to avoid class name conflicts with Flutter.
 
@@ -14,6 +6,7 @@
 - Added support for `dart:io` extensions version 1.5.
 - Added combination getter/setter `socketProfilingEnabled`.
 - Deprecated `startSocketProfiling` and `pauseSocketProfiling`.
+- Added support for `dart:io` extensions version 1.4.
 - Update to version `3.40.0` of the spec.
 - Added `IsolateFlag` class.
 - Added `isolateFlags` property to `Isolate`.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index 617bd7c..e2ae6d1 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -192,7 +192,6 @@
   if (obj == "MirrorReference") return obj;
   if (obj == "Null") return obj;
   if (obj == "PlainInstance") return obj;
-  if (obj == "ReceivePort") return obj;
   if (obj == "RegExp") return obj;
   if (obj == "StackTrace") return obj;
   if (obj == "String") return obj;
@@ -913,13 +912,6 @@
   return obj;
 }
 
-vms.PortList assertPortList(vms.PortList obj) {
-  assertNotNull(obj);
-  assertString(obj.type);
-  assertListOfInstanceRef(obj.ports);
-  return obj;
-}
-
 vms.ProfileFunction assertProfileFunction(vms.ProfileFunction obj) {
   assertNotNull(obj);
   assertString(obj.kind);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index 8803d45..ae6691f 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -25,7 +25,6 @@
 src/org/dartlang/vm/service/consumer/InvokeConsumer.java
 src/org/dartlang/vm/service/consumer/KillConsumer.java
 src/org/dartlang/vm/service/consumer/PauseConsumer.java
-src/org/dartlang/vm/service/consumer/PortListConsumer.java
 src/org/dartlang/vm/service/consumer/ProcessMemoryUsageConsumer.java
 src/org/dartlang/vm/service/consumer/ProtocolListConsumer.java
 src/org/dartlang/vm/service/consumer/ReloadSourcesConsumer.java
@@ -96,7 +95,6 @@
 src/org/dartlang/vm/service/element/NullRef.java
 src/org/dartlang/vm/service/element/Obj.java
 src/org/dartlang/vm/service/element/ObjRef.java
-src/org/dartlang/vm/service/element/PortList.java
 src/org/dartlang/vm/service/element/ProcessMemoryItem.java
 src/org/dartlang/vm/service/element/ProcessMemoryUsage.java
 src/org/dartlang/vm/service/element/ProfileFunction.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index ae41aeb..d0564a6 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.41
+version=3.40
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index 2fe6ce2..c184d3c 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -58,8 +58,8 @@
 
   /// The `getSocketProfile` RPC is used to retrieve socket statistics collected
   /// by the socket profiler. Only samples collected after the initial
-  /// [startSocketProfiling] or the last call to [clearSocketProfiling] will be
-  /// reported.
+  /// [socketProfilingEnabled] call or the last call to [clearSocketProfile]
+  /// will be reported.
   Future<SocketProfile> getSocketProfile(String isolateId) =>
       _callHelper('ext.dart.io.getSocketProfile', isolateId);
 
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 4dfc752..fd20c5b 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.41.0';
+const String vmServiceVersion = '3.40.0';
 
 /// @optional
 const String optional = 'optional';
@@ -157,7 +157,6 @@
   'Null': NullVal.parse,
   '@Object': ObjRef.parse,
   'Object': Obj.parse,
-  'PortList': PortList.parse,
   'ProfileFunction': ProfileFunction.parse,
   'ProtocolList': ProtocolList.parse,
   'Protocol': Protocol.parse,
@@ -210,7 +209,6 @@
   'getIsolateGroupMemoryUsage': const ['MemoryUsage'],
   'getScripts': const ['ScriptList'],
   'getObject': const ['Obj'],
-  'getPorts': const ['PortList'],
   'getRetainingPath': const ['RetainingPath'],
   'getProcessMemoryUsage': const ['ProcessMemoryUsage'],
   'getStack': const ['Stack'],
@@ -690,12 +688,6 @@
     int count,
   });
 
-  /// The `getPorts` RPC is used to retrieve the list of `ReceivePort` instances
-  /// for a given isolate.
-  ///
-  /// See [PortList].
-  Future<PortList> getPorts(String isolateId);
-
   /// The `getRetainingPath` RPC is used to lookup a path from an object
   /// specified by `targetId` to a GC root (i.e., the object which is preventing
   /// this object from being garbage collected).
@@ -1326,11 +1318,6 @@
             count: params['count'],
           );
           break;
-        case 'getPorts':
-          response = await _serviceImplementation.getPorts(
-            params['isolateId'],
-          );
-          break;
         case 'getRetainingPath':
           response = await _serviceImplementation.getRetainingPath(
             params['isolateId'],
@@ -1784,10 +1771,6 @@
       });
 
   @override
-  Future<PortList> getPorts(String isolateId) =>
-      _call('getPorts', {'isolateId': isolateId});
-
-  @override
   Future<RetainingPath> getRetainingPath(
           String isolateId, String targetId, int limit) =>
       _call('getRetainingPath',
@@ -2449,9 +2432,6 @@
 
   /// An instance of the Dart class BoundedType.
   static const String kBoundedType = 'BoundedType';
-
-  /// An instance of the Dart class ReceivePort.
-  static const String kReceivePort = 'ReceivePort';
 }
 
 /// A `SentinelKind` is used to distinguish different kinds of `Sentinel`
@@ -4259,27 +4239,6 @@
   @optional
   ContextRef closureContext;
 
-  /// The port ID for a ReceivePort.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  int portId;
-
-  /// The stack trace associated with the allocation of a ReceivePort.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  InstanceRef allocationLocation;
-
-  /// A name associated with a ReceivePort used for debugging purposes.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  String debugName;
-
   InstanceRef({
     @required this.kind,
     @required this.classRef,
@@ -4293,9 +4252,6 @@
     this.pattern,
     this.closureFunction,
     this.closureContext,
-    this.portId,
-    this.allocationLocation,
-    this.debugName,
   }) : super(id: id);
 
   InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4313,10 +4269,6 @@
         createServiceObject(json['closureFunction'], const ['FuncRef']);
     closureContext =
         createServiceObject(json['closureContext'], const ['ContextRef']);
-    portId = json['portId'];
-    allocationLocation =
-        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
-    debugName = json['debugName'];
   }
 
   @override
@@ -4336,9 +4288,6 @@
     _setIfNotNull(json, 'pattern', pattern?.toJson());
     _setIfNotNull(json, 'closureFunction', closureFunction?.toJson());
     _setIfNotNull(json, 'closureContext', closureContext?.toJson());
-    _setIfNotNull(json, 'portId', portId);
-    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
-    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -4369,7 +4318,6 @@
   ///  - Double (suitable for passing to Double.parse())
   ///  - Int (suitable for passing to int.parse())
   ///  - String (value may be truncated)
-  ///  - StackTrace
   @optional
   String valueAsString;
 
@@ -4606,27 +4554,6 @@
   @optional
   InstanceRef bound;
 
-  /// The port ID for a ReceivePort.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  int portId;
-
-  /// The stack trace associated with the allocation of a ReceivePort.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  InstanceRef allocationLocation;
-
-  /// A name associated with a ReceivePort used for debugging purposes.
-  ///
-  /// Provided for instance kinds:
-  ///  - ReceivePort
-  @optional
-  String debugName;
-
   Instance({
     @required this.kind,
     @required this.classRef,
@@ -4655,9 +4582,6 @@
     this.parameterIndex,
     this.targetType,
     this.bound,
-    this.portId,
-    this.allocationLocation,
-    this.debugName,
   }) : super(id: id);
 
   Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4703,10 +4627,6 @@
     parameterIndex = json['parameterIndex'];
     targetType = createServiceObject(json['targetType'], const ['InstanceRef']);
     bound = createServiceObject(json['bound'], const ['InstanceRef']);
-    portId = json['portId'];
-    allocationLocation =
-        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
-    debugName = json['debugName'];
   }
 
   @override
@@ -4743,9 +4663,6 @@
     _setIfNotNull(json, 'parameterIndex', parameterIndex);
     _setIfNotNull(json, 'targetType', targetType?.toJson());
     _setIfNotNull(json, 'bound', bound?.toJson());
-    _setIfNotNull(json, 'portId', portId);
-    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
-    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -5826,37 +5743,6 @@
   String toString() => '[Obj type: ${type}, id: ${id}]';
 }
 
-/// A `PortList` contains a list of ports associated with some isolate.
-///
-/// See [getPort].
-class PortList extends Response {
-  static PortList parse(Map<String, dynamic> json) =>
-      json == null ? null : PortList._fromJson(json);
-
-  List<InstanceRef> ports;
-
-  PortList({
-    @required this.ports,
-  });
-
-  PortList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
-    ports = List<InstanceRef>.from(
-        createServiceObject(json['ports'], const ['InstanceRef']) ?? []);
-  }
-
-  @override
-  Map<String, dynamic> toJson() {
-    var json = <String, dynamic>{};
-    json['type'] = 'PortList';
-    json.addAll({
-      'ports': ports.map((f) => f.toJson()).toList(),
-    });
-    return json;
-  }
-
-  String toString() => '[PortList type: ${type}, ports: ${ports}]';
-}
-
 /// A `ProfileFunction` contains profiling information about a Dart or native
 /// function.
 ///
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 0c77a68..7d0d07a 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 5.4.0
+version: 5.3.1
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/network_profiling_test.dart b/pkg/vm_service/test/network_profiling_test.dart
index bdb22a1..d554d81 100644
--- a/pkg/vm_service/test/network_profiling_test.dart
+++ b/pkg/vm_service/test/network_profiling_test.dart
@@ -6,9 +6,11 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
-import 'package:vm_service/vm_service.dart';
-import 'package:vm_service/src/dart_io_extensions.dart';
+
 import 'package:test/test.dart';
+import 'package:vm_service/src/dart_io_extensions.dart';
+import 'package:vm_service/vm_service.dart';
+
 import 'common/service_test_common.dart';
 import 'common/test_helper.dart';
 
@@ -38,9 +40,10 @@
   await service.streamListen(EventStreams.kExtension);
 
   if (useSetter) {
-    // ignore: deprecated_member_use_from_same_package
     state
+        // ignore: deprecated_member_use_from_same_package
         ? await service.startSocketProfiling(isolateId)
+        // ignore: deprecated_member_use_from_same_package
         : await service.pauseSocketProfiling(isolateId);
   } else {
     await service.socketProfilingEnabled(isolateId, state);
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 9f014dd..72e10c8 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -125,7 +125,6 @@
   V(compile_all, compile_all)                                                  \
   V(help, help)                                                                \
   V(obfuscate, obfuscate)                                                      \
-  V(read_all_bytecode, read_all_bytecode)                                      \
   V(strip, strip)                                                              \
   V(verbose, verbose)                                                          \
   V(version, version)
@@ -390,13 +389,6 @@
 }
 
 static void MaybeLoadCode() {
-  if (read_all_bytecode &&
-      ((snapshot_kind == kCore) || (snapshot_kind == kCoreJIT) ||
-       (snapshot_kind == kApp) || (snapshot_kind == kAppJIT))) {
-    Dart_Handle result = Dart_ReadAllBytecode();
-    CHECK_RESULT(result);
-  }
-
   if (compile_all &&
       ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT))) {
     Dart_Handle result = Dart_CompileAll();
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 495d454..7aeb40d 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -178,8 +178,6 @@
  */
 DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
 
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_ReadAllBytecode();
-
 /**
  * Finalizes all classes.
  */
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 7106518..cce88cf 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -31,25 +31,21 @@
   ASSERT(!assert_error_class.IsNull());
   bool hit_assertion_error = false;
   for (; stack_frame != NULL; stack_frame = iterator->NextFrame()) {
-    if (stack_frame->is_interpreted()) {
-      func = stack_frame->LookupDartFunction();
-    } else {
-      code = stack_frame->LookupDartCode();
-      if (code.is_optimized()) {
-        InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
-        while (!inlined_iterator.Done()) {
-          func = inlined_iterator.function();
-          if (hit_assertion_error) {
-            return func.script();
-          }
-          ASSERT(!hit_assertion_error);
-          hit_assertion_error = (func.Owner() == assert_error_class.raw());
-          inlined_iterator.Advance();
+    code = stack_frame->LookupDartCode();
+    if (code.is_optimized()) {
+      InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
+      while (!inlined_iterator.Done()) {
+        func = inlined_iterator.function();
+        if (hit_assertion_error) {
+          return func.script();
         }
-        continue;
-      } else {
-        func = code.function();
+        ASSERT(!hit_assertion_error);
+        hit_assertion_error = (func.Owner() == assert_error_class.raw());
+        inlined_iterator.Advance();
       }
+      continue;
+    } else {
+      func = code.function();
     }
     ASSERT(!func.IsNull());
     if (hit_assertion_error) {
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 3c4a07c..b514b86 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -306,36 +306,9 @@
   return Integer::New(SizeOf(type_arg, zone));
 }
 
-// Static invocations to this method are translated directly in streaming FGB
-// and bytecode FGB. However, we can still reach this entrypoint in the bytecode
-// interpreter.
+// Static invocations to this method are translated directly in streaming FGB.
 DEFINE_NATIVE_ENTRY(Ffi_asFunctionInternal, 2, 1) {
-#if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
   UNREACHABLE();
-#else
-  ASSERT(FLAG_enable_interpreter);
-
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NATIVE_TYPE_ARGUMENT(dart_type, arguments->NativeTypeArgAt(0));
-  GET_NATIVE_TYPE_ARGUMENT(native_type, arguments->NativeTypeArgAt(1));
-
-  const Function& dart_signature =
-      Function::Handle(zone, Type::Cast(dart_type).signature());
-  const Function& native_signature =
-      Function::Handle(zone, Type::Cast(native_type).signature());
-  const Function& function = Function::Handle(
-      compiler::ffi::TrampolineFunction(dart_signature, native_signature));
-
-  // Set the c function pointer in the context of the closure rather than in
-  // the function so that we can reuse the function for each c function with
-  // the same signature.
-  const Context& context = Context::Handle(Context::New(1));
-  context.SetAt(0, pointer);
-
-  return Closure::New(Object::null_type_arguments(),
-                      Object::null_type_arguments(), function, context,
-                      Heap::kOld);
-#endif
 }
 
 DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData, 0, 2) {
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 905cb26..4b381cb 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -51,12 +51,11 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 2) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 1) {
   ASSERT(
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(1));
   Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
-  return ReceivePort::New(port_id, debug_name, false /* not control port */);
+  return ReceivePort::New(port_id, false /* not control port */);
 }
 
 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 0, 1) {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 458e9a1..e1ab140 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -456,76 +456,6 @@
                                        prefix_name, is_import, is_deferred);
 }
 
-static GrowableObjectArrayPtr CreateBytecodeLibraryDependencies(
-    Thread* thread,
-    const Library& lib,
-    const Instance& lib_mirror) {
-  ASSERT(lib.is_declared_in_bytecode());
-
-  // Make sure top level class (containing annotations) is fully loaded.
-  lib.EnsureTopLevelClassIsFinalized();
-
-  const auto& deps = GrowableObjectArray::Handle(GrowableObjectArray::New());
-  Array& metadata = Array::Handle(lib.GetExtendedMetadata(lib, 1));
-  if (metadata.Length() == 0) {
-    return deps.raw();
-  }
-
-  // Library has the only element in the extended metadata.
-  metadata ^= metadata.At(0);
-  if (metadata.IsNull()) {
-    return deps.raw();
-  }
-
-  auto& desc = Array::Handle();
-  auto& target_uri = String::Handle();
-  auto& importee = Library::Handle();
-  auto& is_export = Bool::Handle();
-  auto& is_deferred = Bool::Handle();
-  auto& prefix_name = String::Handle();
-  auto& show_names = Array::Handle();
-  auto& hide_names = Array::Handle();
-  auto& dep_metadata = Instance::Handle();
-  auto& dep = Instance::Handle();
-  const auto& no_prefix = LibraryPrefix::Handle();
-
-  for (intptr_t i = 0, n = metadata.Length(); i < n; ++i) {
-    desc ^= metadata.At(i);
-    // Each dependency is represented as an array with the following layout:
-    //  [0] = target library URI (String)
-    //  [1] = is_export (bool)
-    //  [2] = is_deferred (bool)
-    //  [3] = prefix (String or null)
-    //  [4] = list of show names (List<String>)
-    //  [5] = list of hide names (List<String>)
-    //  [6] = annotations
-    // The library dependencies are encoded by getLibraryAnnotations(),
-    // pkg/vm/lib/bytecode/gen_bytecode.dart.
-    target_uri ^= desc.At(0);
-    is_export ^= desc.At(1);
-    is_deferred ^= desc.At(2);
-    prefix_name ^= desc.At(3);
-    show_names ^= desc.At(4);
-    hide_names ^= desc.At(5);
-    dep_metadata ^= desc.At(6);
-
-    importee = Library::LookupLibrary(thread, target_uri);
-    if (importee.IsNull()) {
-      continue;
-    }
-    ASSERT(importee.Loaded());
-
-    dep = CreateLibraryDependencyMirror(
-        thread, lib_mirror, importee, show_names, hide_names, dep_metadata,
-        no_prefix, prefix_name, !is_export.value(), is_deferred.value());
-    if (!dep.IsNull()) {
-      deps.Add(dep);
-    }
-  }
-
-  return deps.raw();
-}
-
 DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix,
                                arguments->NativeArgAt(0));
@@ -541,10 +471,6 @@
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Library& lib = Library::Handle(ref.GetLibraryReferent());
 
-  if (lib.is_declared_in_bytecode()) {
-    return CreateBytecodeLibraryDependencies(thread, lib, lib_mirror);
-  }
-
   Array& ports = Array::Handle();
   Namespace& ns = Namespace::Handle();
   Instance& dep = Instance::Handle();
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index 4b2afb9..43383d4 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -141,7 +141,7 @@
   if (!FLAG_causal_async_stacks) {
     // If causal async stacks are not enabled we should recognize this method
     // and never call to the NOP runtime.
-    // See kernel_to_il.cc/bytecode_reader.cc/interpreter.cc.
+    // See kernel_to_il.cc.
     UNREACHABLE();
   }
 #if !defined(PRODUCT)
@@ -180,7 +180,6 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   for (; frame != NULL; frame = frames.NextFrame()) {
     if (!frame->IsDartFrame()) {
@@ -191,18 +190,9 @@
       continue;
     }
 
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      if (bytecode.function() == Function::null()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      code_list.Add(bytecode);
-    } else {
-      code = frame->LookupDartCode();
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      code_list.Add(code);
-    }
+    code = frame->LookupDartCode();
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    code_list.Add(code);
     pc_offset_list.Add(offset);
   }
 }
@@ -224,12 +214,4 @@
   return stacktrace;
 }
 
-bool HasStack() {
-  Thread* thread = Thread::Current();
-  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
-                            StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame = frames.NextFrame();
-  return frame != nullptr;
-}
-
 }  // namespace dart
diff --git a/runtime/lib/stacktrace.h b/runtime/lib/stacktrace.h
index a804d62..9c8abae 100644
--- a/runtime/lib/stacktrace.h
+++ b/runtime/lib/stacktrace.h
@@ -21,9 +21,6 @@
 // Creates a StackTrace object to be attached to an exception.
 StackTracePtr GetStackTraceForException();
 
-// Returns false if there is no Dart stack available.
-bool HasStack();
-
 }  // namespace dart
 
 #endif  // RUNTIME_LIB_STACKTRACE_H_
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index b49b14e..d71d08e 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -178,7 +178,7 @@
 }
 
 // Native methods for typed data allocation are recognized and implemented
-// both in FlowGraphBuilder::BuildGraphOfRecognizedMethod and interpreter.
+// in FlowGraphBuilder::BuildGraphOfRecognizedMethod.
 // These bodies exist only to assert that they are not used.
 #define TYPED_DATA_NEW(name)                                                   \
   DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 0, 2) {                          \
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index e5bcfd1..b1b3654 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -277,21 +277,6 @@
             ]
         ]);
     }
-    if (_function.bytecode != null) {
-      members.add(new DivElement()
-        ..classes = ['memberItem']
-        ..children = <Element>[
-          new DivElement()
-            ..classes = ['memberName']
-            ..text = 'bytecode',
-          new DivElement()
-            ..classes = ['memberName']
-            ..children = <Element>[
-              new CodeRefElement(_isolate, _function.bytecode!, queue: _r.queue)
-                  .element,
-            ]
-        ]);
-    }
     members.add(new DivElement()
       ..classes = ['memberItem']
       ..text = ' ');
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 3dbe653..e63ef40 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -88,9 +88,6 @@
   CodeRef? get unoptimizedCode;
 
   /// [optional]
-  CodeRef? get bytecode;
-
-  /// [optional]
   FieldRef? get field;
   int? get usageCounter;
   InstanceRef? get icDataArray;
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index a0400c5..ab8d6d6 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -120,9 +120,6 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
-
-  /// An instance of the Dart class RawReceivePort
-  receivePort,
 }
 
 bool isTypedData(InstanceKind? kind) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 8352f38..4f9ead0 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2781,8 +2781,6 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
-    case 'ReceivePort':
-      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
@@ -3167,7 +3165,6 @@
   SourceLocation? location;
   Code? code;
   Code? unoptimizedCode;
-  Code? bytecode;
   bool? isOptimizable;
   bool? isInlinable;
   bool? hasIntrinsic;
@@ -3226,7 +3223,6 @@
     isInlinable = map['_inlinable'];
     isRecognized = map['_recognized'];
     unoptimizedCode = map['_unoptimizedCode'];
-    bytecode = map['_bytecode'];
     deoptimizations = map['_deoptimizations'];
     usageCounter = map['_usageCounter'];
     icDataArray = map['_icDataArray'];
diff --git a/runtime/observatory/tests/service/get_ports_public_rpc_test.dart b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
deleted file mode 100644
index cc511f7..0000000
--- a/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2020, 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.
-
-import 'dart:isolate' hide Isolate;
-import 'package:observatory/service_io.dart';
-import 'package:test/test.dart';
-
-import 'test_helper.dart';
-
-var port1;
-var port2;
-var port3;
-
-void warmup() {
-  port1 = RawReceivePort(null, 'port1');
-  port2 = RawReceivePort((_) {});
-  port3 = RawReceivePort((_) {}, 'port3');
-  port3.close();
-  RawReceivePort((_) {}, 'port4');
-}
-
-int countNameMatches(ports, name) {
-  var matches = 0;
-  for (var port in ports) {
-    if (port['debugName'] == name) {
-      matches++;
-    }
-  }
-  return matches;
-}
-
-final tests = <IsolateTest>[
-  (Isolate isolate) async {
-    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
-    expect(result['type'], 'PortList');
-    expect(result['ports'], isList);
-    final ports = result['ports'];
-    // There are at least three ports: the three created in warm up that
-    // weren't closed. Some OSes will have other ports open but we do not try
-    // and test for these.
-    expect(ports.length, greaterThanOrEqualTo(3));
-    expect(countNameMatches(ports, 'port1'), 1);
-    expect(countNameMatches(ports, 'port3'), 0);
-    expect(countNameMatches(ports, 'port4'), 1);
-    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
-  },
-];
-
-main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index c8b0244..8b56393 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -9,12 +9,12 @@
 
 var tests = <VMTest>[
   (VM vm) async {
-    final result = await vm.invokeRpcNoUpgrade('getVersion', {});
-    expect(result['type'], 'Version');
-    expect(result['major'], 3);
-    expect(result['minor'], 41);
-    expect(result['_privateMajor'], 0);
-    expect(result['_privateMinor'], 0);
+    var result = await vm.invokeRpcNoUpgrade('getVersion', {});
+    expect(result['type'], equals('Version'));
+    expect(result['major'], equals(3));
+    expect(result['minor'], equals(40));
+    expect(result['_privateMajor'], equals(0));
+    expect(result['_privateMinor'], equals(0));
   },
 ];
 
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index e127bde..0189540 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -577,7 +577,7 @@
       expectedStops = removeAdjacentDuplicates(expectedStops);
     }
 
-    // Single stepping in interpreted bytecode may record extra stops.
+    // Single stepping may record extra stops.
     // Allow the extra ones as long as the expected ones are recorded.
     int i = 0;
     int j = 0;
diff --git a/runtime/observatory_2/lib/src/elements/function_view.dart b/runtime/observatory_2/lib/src/elements/function_view.dart
index 7077bc3..cad9250 100644
--- a/runtime/observatory_2/lib/src/elements/function_view.dart
+++ b/runtime/observatory_2/lib/src/elements/function_view.dart
@@ -276,21 +276,6 @@
             ]
         ]);
     }
-    if (_function.bytecode != null) {
-      members.add(new DivElement()
-        ..classes = ['memberItem']
-        ..children = <Element>[
-          new DivElement()
-            ..classes = ['memberName']
-            ..text = 'bytecode',
-          new DivElement()
-            ..classes = ['memberName']
-            ..children = <Element>[
-              new CodeRefElement(_isolate, _function.bytecode, queue: _r.queue)
-                  .element,
-            ]
-        ]);
-    }
     members.add(new DivElement()
       ..classes = ['memberItem']
       ..text = ' ');
diff --git a/runtime/observatory_2/lib/src/models/objects/function.dart b/runtime/observatory_2/lib/src/models/objects/function.dart
index 82d3d7f..7de7ad6 100644
--- a/runtime/observatory_2/lib/src/models/objects/function.dart
+++ b/runtime/observatory_2/lib/src/models/objects/function.dart
@@ -88,9 +88,6 @@
   CodeRef get unoptimizedCode;
 
   /// [optional]
-  CodeRef get bytecode;
-
-  /// [optional]
   FieldRef get field;
   int get usageCounter;
   InstanceRef get icDataArray;
diff --git a/runtime/observatory_2/lib/src/models/objects/instance.dart b/runtime/observatory_2/lib/src/models/objects/instance.dart
index e52cdd7..66965e9 100644
--- a/runtime/observatory_2/lib/src/models/objects/instance.dart
+++ b/runtime/observatory_2/lib/src/models/objects/instance.dart
@@ -120,9 +120,6 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
-
-  /// An instance of the Dart class RawReceivePort
-  receivePort,
 }
 
 bool isTypedData(InstanceKind kind) {
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index 9b6ac2d..1bd33fb 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -2790,8 +2790,6 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
-    case 'ReceivePort':
-      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
@@ -3180,7 +3178,6 @@
   SourceLocation location;
   Code code;
   Code unoptimizedCode;
-  Code bytecode;
   bool isOptimizable;
   bool isInlinable;
   bool hasIntrinsic;
@@ -3239,7 +3236,6 @@
     isInlinable = map['_inlinable'];
     isRecognized = map['_recognized'];
     unoptimizedCode = map['_unoptimizedCode'];
-    bytecode = map['_bytecode'];
     deoptimizations = map['_deoptimizations'];
     usageCounter = map['_usageCounter'];
     icDataArray = map['_icDataArray'];
diff --git a/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
deleted file mode 100644
index 179823f..0000000
--- a/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2020, 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.
-
-import 'dart:isolate' hide Isolate;
-import 'package:observatory_2/service_io.dart';
-import 'package:test/test.dart';
-
-import 'test_helper.dart';
-
-var port1;
-var port2;
-var port3;
-
-void warmup() {
-  port1 = RawReceivePort(null, 'port1');
-  port2 = RawReceivePort((_) {});
-  port3 = RawReceivePort((_) {}, 'port3');
-  port3.close();
-  RawReceivePort((_) {}, 'port4');
-}
-
-int countNameMatches(ports, name) {
-  var matches = 0;
-  for (var port in ports) {
-    if (port['debugName'] == name) {
-      matches++;
-    }
-  }
-  return matches;
-}
-
-final tests = <IsolateTest>[
-  (Isolate isolate) async {
-    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
-    expect(result['type'], 'PortList');
-    expect(result['ports'], isList);
-    final ports = result['ports'];
-    // There are at least three ports: the three created in warm up that
-    // weren't closed. Some OSes will have other ports open but we do not try
-    // and test for these.
-    expect(ports.length, greaterThanOrEqualTo(3));
-    expect(countNameMatches(ports, 'port1'), 1);
-    expect(countNameMatches(ports, 'port3'), 0);
-    expect(countNameMatches(ports, 'port4'), 1);
-    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
-  },
-];
-
-main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index df37cb9..d5450e5 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(41));
+    expect(result['minor'], equals(40));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory_2/tests/service_2/service_test_common.dart b/runtime/observatory_2/tests/service_2/service_test_common.dart
index 4373982..7775b29 100644
--- a/runtime/observatory_2/tests/service_2/service_test_common.dart
+++ b/runtime/observatory_2/tests/service_2/service_test_common.dart
@@ -577,7 +577,7 @@
       expectedStops = removeAdjacentDuplicates(expectedStops);
     }
 
-    // Single stepping in interpreted bytecode may record extra stops.
+    // Single stepping may record extra stops.
     // Allow the extra ones as long as the expected ones are recorded.
     int i = 0;
     int j = 0;
diff --git a/runtime/tests/vm/dart/entrypoints/common.dart b/runtime/tests/vm/dart/entrypoints/common.dart
index 0d41ddc..af25c8b 100644
--- a/runtime/tests/vm/dart/entrypoints/common.dart
+++ b/runtime/tests/vm/dart/entrypoints/common.dart
@@ -28,7 +28,7 @@
   int unchecked = 0;
 
   // Leave a little room for some cases which always use the checked entry, like
-  // lazy compile stub or interpreter warm-up.
+  // lazy compile stub.
   static const int wiggle = 10;
 
   void expectChecked(int iterations) {
diff --git a/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart b/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart
deleted file mode 100644
index 606e4c5..0000000
--- a/runtime/tests/vm/dart/regress_merge_blocks_with_phis_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2019, 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.
-//
-// VMOptions=--optimization-counter-threshold=5 --use-bytecode-compiler
-//
-// Test that block merging takes phis into account.
-//
-// The problem only reproduces with bytecode compiler (--use-bytecode-compiler)
-// as bytecode doesn't have backward branches for the redundant loops.
-// OSR handling code inserts Phi instructions to JoinEntry
-// even when there is only one predecessor. This results in a flow graph
-// suitable for block merging with a successor block containing Phi.
-
-import 'package:expect/expect.dart';
-
-void testBottomUpInference() {
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-}
-
-main() {
-  testBottomUpInference();
-}
diff --git a/runtime/tests/vm/dart_2/entrypoints/common.dart b/runtime/tests/vm/dart_2/entrypoints/common.dart
index bc8822a..19c01b4 100644
--- a/runtime/tests/vm/dart_2/entrypoints/common.dart
+++ b/runtime/tests/vm/dart_2/entrypoints/common.dart
@@ -28,7 +28,7 @@
   int unchecked = 0;
 
   // Leave a little room for some cases which always use the checked entry, like
-  // lazy compile stub or interpreter warm-up.
+  // lazy compile stub.
   static const int wiggle = 10;
 
   void expectChecked(int iterations) {
diff --git a/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart b/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart
deleted file mode 100644
index 606e4c5..0000000
--- a/runtime/tests/vm/dart_2/regress_merge_blocks_with_phis_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2019, 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.
-//
-// VMOptions=--optimization-counter-threshold=5 --use-bytecode-compiler
-//
-// Test that block merging takes phis into account.
-//
-// The problem only reproduces with bytecode compiler (--use-bytecode-compiler)
-// as bytecode doesn't have backward branches for the redundant loops.
-// OSR handling code inserts Phi instructions to JoinEntry
-// even when there is only one predecessor. This results in a flow graph
-// suitable for block merging with a successor block containing Phi.
-
-import 'package:expect/expect.dart';
-
-void testBottomUpInference() {
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-  Expect.type<List<int>>([for (; false;) 1]);
-}
-
-main() {
-  testBottomUpInference();
-}
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 2858488..551ca97 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -313,7 +313,6 @@
     TransitionNativeToVM transition(thread);
     const int kNumIterations = 100;
     Code& code = Code::Handle(thread->zone());
-    Bytecode& bytecode = Bytecode::Handle(thread->zone());
     for (int i = 0; i < kNumIterations; i++) {
       StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
                                 StackFrameIterator::kNoCrossThreadIteration);
@@ -323,13 +322,8 @@
           code = frame->LookupDartCode();
           EXPECT(code.function() == Function::null());
         } else if (frame->IsDartFrame()) {
-          if (frame->is_interpreted()) {
-            bytecode = frame->LookupDartBytecode();
-            EXPECT(bytecode.function() != Function::null());
-          } else {
-            code = frame->LookupDartCode();
-            EXPECT(code.function() != Function::null());
-          }
+          code = frame->LookupDartCode();
+          EXPECT(code.function() != Function::null());
         }
         frame = frames.NextFrame();
       }
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 8b15f7b..b7ef75aa 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -54,7 +54,7 @@
   V(CapabilityImpl_factory, 1)                                                 \
   V(CapabilityImpl_equals, 2)                                                  \
   V(CapabilityImpl_get_hashcode, 1)                                            \
-  V(RawReceivePortImpl_factory, 2)                                             \
+  V(RawReceivePortImpl_factory, 1)                                             \
   V(RawReceivePortImpl_get_id, 1)                                              \
   V(RawReceivePortImpl_get_sendport, 1)                                        \
   V(RawReceivePortImpl_closeInternal, 1)                                       \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5930f2f..bd07103 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -12,7 +12,6 @@
 #include "vm/flags.h"
 #include "vm/hash_table.h"
 #include "vm/heap/heap.h"
-#include "vm/interpreter.h"
 #include "vm/isolate.h"
 #include "vm/kernel_loader.h"
 #include "vm/log.h"
@@ -198,19 +197,14 @@
 #if defined(DEBUG)
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
-      ASSERT(cls.is_declared_in_bytecode() || cls.is_declaration_loaded());
+      ASSERT(cls.is_declaration_loaded());
     }
 #endif
 
     // Finalize types in all classes.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
-      if (cls.is_declared_in_bytecode()) {
-        cls.EnsureDeclarationLoaded();
-        ASSERT(cls.is_type_finalized());
-      } else {
-        FinalizeTypesInClass(cls);
-      }
+      FinalizeTypesInClass(cls);
     }
 
     // Clear pending classes array.
@@ -1118,14 +1112,9 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // If loading from a kernel, make sure that the class is fully loaded.
-  ASSERT(cls.IsTopLevel() || cls.is_declared_in_bytecode() ||
-         (cls.kernel_offset() > 0));
+  ASSERT(cls.IsTopLevel() || (cls.kernel_offset() > 0));
   if (!cls.is_loaded()) {
-    if (cls.is_declared_in_bytecode()) {
-      kernel::BytecodeReader::FinishClassLoading(cls);
-    } else {
-      kernel::KernelLoader::FinishLoading(cls);
-    }
+    kernel::KernelLoader::FinishLoading(cls);
     if (cls.is_finalized()) {
       return;
     }
@@ -1264,7 +1253,7 @@
   ASSERT(!sentinel.IsNull());
   sentinel.SetStaticValue(enum_value, true);
 
-  ASSERT(enum_cls.is_declared_in_bytecode() || enum_cls.kernel_offset() > 0);
+  ASSERT(enum_cls.kernel_offset() > 0);
   Error& error = Error::Handle(zone);
   for (intptr_t i = 0; i < fields.Length(); i++) {
     field = Field::RawCast(fields.At(i));
@@ -1712,14 +1701,6 @@
 #ifdef DART_PRECOMPILED_RUNTIME
   UNREACHABLE();
 #else
-  Thread* mutator_thread = Isolate::Current()->mutator_thread();
-  if (mutator_thread != nullptr) {
-    Interpreter* interpreter = mutator_thread->interpreter();
-    if (interpreter != nullptr) {
-      interpreter->ClearLookupCache();
-    }
-  }
-
   auto const thread = Thread::Current();
   auto const isolate = thread->isolate();
   StackZone stack_zone(thread);
@@ -1730,7 +1711,6 @@
    public:
     ClearCodeVisitor(Zone* zone, bool force)
         : force_(force),
-          bytecode_(Bytecode::Handle(zone)),
           pool_(ObjectPool::Handle(zone)),
           entry_(Object::Handle(zone)) {}
 
@@ -1741,28 +1721,12 @@
     }
 
     void VisitFunction(const Function& function) {
-      bytecode_ = function.bytecode();
-      if (!bytecode_.IsNull()) {
-        pool_ = bytecode_.object_pool();
-        for (intptr_t i = 0; i < pool_.Length(); i++) {
-          ObjectPool::EntryType entry_type = pool_.TypeAt(i);
-          if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-            continue;
-          }
-          entry_ = pool_.ObjectAt(i);
-          if (entry_.IsSubtypeTestCache()) {
-            SubtypeTestCache::Cast(entry_).Reset();
-          }
-        }
-      }
-
       function.ClearCode();
       function.ClearICDataArray();
     }
 
    private:
     const bool force_;
-    Bytecode& bytecode_;
     ObjectPool& pool_;
     Object& entry_;
   };
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 0664cbb..92faca0 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -31,7 +31,6 @@
   V(Namespace)                                                                 \
   V(KernelProgramInfo)                                                         \
   V(Code)                                                                      \
-  V(Bytecode)                                                                  \
   V(Instructions)                                                              \
   V(InstructionsSection)                                                       \
   V(ObjectPool)                                                                \
@@ -42,7 +41,6 @@
   V(ExceptionHandlers)                                                         \
   V(Context)                                                                   \
   V(ContextScope)                                                              \
-  V(ParameterTypeCheck)                                                        \
   V(SingleTargetCache)                                                         \
   V(UnlinkedCall)                                                              \
   V(MonomorphicSmiableCall)                                                    \
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index e32e798..8ab0091 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -250,7 +250,7 @@
       s->UnexpectedObject(cls, "Class with non mode agnostic constants");
     }
     if (s->kind() != Snapshot::kFullAOT) {
-      s->Write<uint32_t>(cls->ptr()->binary_declaration_);
+      s->Write<uint32_t>(cls->ptr()->kernel_offset_);
     }
     s->Write<int32_t>(Class::target_instance_size_in_words(cls));
     s->Write<int32_t>(Class::target_next_field_offset_in_words(cls));
@@ -325,7 +325,7 @@
       cls->ptr()->id_ = class_id;
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        cls->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        cls->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
       if (!IsInternalVMdefinedClassId(class_id)) {
@@ -372,7 +372,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        cls->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        cls->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
       cls->ptr()->host_instance_size_in_words_ = d->Read<int32_t>();
@@ -598,13 +598,10 @@
     objects_.Add(func);
 
     PushFromTo(func);
-    if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
-    } else if (kind == Snapshot::kFullAOT) {
+    if (kind == Snapshot::kFullAOT) {
       s->Push(func->ptr()->code_);
     } else if (kind == Snapshot::kFullJIT) {
       NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_));
-      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
       s->Push(func->ptr()->code_);
       s->Push(func->ptr()->ic_data_array_);
     }
@@ -627,13 +624,10 @@
       FunctionPtr func = objects_[i];
       AutoTraceObjectName(func, MakeDisambiguatedFunctionName(s, func));
       WriteFromTo(func);
-      if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
-      } else if (kind == Snapshot::kFullAOT) {
+      if (kind == Snapshot::kFullAOT) {
         WriteField(func, code_);
       } else if (s->kind() == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(WriteField(func, unoptimized_code_));
-        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
         WriteField(func, code_);
         WriteField(func, ic_data_array_);
       }
@@ -641,7 +635,7 @@
       if (kind != Snapshot::kFullAOT) {
         s->WriteTokenPosition(func->ptr()->token_pos_);
         s->WriteTokenPosition(func->ptr()->end_token_pos_);
-        s->Write<uint32_t>(func->ptr()->binary_declaration_);
+        s->Write<uint32_t>(func->ptr()->kernel_offset_);
       }
 
       s->Write<uint32_t>(func->ptr()->packed_fields_);
@@ -694,16 +688,11 @@
                                      Function::InstanceSize());
       ReadFromTo(func);
 
-      if ((kind == Snapshot::kFull) || (kind == Snapshot::kFullCore)) {
-        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               static_cast<BytecodePtr>(d->ReadRef()));
-      } else if (kind == Snapshot::kFullAOT) {
+      if (kind == Snapshot::kFullAOT) {
         func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
       } else if (kind == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
                                static_cast<CodePtr>(d->ReadRef()));
-        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               static_cast<BytecodePtr>(d->ReadRef()));
         func->ptr()->code_ = static_cast<CodePtr>(d->ReadRef());
         func->ptr()->ic_data_array_ = static_cast<ArrayPtr>(d->ReadRef());
       }
@@ -717,7 +706,7 @@
       if (kind != Snapshot::kFullAOT) {
         func->ptr()->token_pos_ = d->ReadTokenPosition();
         func->ptr()->end_token_pos_ = d->ReadTokenPosition();
-        func->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        func->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
       func->ptr()->unboxed_parameters_info_.Reset();
 #endif
@@ -1143,7 +1132,7 @@
         s->WriteCid(field->ptr()->guarded_cid_);
         s->WriteCid(field->ptr()->is_nullable_);
         s->Write<int8_t>(field->ptr()->static_type_exactness_state_);
-        s->Write<uint32_t>(field->ptr()->binary_declaration_);
+        s->Write<uint32_t>(field->ptr()->kernel_offset_);
       }
       s->Write<uint16_t>(field->ptr()->kind_bits_);
 
@@ -1213,7 +1202,7 @@
         field->ptr()->is_nullable_ = d->ReadCid();
         field->ptr()->static_type_exactness_state_ = d->Read<int8_t>();
 #if !defined(DART_PRECOMPILED_RUNTIME)
-        field->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        field->ptr()->kernel_offset_ = d->Read<uint32_t>();
 #endif
       }
       field->ptr()->kind_bits_ = d->Read<uint16_t>();
@@ -1359,7 +1348,7 @@
       s->Write<int8_t>(lib->ptr()->load_state_);
       s->Write<uint8_t>(lib->ptr()->flags_);
       if (s->kind() != Snapshot::kFullAOT) {
-        s->Write<uint32_t>(lib->ptr()->binary_declaration_);
+        s->Write<uint32_t>(lib->ptr()->kernel_offset_);
       }
     }
   }
@@ -1398,7 +1387,7 @@
           LibraryLayout::InFullSnapshotBit::update(true, d->Read<uint8_t>());
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
-        lib->ptr()->binary_declaration_ = d->Read<uint32_t>();
+        lib->ptr()->kernel_offset_ = d->Read<uint32_t>();
       }
 #endif
     }
@@ -1982,88 +1971,6 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class BytecodeSerializationCluster : public SerializationCluster {
- public:
-  BytecodeSerializationCluster() : SerializationCluster("Bytecode") {}
-  virtual ~BytecodeSerializationCluster() {}
-
-  void Trace(Serializer* s, ObjectPtr object) {
-    BytecodePtr bytecode = Bytecode::RawCast(object);
-    objects_.Add(bytecode);
-    PushFromTo(bytecode);
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kBytecodeCid);
-    const intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      BytecodePtr bytecode = objects_[i];
-      s->AssignRef(bytecode);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    ASSERT(s->kind() != Snapshot::kFullAOT);
-    const intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      BytecodePtr bytecode = objects_[i];
-      s->Write<int32_t>(bytecode->ptr()->instructions_size_);
-      WriteFromTo(bytecode);
-      s->Write<int32_t>(bytecode->ptr()->instructions_binary_offset_);
-      s->Write<int32_t>(bytecode->ptr()->source_positions_binary_offset_);
-      s->Write<int32_t>(bytecode->ptr()->local_variables_binary_offset_);
-    }
-  }
-
- private:
-  GrowableArray<BytecodePtr> objects_;
-};
-
-class BytecodeDeserializationCluster : public DeserializationCluster {
- public:
-  BytecodeDeserializationCluster() : DeserializationCluster("Bytecode") {}
-  virtual ~BytecodeDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d, bool is_canonical) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    const intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space, Bytecode::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d, bool is_canonical) {
-    ASSERT(d->kind() != Snapshot::kFullAOT);
-
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      BytecodePtr bytecode = static_cast<BytecodePtr>(d->Ref(id));
-      Deserializer::InitializeHeader(bytecode, kBytecodeCid,
-                                     Bytecode::InstanceSize());
-      bytecode->ptr()->instructions_ = 0;
-      bytecode->ptr()->instructions_size_ = d->Read<int32_t>();
-      ReadFromTo(bytecode);
-      bytecode->ptr()->instructions_binary_offset_ = d->Read<int32_t>();
-      bytecode->ptr()->source_positions_binary_offset_ = d->Read<int32_t>();
-      bytecode->ptr()->local_variables_binary_offset_ = d->Read<int32_t>();
-    }
-  }
-
-  void PostLoad(Deserializer* d, const Array& refs, bool is_canonical) {
-    Bytecode& bytecode = Bytecode::Handle(d->zone());
-    ExternalTypedData& binary = ExternalTypedData::Handle(d->zone());
-
-    for (intptr_t i = start_index_; i < stop_index_; i++) {
-      bytecode ^= refs.At(i);
-      binary = bytecode.GetBinary(d->zone());
-      bytecode.set_instructions(reinterpret_cast<uword>(
-          binary.DataAddr(bytecode.instructions_binary_offset())));
-    }
-  }
-};
-
 class ObjectPoolSerializationCluster : public SerializationCluster {
  public:
   ObjectPoolSerializationCluster() : SerializationCluster("ObjectPool") {}
@@ -2077,8 +1984,7 @@
     uint8_t* entry_bits = pool->ptr()->entry_bits();
     for (intptr_t i = 0; i < length; i++) {
       auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-      if ((entry_type == ObjectPool::EntryType::kTaggedObject) ||
-          (entry_type == ObjectPool::EntryType::kNativeEntryData)) {
+      if (entry_type == ObjectPool::EntryType::kTaggedObject) {
         s->Push(pool->ptr()->data()[i].raw_obj_);
       }
     }
@@ -2125,22 +2031,6 @@
             s->Write<intptr_t>(entry.raw_value_);
             break;
           }
-          case ObjectPool::EntryType::kNativeEntryData: {
-            ObjectPtr raw = entry.raw_obj_;
-            TypedDataPtr raw_data = static_cast<TypedDataPtr>(raw);
-            // kNativeEntryData object pool entries are for linking natives for
-            // the interpreter. Before writing these entries into the snapshot,
-            // we need to unlink them by nulling out the 'trampoline' and
-            // 'native_function' fields.
-            NativeEntryData::Payload* payload =
-                NativeEntryData::FromTypedArray(raw_data);
-            if (payload->kind == MethodRecognizer::kUnknown) {
-              payload->trampoline = NULL;
-              payload->native_function = NULL;
-            }
-            s->WriteElementRef(raw, j);
-            break;
-          }
           case ObjectPool::EntryType::kNativeFunction:
           case ObjectPool::EntryType::kNativeFunctionWrapper: {
             // Write nothing. Will initialize with the lazy link entry.
@@ -2187,7 +2077,6 @@
         pool->ptr()->entry_bits()[j] = entry_bits;
         ObjectPoolLayout::Entry& entry = pool->ptr()->data()[j];
         switch (ObjectPool::TypeBits::decode(entry_bits)) {
-          case ObjectPool::EntryType::kNativeEntryData:
           case ObjectPool::EntryType::kTaggedObject:
             entry.raw_obj_ = d->ReadRef();
             break;
@@ -2756,72 +2645,6 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class ParameterTypeCheckSerializationCluster : public SerializationCluster {
- public:
-  ParameterTypeCheckSerializationCluster()
-      : SerializationCluster("ParameterTypeCheck") {}
-  ~ParameterTypeCheckSerializationCluster() {}
-
-  void Trace(Serializer* s, ObjectPtr object) {
-    ParameterTypeCheckPtr unlinked = ParameterTypeCheck::RawCast(object);
-    objects_.Add(unlinked);
-    PushFromTo(unlinked);
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kParameterTypeCheckCid);
-    const intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      ParameterTypeCheckPtr check = objects_[i];
-      s->AssignRef(check);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    const intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      ParameterTypeCheckPtr check = objects_[i];
-      s->Write<intptr_t>(check->ptr()->index_);
-      WriteFromTo(check);
-    }
-  }
-
- private:
-  GrowableArray<ParameterTypeCheckPtr> objects_;
-};
-#endif  // !DART_PRECOMPILED_RUNTIME
-
-class ParameterTypeCheckDeserializationCluster : public DeserializationCluster {
- public:
-  ParameterTypeCheckDeserializationCluster()
-      : DeserializationCluster("ParameterTypeCheck") {}
-  ~ParameterTypeCheckDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d, bool is_canonical) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    const intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(
-          AllocateUninitialized(old_space, ParameterTypeCheck::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d, bool is_canonical) {
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      ParameterTypeCheckPtr check =
-          static_cast<ParameterTypeCheckPtr>(d->Ref(id));
-      Deserializer::InitializeHeader(check, kParameterTypeCheckCid,
-                                     ParameterTypeCheck::InstanceSize());
-      check->ptr()->index_ = d->Read<intptr_t>();
-      ReadFromTo(check);
-    }
-  }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 class UnlinkedCallSerializationCluster : public SerializationCluster {
  public:
   UnlinkedCallSerializationCluster() : SerializationCluster("UnlinkedCall") {}
@@ -5024,22 +4847,6 @@
                      "LocalVarDescriptors", "<empty>");
     s->AddBaseObject(Object::empty_exception_handlers().raw(),
                      "ExceptionHandlers", "<empty>");
-    s->AddBaseObject(Object::implicit_getter_bytecode().raw(), "Bytecode",
-                     "<implicit getter>");
-    s->AddBaseObject(Object::implicit_setter_bytecode().raw(), "Bytecode",
-                     "<implicit setter>");
-    s->AddBaseObject(Object::implicit_static_getter_bytecode().raw(),
-                     "Bytecode", "<implicit static getter>");
-    s->AddBaseObject(Object::method_extractor_bytecode().raw(), "Bytecode",
-                     "<method extractor>");
-    s->AddBaseObject(Object::invoke_closure_bytecode().raw(), "Bytecode",
-                     "<invoke closure>");
-    s->AddBaseObject(Object::invoke_field_bytecode().raw(), "Bytecode",
-                     "<invoke field>");
-    s->AddBaseObject(Object::nsm_dispatcher_bytecode().raw(), "Bytecode",
-                     "<nsm dispatcher>");
-    s->AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw(),
-                     "Bytecode", "<dyn forwarder>");
 
     for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
       s->AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i],
@@ -5121,14 +4928,6 @@
     d->AddBaseObject(Object::empty_descriptors().raw());
     d->AddBaseObject(Object::empty_var_descriptors().raw());
     d->AddBaseObject(Object::empty_exception_handlers().raw());
-    d->AddBaseObject(Object::implicit_getter_bytecode().raw());
-    d->AddBaseObject(Object::implicit_setter_bytecode().raw());
-    d->AddBaseObject(Object::implicit_static_getter_bytecode().raw());
-    d->AddBaseObject(Object::method_extractor_bytecode().raw());
-    d->AddBaseObject(Object::invoke_closure_bytecode().raw());
-    d->AddBaseObject(Object::invoke_field_bytecode().raw());
-    d->AddBaseObject(Object::nsm_dispatcher_bytecode().raw());
-    d->AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw());
 
     for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
       d->AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i]);
@@ -5754,8 +5553,6 @@
       return new (Z) KernelProgramInfoSerializationCluster();
     case kCodeCid:
       return new (Z) CodeSerializationCluster(heap_);
-    case kBytecodeCid:
-      return new (Z) BytecodeSerializationCluster();
     case kObjectPoolCid:
       return new (Z) ObjectPoolSerializationCluster();
     case kPcDescriptorsCid:
@@ -5766,8 +5563,6 @@
       return new (Z) ContextSerializationCluster();
     case kContextScopeCid:
       return new (Z) ContextScopeSerializationCluster();
-    case kParameterTypeCheckCid:
-      return new (Z) ParameterTypeCheckSerializationCluster();
     case kUnlinkedCallCid:
       return new (Z) UnlinkedCallSerializationCluster();
     case kICDataCid:
@@ -5934,12 +5729,6 @@
       !Snapshot::IncludesCode(kind_)) {
     return;  // Do not trace, will write null.
   }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (object->IsHeapObject() && object->IsBytecode() &&
-      !Snapshot::IncludesBytecode(kind_)) {
-    return;  // Do not trace, will write null.
-  }
-#endif  // !DART_PRECOMPILED_RUNTIME
 
   intptr_t id = heap_->GetObjectId(object);
   if (id == kUnreachableReference) {
@@ -6458,10 +6247,6 @@
 #endif  // !DART_PRECOMPILED_RUNTIME
     case kCodeCid:
       return new (Z) CodeDeserializationCluster();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    case kBytecodeCid:
-      return new (Z) BytecodeDeserializationCluster();
-#endif  // !DART_PRECOMPILED_RUNTIME
     case kObjectPoolCid:
       return new (Z) ObjectPoolDeserializationCluster();
     case kPcDescriptorsCid:
@@ -6472,8 +6257,6 @@
       return new (Z) ContextDeserializationCluster();
     case kContextScopeCid:
       return new (Z) ContextScopeDeserializationCluster();
-    case kParameterTypeCheckCid:
-      return new (Z) ParameterTypeCheckDeserializationCluster();
     case kUnlinkedCallCid:
       return new (Z) UnlinkedCallDeserializationCluster();
     case kICDataCid:
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index c02f85f..dbfa8d8 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -413,11 +413,6 @@
     if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
       return RefId(Object::null());
     }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (object->IsBytecode() && !Snapshot::IncludesBytecode(kind_)) {
-      return RefId(Object::null());
-    }
-#endif  // !DART_PRECOMPILED_RUNTIME
     FATAL("Missing ref");
   }
 
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index ba7ff04..30828a1 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -107,18 +107,6 @@
 // Example pattern: `[0x3d, 0x8b, -1, -1]`.
 bool MatchesPattern(uword end, const int16_t* pattern, intptr_t size);
 
-class KBCPatcher : public AllStatic {
- public:
-  static NativeFunctionWrapper GetNativeCallAt(uword return_address,
-                                               const Bytecode& bytecode,
-                                               NativeFunction* function);
-
-  static void PatchNativeCallAt(uword return_address,
-                                const Bytecode& bytecode,
-                                NativeFunction function,
-                                NativeFunctionWrapper trampoline);
-};
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_CODE_PATCHER_H_
diff --git a/runtime/vm/code_patcher_kbc.cc b/runtime/vm/code_patcher_kbc.cc
deleted file mode 100644
index 2dd74bd..0000000
--- a/runtime/vm/code_patcher_kbc.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/code_patcher.h"
-
-#include "vm/instructions_kbc.h"
-#include "vm/native_entry.h"
-
-namespace dart {
-
-void KBCPatcher::PatchNativeCallAt(uword return_address,
-                                   const Bytecode& bytecode,
-                                   NativeFunction function,
-                                   NativeFunctionWrapper trampoline) {
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  NativeEntryData native_entry_data(TypedData::Handle(
-      KBCNativeCallPattern::GetNativeEntryDataAt(return_address, bytecode)));
-  native_entry_data.set_trampoline(trampoline);
-  native_entry_data.set_native_function(function);
-}
-
-NativeFunctionWrapper KBCPatcher::GetNativeCallAt(uword return_address,
-                                                  const Bytecode& bytecode,
-                                                  NativeFunction* function) {
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  NativeEntryData native_entry_data(TypedData::Handle(
-      KBCNativeCallPattern::GetNativeEntryDataAt(return_address, bytecode)));
-  *function = native_entry_data.native_function();
-  return native_entry_data.trampoline();
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index f652626..0b503e5 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -278,7 +278,7 @@
       if (FLAG_use_bare_instructions) {
         // We use any stub here to get it's object pool (all stubs share the
         // same object pool in bare instructions mode).
-        const Code& code = StubCode::InterpretCall();
+        const Code& code = StubCode::LazyCompile();
         const ObjectPool& stub_pool = ObjectPool::Handle(code.object_pool());
 
         global_object_pool_builder()->Reset();
@@ -420,7 +420,6 @@
       I->object_store()->set_async_star_move_next_helper(null_function);
       I->object_store()->set_complete_on_async_return(null_function);
       I->object_store()->set_async_star_stream_controller(null_class);
-      I->object_store()->set_bytecode_attributes(Array::null_array());
       DropMetadata();
       DropLibraryEntries();
     }
@@ -1745,7 +1744,6 @@
       for (intptr_t j = 0; j < functions.Length(); j++) {
         function ^= functions.At(j);
         function.DropUncompiledImplicitClosureFunction();
-        function.ClearBytecode();
         if (functions_to_retain_.ContainsKey(function)) {
           retained_functions.Add(function);
         } else {
@@ -1795,7 +1793,6 @@
   retained_functions = GrowableObjectArray::New();
   for (intptr_t j = 0; j < closures.Length(); j++) {
     function ^= closures.At(j);
-    function.ClearBytecode();
     if (functions_to_retain_.ContainsKey(function)) {
       retained_functions.Add(function);
     } else {
@@ -1812,7 +1809,6 @@
   Field& field = Field::Handle(Z);
   GrowableObjectArray& retained_fields = GrowableObjectArray::Handle(Z);
   AbstractType& type = AbstractType::Handle(Z);
-  Function& initializer_function = Function::Handle(Z);
 
   SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
@@ -1825,10 +1821,6 @@
       for (intptr_t j = 0; j < fields.Length(); j++) {
         field ^= fields.At(j);
         bool retain = fields_to_retain_.HasKey(&field);
-        if (field.HasInitializerFunction()) {
-          initializer_function = field.InitializerFunction();
-          initializer_function.ClearBytecode();
-        }
 #if !defined(PRODUCT)
         if (field.is_instance() && cls.is_allocated()) {
           // Keep instance fields so their names are available to graph tools.
@@ -2228,7 +2220,6 @@
           program_info.set_scripts(Array::null_array());
           program_info.set_libraries_cache(Array::null_array());
           program_info.set_classes_cache(Array::null_array());
-          program_info.set_bytecode_component(Array::null_array());
         }
         script.set_resolved_url(String::null_string());
         script.set_compile_time_constants(Array::null_array());
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index e80a81c..41a7902 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -96,7 +96,7 @@
     if (token_pos.IsReal()) {
       return token_pos.value();
     }
-    return key->binary_declaration_offset();
+    return key->kernel_offset();
   }
 
   static inline bool IsKeyEqual(Pair pair, Key key) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 4b84af62..8417f7c 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -639,7 +639,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  LoadImmediate(state, target::Thread::vm_tag_dart_id());
   StoreToOffset(kWord, state, THR, target::Thread::vm_tag_offset());
   LoadImmediate(state, target::Thread::generated_execution_state());
   StoreToOffset(kWord, state, THR, target::Thread::execution_state_offset());
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index f8089ac..67d07c8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1483,7 +1483,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  LoadImmediate(state, target::Thread::vm_tag_dart_id());
   StoreToOffset(state, THR, target::Thread::vm_tag_offset());
   LoadImmediate(state, target::Thread::generated_execution_state());
   StoreToOffset(state, THR, target::Thread::execution_state_offset());
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 07af2ef..06f27c2 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2288,8 +2288,7 @@
   }
 
   // Mark that the thread is executing Dart code.
-  movl(Assembler::VMTagAddress(),
-       Immediate(target::Thread::vm_tag_compiled_id()));
+  movl(Assembler::VMTagAddress(), Immediate(target::Thread::vm_tag_dart_id()));
   movl(Address(THR, target::Thread::execution_state_offset()),
        Immediate(target::Thread::generated_execution_state()));
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 0a833cf..779eadd 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -245,8 +245,7 @@
 #endif
   }
 
-  movq(Assembler::VMTagAddress(),
-       Immediate(target::Thread::vm_tag_compiled_id()));
+  movq(Assembler::VMTagAddress(), Immediate(target::Thread::vm_tag_dart_id()));
   movq(Address(THR, target::Thread::execution_state_offset()),
        Immediate(target::Thread::generated_execution_state()));
 
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
deleted file mode 100644
index 2f0d0d0..0000000
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ /dev/null
@@ -1,456 +0,0 @@
-// 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/assembler/disassembler_kbc.h"
-
-#include "platform/assert.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/constants_kbc.h"
-#include "vm/cpu.h"
-#include "vm/instructions.h"
-
-namespace dart {
-
-static const char* kOpcodeNames[] = {
-#define BYTECODE_NAME(name, encoding, kind, op1, op2, op3) #name,
-    KERNEL_BYTECODES_LIST(BYTECODE_NAME)
-#undef BYTECODE_NAME
-};
-
-static const size_t kOpcodeCount =
-    sizeof(kOpcodeNames) / sizeof(kOpcodeNames[0]);
-static_assert(kOpcodeCount <= 256, "Opcode should fit into a byte");
-
-typedef void (*BytecodeFormatter)(char* buffer,
-                                  intptr_t size,
-                                  KernelBytecode::Opcode opcode,
-                                  const KBCInstr* instr);
-typedef void (*Fmt)(char** buf,
-                    intptr_t* size,
-                    const KBCInstr* instr,
-                    int32_t value);
-
-template <typename ValueType>
-void FormatOperand(char** buf,
-                   intptr_t* size,
-                   const char* fmt,
-                   ValueType value) {
-  intptr_t written = Utils::SNPrint(*buf, *size, fmt, value);
-  if (written < *size) {
-    *buf += written;
-    *size += written;
-  } else {
-    *size = -1;
-  }
-}
-
-static void Fmt___(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {}
-
-static void Fmttgt(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  if (FLAG_disassemble_relative) {
-    FormatOperand(buf, size, "-> %" Pd, value);
-  } else {
-    FormatOperand(buf, size, "-> %" Px, instr + value);
-  }
-}
-
-static void Fmtlit(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "k%d", value);
-}
-
-static void Fmtreg(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "r%d", value);
-}
-
-static void Fmtxeg(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  if (value < 0) {
-    FormatOperand(buf, size, "FP[%d]", value);
-  } else {
-    Fmtreg(buf, size, instr, value);
-  }
-}
-
-static void Fmtnum(char** buf,
-                   intptr_t* size,
-                   const KBCInstr* instr,
-                   int32_t value) {
-  FormatOperand(buf, size, "#%d", value);
-}
-
-static void Apply(char** buf,
-                  intptr_t* size,
-                  const KBCInstr* instr,
-                  Fmt fmt,
-                  int32_t value,
-                  const char* suffix) {
-  if (*size <= 0) {
-    return;
-  }
-
-  fmt(buf, size, instr, value);
-  if (*size > 0) {
-    FormatOperand(buf, size, "%s", suffix);
-  }
-}
-
-static void Format0(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {}
-
-static void FormatA(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  Apply(&buf, &size, instr, op1, a, "");
-}
-
-static void FormatD(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t bc = KernelBytecode::DecodeD(instr);
-  Apply(&buf, &size, instr, op1, bc, "");
-}
-
-static void FormatX(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t bc = KernelBytecode::DecodeX(instr);
-  Apply(&buf, &size, instr, op1, bc, "");
-}
-
-static void FormatT(char* buf,
-                    intptr_t size,
-                    KernelBytecode::Opcode opcode,
-                    const KBCInstr* instr,
-                    Fmt op1,
-                    Fmt op2,
-                    Fmt op3) {
-  const int32_t x = KernelBytecode::DecodeT(instr);
-  Apply(&buf, &size, instr, op1, x, "");
-}
-
-static void FormatA_E(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t e = KernelBytecode::DecodeE(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, e, "");
-}
-
-static void FormatA_Y(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t y = KernelBytecode::DecodeY(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, y, "");
-}
-
-static void FormatD_F(char* buf,
-                      intptr_t size,
-                      KernelBytecode::Opcode opcode,
-                      const KBCInstr* instr,
-                      Fmt op1,
-                      Fmt op2,
-                      Fmt op3) {
-  const int32_t d = KernelBytecode::DecodeD(instr);
-  const int32_t f = KernelBytecode::DecodeF(instr);
-  Apply(&buf, &size, instr, op1, d, ", ");
-  Apply(&buf, &size, instr, op2, f, "");
-}
-
-static void FormatA_B_C(char* buf,
-                        intptr_t size,
-                        KernelBytecode::Opcode opcode,
-                        const KBCInstr* instr,
-                        Fmt op1,
-                        Fmt op2,
-                        Fmt op3) {
-  const int32_t a = KernelBytecode::DecodeA(instr);
-  const int32_t b = KernelBytecode::DecodeB(instr);
-  const int32_t c = KernelBytecode::DecodeC(instr);
-  Apply(&buf, &size, instr, op1, a, ", ");
-  Apply(&buf, &size, instr, op2, b, ", ");
-  Apply(&buf, &size, instr, op3, c, "");
-}
-
-#define BYTECODE_FORMATTER(name, encoding, kind, op1, op2, op3)                \
-  static void Format##name(char* buf, intptr_t size,                           \
-                           KernelBytecode::Opcode opcode,                      \
-                           const KBCInstr* instr) {                            \
-    Format##encoding(buf, size, opcode, instr, Fmt##op1, Fmt##op2, Fmt##op3);  \
-  }
-KERNEL_BYTECODES_LIST(BYTECODE_FORMATTER)
-#undef BYTECODE_FORMATTER
-
-static const BytecodeFormatter kFormatters[] = {
-#define BYTECODE_FORMATTER(name, encoding, kind, op1, op2, op3) &Format##name,
-    KERNEL_BYTECODES_LIST(BYTECODE_FORMATTER)
-#undef BYTECODE_FORMATTER
-};
-
-static intptr_t GetConstantPoolIndex(const KBCInstr* instr) {
-  switch (KernelBytecode::DecodeOpcode(instr)) {
-    case KernelBytecode::kLoadConstant:
-    case KernelBytecode::kLoadConstant_Wide:
-    case KernelBytecode::kInstantiateTypeArgumentsTOS:
-    case KernelBytecode::kInstantiateTypeArgumentsTOS_Wide:
-    case KernelBytecode::kAssertAssignable:
-    case KernelBytecode::kAssertAssignable_Wide:
-      return KernelBytecode::DecodeE(instr);
-
-    case KernelBytecode::kPushConstant:
-    case KernelBytecode::kPushConstant_Wide:
-    case KernelBytecode::kInitLateField:
-    case KernelBytecode::kInitLateField_Wide:
-    case KernelBytecode::kStoreStaticTOS:
-    case KernelBytecode::kStoreStaticTOS_Wide:
-    case KernelBytecode::kLoadStatic:
-    case KernelBytecode::kLoadStatic_Wide:
-    case KernelBytecode::kAllocate:
-    case KernelBytecode::kAllocate_Wide:
-    case KernelBytecode::kAllocateClosure:
-    case KernelBytecode::kAllocateClosure_Wide:
-    case KernelBytecode::kInstantiateType:
-    case KernelBytecode::kInstantiateType_Wide:
-    case KernelBytecode::kDirectCall:
-    case KernelBytecode::kDirectCall_Wide:
-    case KernelBytecode::kUncheckedDirectCall:
-    case KernelBytecode::kUncheckedDirectCall_Wide:
-    case KernelBytecode::kInterfaceCall:
-    case KernelBytecode::kInterfaceCall_Wide:
-    case KernelBytecode::kInstantiatedInterfaceCall:
-    case KernelBytecode::kInstantiatedInterfaceCall_Wide:
-    case KernelBytecode::kUncheckedClosureCall:
-    case KernelBytecode::kUncheckedClosureCall_Wide:
-    case KernelBytecode::kUncheckedInterfaceCall:
-    case KernelBytecode::kUncheckedInterfaceCall_Wide:
-    case KernelBytecode::kDynamicCall:
-    case KernelBytecode::kDynamicCall_Wide:
-      return KernelBytecode::DecodeD(instr);
-
-    default:
-      return -1;
-  }
-}
-
-static bool GetLoadedObjectAt(uword pc,
-                              const ObjectPool& object_pool,
-                              Object* obj) {
-  const KBCInstr* instr = reinterpret_cast<const KBCInstr*>(pc);
-  const intptr_t index = GetConstantPoolIndex(instr);
-  if (index >= 0) {
-    if (object_pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject) {
-      *obj = object_pool.ObjectAt(index);
-      return true;
-    }
-  }
-  return false;
-}
-
-void KernelBytecodeDisassembler::DecodeInstruction(char* hex_buffer,
-                                                   intptr_t hex_size,
-                                                   char* human_buffer,
-                                                   intptr_t human_size,
-                                                   int* out_instr_size,
-                                                   const Bytecode& bytecode,
-                                                   Object** object,
-                                                   uword pc) {
-  const KBCInstr* instr = reinterpret_cast<const KBCInstr*>(pc);
-  const KernelBytecode::Opcode opcode = KernelBytecode::DecodeOpcode(instr);
-  const intptr_t instr_size = KernelBytecode::kInstructionSize[opcode];
-
-  size_t name_size =
-      Utils::SNPrint(human_buffer, human_size, "%-10s\t", kOpcodeNames[opcode]);
-  human_buffer += name_size;
-  human_size -= name_size;
-  kFormatters[opcode](human_buffer, human_size, opcode, instr);
-
-  const intptr_t kCharactersPerByte = 3;
-  if (hex_size > instr_size * kCharactersPerByte) {
-    for (intptr_t i = 0; i < instr_size; ++i) {
-      Utils::SNPrint(hex_buffer + (i * kCharactersPerByte),
-                     hex_size - (i * kCharactersPerByte), " %02x", instr[i]);
-    }
-  }
-  if (out_instr_size != nullptr) {
-    *out_instr_size = instr_size;
-  }
-
-  *object = NULL;
-  if (!bytecode.IsNull()) {
-    *object = &Object::Handle();
-    const ObjectPool& pool = ObjectPool::Handle(bytecode.object_pool());
-    if (!GetLoadedObjectAt(pc, pool, *object)) {
-      *object = NULL;
-    }
-  }
-}
-
-void KernelBytecodeDisassembler::Disassemble(uword start,
-                                             uword end,
-                                             DisassemblyFormatter* formatter,
-                                             const Bytecode& bytecode) {
-#if !defined(PRODUCT)
-  ASSERT(formatter != NULL);
-  char hex_buffer[kHexadecimalBufferSize];  // Instruction in hexadecimal form.
-  char human_buffer[kUserReadableBufferSize];  // Human-readable instruction.
-  uword pc = start;
-  GrowableArray<const Function*> inlined_functions;
-  GrowableArray<TokenPosition> token_positions;
-  while (pc < end) {
-    int instruction_length;
-    Object* object;
-    DecodeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
-                      sizeof(human_buffer), &instruction_length, bytecode,
-                      &object, pc);
-    formatter->ConsumeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
-                                  sizeof(human_buffer), object,
-                                  FLAG_disassemble_relative ? pc - start : pc);
-    pc += instruction_length;
-  }
-#else
-  UNREACHABLE();
-#endif
-}
-
-void KernelBytecodeDisassembler::Disassemble(const Function& function) {
-#if !defined(PRODUCT)
-  ASSERT(function.HasBytecode());
-  const char* function_fullname = function.ToFullyQualifiedCString();
-  Zone* zone = Thread::Current()->zone();
-  const Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
-  THR_Print("Bytecode for function '%s' {\n", function_fullname);
-  const uword start = bytecode.PayloadStart();
-  const uword base = FLAG_disassemble_relative ? 0 : start;
-  DisassembleToStdout stdout_formatter;
-  LogBlock lb;
-  Disassemble(start, start + bytecode.Size(), &stdout_formatter, bytecode);
-  THR_Print("}\n");
-
-  const ObjectPool& object_pool =
-      ObjectPool::Handle(zone, bytecode.object_pool());
-  object_pool.DebugPrint();
-
-  THR_Print("PC Descriptors for function '%s' {\n", function_fullname);
-  PcDescriptors::PrintHeaderString();
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(zone, bytecode.pc_descriptors());
-  THR_Print("%s}\n", descriptors.ToCString());
-
-  if (bytecode.HasSourcePositions()) {
-    THR_Print("Source positions for function '%s' {\n", function_fullname);
-    // 4 bits per hex digit + 2 for "0x".
-    const int addr_width = (kBitsPerWord / 4) + 2;
-    // "*" in a printf format specifier tells it to read the field width from
-    // the printf argument list.
-    THR_Print("%-*s\tpos\tline\tcolumn\tyield\n", addr_width, "pc");
-    const Script& script = Script::Handle(zone, function.script());
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      TokenPosition pos = iter.TokenPos();
-      intptr_t line = -1, column = -1;
-      script.GetTokenLocation(pos, &line, &column);
-      THR_Print("%#-*" Px "\t%s\t%" Pd "\t%" Pd "\t%s\n", addr_width,
-                base + iter.PcOffset(), pos.ToCString(), line, column,
-                iter.IsYieldPoint() ? "yield" : "");
-    }
-    THR_Print("}\n");
-  }
-
-  if (FLAG_print_variable_descriptors && bytecode.HasLocalVariablesInfo()) {
-    THR_Print("Local variables info for function '%s' {\n", function_fullname);
-    kernel::BytecodeLocalVariablesIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      switch (iter.Kind()) {
-        case kernel::BytecodeLocalVariablesIterator::kScope: {
-          THR_Print("scope 0x%" Px "-0x%" Px " pos %s-%s\tlev %" Pd "\n",
-                    base + iter.StartPC(), base + iter.EndPC(),
-                    iter.StartTokenPos().ToCString(),
-                    iter.EndTokenPos().ToCString(), iter.ContextLevel());
-        } break;
-        case kernel::BytecodeLocalVariablesIterator::kVariableDeclaration: {
-          THR_Print("var   0x%" Px "-0x%" Px " pos %s-%s\tidx %" Pd
-                    "\tdecl %s\t%s %s %s\n",
-                    base + iter.StartPC(), base + iter.EndPC(),
-                    iter.StartTokenPos().ToCString(),
-                    iter.EndTokenPos().ToCString(), iter.Index(),
-                    iter.DeclarationTokenPos().ToCString(),
-                    String::Handle(
-                        zone, AbstractType::Handle(zone, iter.Type()).Name())
-                        .ToCString(),
-                    String::Handle(zone, iter.Name()).ToCString(),
-                    iter.IsCaptured() ? "captured" : "");
-        } break;
-        case kernel::BytecodeLocalVariablesIterator::kContextVariable: {
-          THR_Print("ctxt  0x%" Px "\tidx %" Pd "\n", base + iter.StartPC(),
-                    iter.Index());
-        } break;
-      }
-    }
-    THR_Print("}\n");
-
-    THR_Print("Local variable descriptors for function '%s' {\n",
-              function_fullname);
-    const auto& var_descriptors =
-        LocalVarDescriptors::Handle(zone, bytecode.GetLocalVarDescriptors());
-    THR_Print("%s}\n", var_descriptors.ToCString());
-  }
-
-  THR_Print("Exception Handlers for function '%s' {\n", function_fullname);
-  const ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(zone, bytecode.exception_handlers());
-  THR_Print("%s}\n", handlers.ToCString());
-
-#else
-  UNREACHABLE();
-#endif
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.h b/runtime/vm/compiler/assembler/disassembler_kbc.h
deleted file mode 100644
index 89bbc18..0000000
--- a/runtime/vm/compiler/assembler/disassembler_kbc.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
-#define RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/assembler/disassembler.h"
-
-namespace dart {
-
-// Disassemble instructions.
-class KernelBytecodeDisassembler : public AllStatic {
- public:
-  // Disassemble instructions between start and end.
-  // (The assumption is that start is at a valid instruction).
-  // Return true if all instructions were successfully decoded, false otherwise.
-  static void Disassemble(uword start,
-                          uword end,
-                          DisassemblyFormatter* formatter,
-                          const Bytecode& bytecode);
-
-  static void Disassemble(uword start,
-                          uword end,
-                          DisassemblyFormatter* formatter) {
-    Disassemble(start, end, formatter, Bytecode::Handle());
-  }
-
-  static void Disassemble(uword start, uword end, const Bytecode& bytecode) {
-#if !defined(PRODUCT)
-    DisassembleToStdout stdout_formatter;
-    LogBlock lb;
-    Disassemble(start, end, &stdout_formatter, bytecode);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  static void Disassemble(uword start, uword end) {
-#if !defined(PRODUCT)
-    DisassembleToStdout stdout_formatter;
-    LogBlock lb;
-    Disassemble(start, end, &stdout_formatter);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  static void Disassemble(uword start,
-                          uword end,
-                          char* buffer,
-                          uintptr_t buffer_size) {
-#if !defined(PRODUCT)
-    DisassembleToMemory memory_formatter(buffer, buffer_size);
-    LogBlock lb;
-    Disassemble(start, end, &memory_formatter);
-#else
-    UNREACHABLE();
-#endif
-  }
-
-  // Decodes one instruction.
-  // Writes a hexadecimal representation into the hex_buffer and a
-  // human-readable representation into the human_buffer.
-  // Writes the length of the decoded instruction in bytes in out_instr_len.
-  static void DecodeInstruction(char* hex_buffer,
-                                intptr_t hex_size,
-                                char* human_buffer,
-                                intptr_t human_size,
-                                int* out_instr_len,
-                                const Bytecode& bytecode,
-                                Object** object,
-                                uword pc);
-
-  static void Disassemble(const Function& function);
-
- private:
-  static const int kHexadecimalBufferSize = 32;
-  static const int kUserReadableBufferSize = 256;
-};
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-#endif  // RUNTIME_VM_COMPILER_ASSEMBLER_DISASSEMBLER_KBC_H_
diff --git a/runtime/vm/compiler/assembler/object_pool_builder.h b/runtime/vm/compiler/assembler/object_pool_builder.h
index de9749d..2bc2add 100644
--- a/runtime/vm/compiler/assembler/object_pool_builder.h
+++ b/runtime/vm/compiler/assembler/object_pool_builder.h
@@ -30,7 +30,6 @@
     kImmediate,
     kNativeFunction,
     kNativeFunctionWrapper,
-    kNativeEntryData,
   };
 
   using TypeBits = BitField<uint8_t, EntryType, 0, 7>;
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 50ea5ec..a288e47 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -162,10 +162,6 @@
   }
 
   intptr_t CurrentContextEnvIndex() const {
-    if (function().HasBytecode()) {
-      return -1;
-    }
-
     return EnvIndex(parsed_function().current_context_var());
   }
 
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 43937b0..fafae7a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -775,8 +775,7 @@
       // 'function' is queued for optimized compilation
       count = FLAG_optimization_counter_threshold;
     } else {
-      // 'function' is queued for unoptimized compilation
-      count = FLAG_compilation_counter_threshold;
+      count = 0;
     }
   } else if (Code::IsOptimized(function.CurrentCode())) {
     // 'function' was optimized and stopped counting
@@ -4834,10 +4833,8 @@
 
   UpdateReceiverSminess(zone);
 
-  if ((compiler->is_optimizing() || compiler->function().HasBytecode()) &&
-      HasICData()) {
-    ASSERT(HasICData());
-    if (compiler->is_optimizing() && (ic_data()->NumberOfUsedChecks() > 0)) {
+  if (compiler->is_optimizing() && HasICData()) {
+    if (ic_data()->NumberOfUsedChecks() > 0) {
       const ICData& unary_ic_data =
           ICData::ZoneHandle(zone, ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
diff --git a/runtime/vm/compiler/backend/il_test.cc b/runtime/vm/compiler/backend/il_test.cc
index a07557f..4788686 100644
--- a/runtime/vm/compiler/backend/il_test.cc
+++ b/runtime/vm/compiler/backend/il_test.cc
@@ -174,29 +174,14 @@
   // which enables us to remove more stores.
   std::vector<const char*> expected_stores_jit;
   std::vector<const char*> expected_stores_aot;
-  if (root_library.is_declared_in_bytecode()) {
-    // Bytecode flow graph builder doesn't provide readable
-    // variable names for captured variables. Also, bytecode may omit
-    // stores of context parent in certain cases.
-    expected_stores_jit.insert(
-        expected_stores_jit.end(),
-        {":context_var0", "Context.parent", ":context_var0",
-         "Closure.function_type_arguments", "Closure.function",
-         "Closure.context"});
-    expected_stores_aot.insert(
-        expected_stores_aot.end(),
-        {":context_var0", "Closure.function_type_arguments", "Closure.function",
-         "Closure.context"});
-  } else {
-    // These expectations are for AST-based flow graph builder.
-    expected_stores_jit.insert(expected_stores_jit.end(),
-                               {"value", "Context.parent", "Context.parent",
-                                "value", "Closure.function_type_arguments",
-                                "Closure.function", "Closure.context"});
-    expected_stores_aot.insert(expected_stores_aot.end(),
-                               {"value", "Closure.function_type_arguments",
-                                "Closure.function", "Closure.context"});
-  }
+
+  expected_stores_jit.insert(expected_stores_jit.end(),
+                             {"value", "Context.parent", "Context.parent",
+                              "value", "Closure.function_type_arguments",
+                              "Closure.function", "Closure.context"});
+  expected_stores_aot.insert(expected_stores_aot.end(),
+                             {"value", "Closure.function_type_arguments",
+                              "Closure.function", "Closure.context"});
 
   RunInitializingStoresTest(root_library, "f4", CompilerPass::kJIT,
                             expected_stores_jit);
diff --git a/runtime/vm/compiler/backend/il_test_helper.cc b/runtime/vm/compiler/backend/il_test_helper.cc
index f4d002b..1a514be 100644
--- a/runtime/vm/compiler/backend/il_test_helper.cc
+++ b/runtime/vm/compiler/backend/il_test_helper.cc
@@ -71,12 +71,6 @@
 }
 
 ObjectPtr Invoke(const Library& lib, const char* name) {
-  // These tests rely on running unoptimized code to collect type feedback. The
-  // interpreter does not collect type feedback for interface calls, so set
-  // compilation threshold to 0 in order to compile invoked function
-  // immediately and execute compiled code.
-  SetFlagScope<int> sfs(&FLAG_compilation_counter_threshold, 0);
-
   Thread* thread = Thread::Current();
   Dart_Handle api_lib = Api::NewHandle(thread, lib.raw());
   Dart_Handle result;
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index 081e794..9a53a7b 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -216,74 +216,42 @@
   ILMatcher cursor(flow_graph, entry, /*trace=*/true,
                    ParallelMovesHandling::kSkip);
 
-  if (function.is_declared_in_bytecode()) {
-    RELEASE_ASSERT(cursor.TryMatch({
-        kMoveGlob,
-        kMatchAndMoveCreateArray,
-        kWordSize == 8 ? kMatchAndMoveUnboxInt64 : kNop,
-        kMatchAndMoveGoto,
+  Instruction* unbox1 = nullptr;
+  Instruction* unbox2 = nullptr;
 
-        // Loop header
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveUnboxInt64,
-        kMatchAndMoveBranchTrue,
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMoveGlob,
+      kMatchAndMoveCreateArray,
+      kMatchAndMoveUnboxInt64,
+      {kMoveAny, &unbox1},
+      {kMoveAny, &unbox2},
+      kMatchAndMoveGoto,
 
-        // Loop body
-        kMatchAndMoveTargetEntry,
-        kMatchAndMoveGenericCheckBound,
-        kMatchAndMoveStoreIndexed,
-        kMatchAndMoveCheckedSmiOp,
-        kMatchAndMoveGoto,
+      // Loop header
+      kMatchAndMoveJoinEntry,
+      kMatchAndMoveCheckStackOverflow,
+      kMatchAndMoveBranchTrue,
 
-        // Loop header once again
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveUnboxInt64,
-        kMatchAndMoveBranchFalse,
+      // Loop body
+      kMatchAndMoveTargetEntry,
+      kWordSize == 4 ? kMatchAndMoveBoxInt64 : kNop,
+      kMatchAndMoveBoxInt64,
+      kMatchAndMoveStoreIndexed,
+      kMatchAndMoveBinaryInt64Op,
+      kMatchAndMoveGoto,
 
-        // After loop
-        kMatchAndMoveTargetEntry,
-        kMatchReturn,
-    }));
-  } else {
-    Instruction* unbox1 = nullptr;
-    Instruction* unbox2 = nullptr;
+      // Loop header once again
+      kMatchAndMoveJoinEntry,
+      kMatchAndMoveCheckStackOverflow,
+      kMatchAndMoveBranchFalse,
 
-    RELEASE_ASSERT(cursor.TryMatch({
-        kMoveGlob,
-        kMatchAndMoveCreateArray,
-        kMatchAndMoveUnboxInt64,
-        {kMoveAny, &unbox1},
-        {kMoveAny, &unbox2},
-        kMatchAndMoveGoto,
+      // After loop
+      kMatchAndMoveTargetEntry,
+      kMatchReturn,
+  }));
 
-        // Loop header
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveBranchTrue,
-
-        // Loop body
-        kMatchAndMoveTargetEntry,
-        kWordSize == 4 ? kMatchAndMoveBoxInt64 : kNop,
-        kMatchAndMoveBoxInt64,
-        kMatchAndMoveStoreIndexed,
-        kMatchAndMoveBinaryInt64Op,
-        kMatchAndMoveGoto,
-
-        // Loop header once again
-        kMatchAndMoveJoinEntry,
-        kMatchAndMoveCheckStackOverflow,
-        kMatchAndMoveBranchFalse,
-
-        // After loop
-        kMatchAndMoveTargetEntry,
-        kMatchReturn,
-    }));
-
-    EXPECT(unbox1->IsUnboxedConstant() || unbox1->IsUnboxInt64());
-    EXPECT(unbox2->IsUnboxedConstant() || unbox2->IsUnboxInt64());
-  }
+  EXPECT(unbox1->IsUnboxedConstant() || unbox1->IsUnboxInt64());
+  EXPECT(unbox2->IsUnboxedConstant() || unbox2->IsUnboxInt64());
 }
 
 #endif  // defined(DART_PRECOMPILER)
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index c1d2dd6..bc3b72f 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -13,7 +13,6 @@
 #include "vm/compiler/backend/loops.h"
 #include "vm/compiler/backend/type_propagator.h"
 #include "vm/compiler/compiler_pass.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/jit_call_specializer.h"
 #include "vm/flags.h"
@@ -60,35 +59,6 @@
   }
 }
 
-#if !defined(PRODUCT)
-void PopulateEnvironmentFromBytecodeLocalVariables(
-    const Function& function,
-    FlowGraph* graph,
-    GrowableArray<LocalVariable*>* env) {
-  const auto& bytecode = Bytecode::Handle(function.bytecode());
-  ASSERT(!bytecode.IsNull());
-
-  kernel::BytecodeLocalVariablesIterator iter(Thread::Current()->zone(),
-                                              bytecode);
-  while (iter.MoveNext()) {
-    if (iter.IsVariableDeclaration() && !iter.IsCaptured()) {
-      LocalVariable* const var = new LocalVariable(
-          TokenPosition::kNoSource, TokenPosition::kNoSource,
-          String::ZoneHandle(graph->zone(), iter.Name()),
-          AbstractType::ZoneHandle(graph->zone(), iter.Type()));
-      if (iter.Index() < 0) {  // Parameter.
-        var->set_index(VariableIndex(-iter.Index() - kKBCParamEndSlotFromFp));
-      } else {
-        var->set_index(VariableIndex(-iter.Index()));
-      }
-      const intptr_t env_index = graph->EnvIndex(var);
-      env->EnsureLength(env_index + 1, nullptr);
-      (*env)[env_index] = var;
-    }
-  }
-}
-#endif
-
 // Run TryCatchAnalyzer optimization on the function foo from the given script
 // and check that the only variables from the given list are synchronized
 // on catch entry.
@@ -118,17 +88,7 @@
   auto scope = graph->parsed_function().scope();
 
   GrowableArray<LocalVariable*> env;
-  if (function.is_declared_in_bytecode()) {
-#if defined(PRODUCT)
-    // In product mode information about local variables is not retained in
-    // bytecode, so we can't find variables by names.
-    return;
-#else
-    PopulateEnvironmentFromBytecodeLocalVariables(function, graph, &env);
-#endif
-  } else {
-    FlattenScopeIntoEnvironment(graph, scope, &env);
-  }
+  FlattenScopeIntoEnvironment(graph, scope, &env);
 
   for (intptr_t i = 0; i < env.length(); i++) {
     bool found = false;
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 0efb336..dd1d2fa 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -111,14 +111,6 @@
   "ffi/recognized_method.h",
   "frontend/base_flow_graph_builder.cc",
   "frontend/base_flow_graph_builder.h",
-  "frontend/bytecode_fingerprints.cc",
-  "frontend/bytecode_fingerprints.h",
-  "frontend/bytecode_flow_graph_builder.cc",
-  "frontend/bytecode_flow_graph_builder.h",
-  "frontend/bytecode_reader.cc",
-  "frontend/bytecode_reader.h",
-  "frontend/bytecode_scope_builder.cc",
-  "frontend/bytecode_scope_builder.h",
   "frontend/constant_reader.cc",
   "frontend/constant_reader.h",
   "frontend/flow_graph_builder.cc",
@@ -210,7 +202,5 @@
   "assembler/disassembler.h",
   "assembler/disassembler_arm.cc",
   "assembler/disassembler_arm64.cc",
-  "assembler/disassembler_kbc.cc",
-  "assembler/disassembler_kbc.h",
   "assembler/disassembler_x86.cc",
 ]
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index c394822..913e36b 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -69,15 +69,6 @@
 
   // Create a dummy list of local variables representing a context object
   // with the given number of captured variables and given ID.
-  //
-  // Used during bytecode to IL translation because AllocateContext and
-  // CloneContext IL instructions need a list of local varaibles and bytecode
-  // does not record this information.
-  //
-  // TODO(vegorov): create context classes for distinct context IDs and
-  // populate them with slots without creating variables.
-  // Beware that context_id is satured at 8-bits, so multiple contexts may
-  // share id 255.
   const ZoneGrowableArray<const Slot*>& GetDummyContextSlots(
       intptr_t context_id,
       intptr_t num_context_slots);
@@ -85,16 +76,8 @@
   // Create a dummy LocalVariable that represents a captured local variable
   // at the given index in the context with given ID.
   //
-  // Used during bytecode to IL translation because StoreInstanceField and
-  // LoadField IL instructions need Slot, which can only be created from a
-  // LocalVariable.
-  //
   // This function returns the same variable when it is called with the
   // same index.
-  //
-  // TODO(vegorov): disambiguate slots for different context IDs.
-  // Beware that context_id is saturated at 8-bits, so multiple contexts may
-  // share id 255.
   LocalVariable* GetDummyCapturedVariable(intptr_t context_id, intptr_t index);
 
   bool is_aot() const { return is_aot_; }
@@ -115,8 +98,7 @@
   // Cache for Slot objects created during compilation (see slot.h).
   SlotCache* slot_cache_ = nullptr;
 
-  // Caches for dummy LocalVariables and context Slots created during bytecode
-  // to IL translation.
+  // Caches for dummy LocalVariables and context Slots.
   ZoneGrowableArray<ZoneGrowableArray<const Slot*>*>* dummy_slots_ = nullptr;
   ZoneGrowableArray<LocalVariable*>* dummy_captured_vars_ = nullptr;
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 673375a..790ac1a 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -465,7 +465,6 @@
   const Array& saved_args_desc_array_;
 
   friend class StreamingFlowGraphBuilder;
-  friend class BytecodeFlowGraphBuilder;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseFlowGraphBuilder);
diff --git a/runtime/vm/compiler/frontend/bytecode_fingerprints.cc b/runtime/vm/compiler/frontend/bytecode_fingerprints.cc
deleted file mode 100644
index 78d621e..0000000
--- a/runtime/vm/compiler/frontend/bytecode_fingerprints.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2019, 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.
-
-#include "vm/compiler/frontend/bytecode_fingerprints.h"
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/constants_kbc.h"
-#include "vm/hash.h"
-
-namespace dart {
-namespace kernel {
-
-static uint32_t CombineObject(uint32_t hash, const Object& obj) {
-  if (obj.IsAbstractType()) {
-    return CombineHashes(hash, AbstractType::Cast(obj).Hash());
-  } else if (obj.IsClass()) {
-    return CombineHashes(hash, Class::Cast(obj).id());
-  } else if (obj.IsFunction()) {
-    return CombineHashes(
-        hash, AbstractType::Handle(Function::Cast(obj).result_type()).Hash());
-  } else if (obj.IsField()) {
-    return CombineHashes(hash,
-                         AbstractType::Handle(Field::Cast(obj).type()).Hash());
-  } else {
-    return CombineHashes(hash, static_cast<uint32_t>(obj.GetClassId()));
-  }
-}
-
-typedef uint32_t (*Fp)(uint32_t fp,
-                       const KBCInstr* instr,
-                       const ObjectPool& pool,
-                       int32_t value);
-
-static uint32_t Fp___(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return fp;
-}
-
-static uint32_t Fptgt(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fplit(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineObject(fp, Object::Handle(pool.ObjectAt(value)));
-}
-
-static uint32_t Fpreg(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fpxeg(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fpnum(uint32_t fp,
-                      const KBCInstr* instr,
-                      const ObjectPool& pool,
-                      int32_t value) {
-  return CombineHashes(fp, value);
-}
-
-static uint32_t Fingerprint0(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  return fp;
-}
-
-static uint32_t FingerprintA(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  return fp;
-}
-
-static uint32_t FingerprintD(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeD(instr));
-  return fp;
-}
-
-static uint32_t FingerprintX(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeX(instr));
-  return fp;
-}
-
-static uint32_t FingerprintT(uint32_t fp,
-                             const KBCInstr* instr,
-                             const ObjectPool& pool,
-                             Fp op1,
-                             Fp op2,
-                             Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeT(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_E(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeE(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_Y(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeY(instr));
-  return fp;
-}
-
-static uint32_t FingerprintD_F(uint32_t fp,
-                               const KBCInstr* instr,
-                               const ObjectPool& pool,
-                               Fp op1,
-                               Fp op2,
-                               Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeD(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeF(instr));
-  return fp;
-}
-
-static uint32_t FingerprintA_B_C(uint32_t fp,
-                                 const KBCInstr* instr,
-                                 const ObjectPool& pool,
-                                 Fp op1,
-                                 Fp op2,
-                                 Fp op3) {
-  fp = op1(fp, instr, pool, KernelBytecode::DecodeA(instr));
-  fp = op2(fp, instr, pool, KernelBytecode::DecodeB(instr));
-  fp = op3(fp, instr, pool, KernelBytecode::DecodeC(instr));
-  return fp;
-}
-
-uint32_t BytecodeFingerprintHelper::CalculateFunctionFingerprint(
-    const Function& function) {
-  ASSERT(function.is_declared_in_bytecode());
-  const intptr_t kHashBits = 30;
-  uint32_t fp = 0;
-  fp = CombineHashes(fp, String::Handle(function.UserVisibleName()).Hash());
-  if (function.is_abstract()) {
-    return FinalizeHash(fp, kHashBits);
-  }
-  if (!function.HasBytecode()) {
-    kernel::BytecodeReader::ReadFunctionBytecode(Thread::Current(), function);
-  }
-  const Bytecode& code = Bytecode::Handle(function.bytecode());
-  const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-  const KBCInstr* const start =
-      reinterpret_cast<const KBCInstr*>(code.instructions());
-  for (const KBCInstr* instr = start; (instr - start) < code.Size();
-       instr = KernelBytecode::Next(instr)) {
-    const KernelBytecode::Opcode opcode = KernelBytecode::DecodeOpcode(instr);
-    fp = CombineHashes(fp, opcode);
-    switch (opcode) {
-#define FINGERPRINT_BYTECODE(name, encoding, kind, op1, op2, op3)              \
-  case KernelBytecode::k##name:                                                \
-    fp = Fingerprint##encoding(fp, instr, pool, Fp##op1, Fp##op2, Fp##op3);    \
-    break;
-      KERNEL_BYTECODES_LIST(FINGERPRINT_BYTECODE)
-#undef FINGERPRINT_BYTECODE
-      default:
-        UNREACHABLE();
-    }
-  }
-
-  return FinalizeHash(fp, kHashBits);
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_fingerprints.h b/runtime/vm/compiler/frontend/bytecode_fingerprints.h
deleted file mode 100644
index 78dbcff..0000000
--- a/runtime/vm/compiler/frontend/bytecode_fingerprints.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2019, 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "platform/allocation.h"
-#include "vm/object.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeFingerprintHelper : public AllStatic {
- public:
-  static uint32_t CalculateFunctionFingerprint(const Function& func);
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FINGERPRINTS_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
deleted file mode 100644
index 41af858..0000000
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ /dev/null
@@ -1,2375 +0,0 @@
-// 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.
-
-#include "vm/compiler/frontend/bytecode_flow_graph_builder.h"
-
-#include "vm/compiler/backend/il_printer.h"
-#include "vm/compiler/ffi/callback.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/frontend/prologue_builder.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/object_store.h"
-#include "vm/stack_frame.h"
-#include "vm/stack_frame_kbc.h"
-
-#define B (flow_graph_builder_)
-#define Z (zone_)
-
-namespace dart {
-
-DEFINE_FLAG(bool,
-            print_flow_graph_from_bytecode,
-            false,
-            "Print flow graph constructed from bytecode");
-
-namespace kernel {
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandA() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeA(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandB() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeB(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandC() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeC(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandD() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeD(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandE() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeE(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandF() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeF(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandX() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeX(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandY() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeY(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Operand BytecodeFlowGraphBuilder::DecodeOperandT() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    intptr_t value = KernelBytecode::DecodeT(bytecode_instr_);
-    return Operand(value);
-  }
-}
-
-BytecodeFlowGraphBuilder::Constant BytecodeFlowGraphBuilder::ConstantAt(
-    Operand entry_index,
-    intptr_t add_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    const Object& value = Object::ZoneHandle(
-        Z, object_pool_.ObjectAt(entry_index.value() + add_index));
-    return Constant(Z, value);
-  }
-}
-
-void BytecodeFlowGraphBuilder::PushConstant(Constant constant) {
-  if (is_generating_interpreter()) {
-    B->Push(constant.definition());
-  } else {
-    code_ += B->Constant(constant.value());
-  }
-}
-
-BytecodeFlowGraphBuilder::Constant BytecodeFlowGraphBuilder::PopConstant() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    ASSERT(!IsStackEmpty());
-    const Object& value = B->stack_->definition()->AsConstant()->value();
-    code_ += B->Drop();
-    return Constant(Z, value);
-  }
-}
-
-void BytecodeFlowGraphBuilder::LoadStackSlots(intptr_t num_slots) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(GetStackDepth() >= num_slots);
-}
-
-void BytecodeFlowGraphBuilder::AllocateLocalVariables(
-    Operand frame_size,
-    intptr_t num_param_locals) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    ASSERT(local_vars_.is_empty());
-
-    const intptr_t num_bytecode_locals = frame_size.value();
-    ASSERT(num_bytecode_locals >= 0);
-
-    intptr_t num_locals = num_bytecode_locals;
-    if (exception_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (stacktrace_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (scratch_var_ != nullptr) {
-      ++num_locals;
-    }
-    if (parsed_function()->has_arg_desc_var()) {
-      ++num_locals;
-    }
-    if (parsed_function()->has_entry_points_temp_var()) {
-      ++num_locals;
-    }
-
-    if (num_locals == 0) {
-      return;
-    }
-
-    local_vars_.EnsureLength(num_bytecode_locals, nullptr);
-    intptr_t idx = num_param_locals;
-    for (; idx < num_bytecode_locals; ++idx) {
-      String& name = String::ZoneHandle(
-          Z, Symbols::NewFormatted(thread(), "var%" Pd, idx));
-      LocalVariable* local = new (Z)
-          LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                        name, Object::dynamic_type());
-      local->set_index(VariableIndex(-idx));
-      local_vars_[idx] = local;
-    }
-
-    if (exception_var_ != nullptr) {
-      exception_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (stacktrace_var_ != nullptr) {
-      stacktrace_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (scratch_var_ != nullptr) {
-      scratch_var_->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (parsed_function()->has_arg_desc_var()) {
-      parsed_function()->arg_desc_var()->set_index(VariableIndex(-idx));
-      ++idx;
-    }
-    if (parsed_function()->has_entry_points_temp_var()) {
-      parsed_function()->entry_points_temp_var()->set_index(
-          VariableIndex(-idx));
-      ++idx;
-    }
-    ASSERT(idx == num_locals);
-
-    ASSERT(parsed_function()->scope() == nullptr);
-    parsed_function()->AllocateBytecodeVariables(num_locals);
-  }
-}
-
-LocalVariable* BytecodeFlowGraphBuilder::AllocateParameter(
-    intptr_t param_index,
-    VariableIndex var_index) {
-  const String& name =
-      String::ZoneHandle(Z, function().ParameterNameAt(param_index));
-  const AbstractType& type =
-      AbstractType::ZoneHandle(Z, function().ParameterTypeAt(param_index));
-
-  CompileType* param_type = nullptr;
-  if (!inferred_types_attribute_.IsNull()) {
-    // Parameter types are assigned to synthetic PCs = -N,..,-1
-    // where N is number of parameters.
-    const intptr_t pc = -function().NumParameters() + param_index;
-    // Search from the beginning as parameters may be declared in arbitrary
-    // order.
-    inferred_types_index_ = 0;
-    const InferredTypeMetadata inferred_type = GetInferredType(pc);
-    if (!inferred_type.IsTrivial()) {
-      param_type = new (Z) CompileType(inferred_type.ToCompileType(Z));
-    }
-  }
-
-  LocalVariable* param_var =
-      new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            name, type, param_type);
-  param_var->set_index(var_index);
-
-  if (!function().IsNonImplicitClosureFunction() &&
-      (function().is_static() ||
-       ((function().name() != Symbols::Call().raw()) &&
-        !parsed_function()->IsCovariantParameter(param_index) &&
-        !parsed_function()->IsGenericCovariantImplParameter(param_index)))) {
-    param_var->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
-  }
-
-  if (var_index.value() <= 0) {
-    local_vars_[-var_index.value()] = param_var;
-  }
-
-  return param_var;
-}
-
-void BytecodeFlowGraphBuilder::AllocateFixedParameters() {
-  if (is_generating_interpreter()) {
-    return;
-  }
-
-  ASSERT(!function().HasOptionalParameters());
-
-  const intptr_t num_fixed_params = function().num_fixed_parameters();
-  auto parameters =
-      new (Z) ZoneGrowableArray<LocalVariable*>(Z, num_fixed_params);
-
-  for (intptr_t i = 0; i < num_fixed_params; ++i) {
-    LocalVariable* param_var =
-        AllocateParameter(i, VariableIndex(num_fixed_params - i));
-    parameters->Add(param_var);
-  }
-
-  parsed_function()->SetRawParameters(parameters);
-}
-
-const KBCInstr*
-BytecodeFlowGraphBuilder::AllocateParametersAndLocalsForEntryOptional() {
-  ASSERT(KernelBytecode::IsEntryOptionalOpcode(bytecode_instr_));
-
-  const intptr_t num_fixed_params = DecodeOperandA().value();
-  const intptr_t num_opt_pos_params = DecodeOperandB().value();
-  const intptr_t num_opt_named_params = DecodeOperandC().value();
-
-  ASSERT(num_fixed_params == function().num_fixed_parameters());
-  ASSERT(num_opt_pos_params == function().NumOptionalPositionalParameters());
-  ASSERT(num_opt_named_params == function().NumOptionalNamedParameters());
-
-  ASSERT((num_opt_pos_params == 0) || (num_opt_named_params == 0));
-  const intptr_t num_load_const = num_opt_pos_params + 2 * num_opt_named_params;
-
-  const KBCInstr* instr = KernelBytecode::Next(bytecode_instr_);
-  const KBCInstr* frame_instr = instr;
-  for (intptr_t i = 0; i < num_load_const; ++i) {
-    frame_instr = KernelBytecode::Next(frame_instr);
-  }
-  ASSERT(KernelBytecode::IsFrameOpcode(frame_instr));
-  const intptr_t num_extra_locals = KernelBytecode::DecodeD(frame_instr);
-  const intptr_t num_params =
-      num_fixed_params + num_opt_pos_params + num_opt_named_params;
-  const intptr_t total_locals = num_params + num_extra_locals;
-
-  AllocateLocalVariables(Operand(total_locals), num_params);
-
-  ZoneGrowableArray<const Instance*>* default_values =
-      new (Z) ZoneGrowableArray<const Instance*>(
-          Z, num_opt_pos_params + num_opt_named_params);
-  ZoneGrowableArray<LocalVariable*>* raw_parameters =
-      new (Z) ZoneGrowableArray<LocalVariable*>(Z, num_params);
-
-  intptr_t param = 0;
-  for (; param < num_fixed_params; ++param) {
-    LocalVariable* param_var = AllocateParameter(param, VariableIndex(-param));
-    raw_parameters->Add(param_var);
-  }
-
-  for (intptr_t i = 0; i < num_opt_pos_params; ++i, ++param) {
-    const KBCInstr* load_value_instr = instr;
-    instr = KernelBytecode::Next(instr);
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-    ASSERT(KernelBytecode::DecodeA(load_value_instr) == param);
-    const Object& default_value =
-        ConstantAt(Operand(KernelBytecode::DecodeE(load_value_instr))).value();
-
-    LocalVariable* param_var = AllocateParameter(param, VariableIndex(-param));
-    raw_parameters->Add(param_var);
-    default_values->Add(
-        &Instance::ZoneHandle(Z, Instance::RawCast(default_value.raw())));
-  }
-
-  if (num_opt_named_params > 0) {
-    default_values->EnsureLength(num_opt_named_params, nullptr);
-    raw_parameters->EnsureLength(num_params, nullptr);
-
-    ASSERT(scratch_var_ != nullptr);
-
-    for (intptr_t i = 0; i < num_opt_named_params; ++i, ++param) {
-      const KBCInstr* load_name_instr = instr;
-      const KBCInstr* load_value_instr = KernelBytecode::Next(load_name_instr);
-      instr = KernelBytecode::Next(load_value_instr);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name_instr));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-      const String& param_name = String::Cast(
-          ConstantAt(Operand(KernelBytecode::DecodeE(load_name_instr)))
-              .value());
-      ASSERT(param_name.IsSymbol());
-      const Object& default_value =
-          ConstantAt(Operand(KernelBytecode::DecodeE(load_value_instr)))
-              .value();
-
-      intptr_t param_index = num_fixed_params;
-      for (; param_index < num_params; ++param_index) {
-        if (function().ParameterNameAt(param_index) == param_name.raw()) {
-          break;
-        }
-      }
-      ASSERT(param_index < num_params);
-
-      ASSERT(default_values->At(param_index - num_fixed_params) == nullptr);
-      (*default_values)[param_index - num_fixed_params] =
-          &Instance::ZoneHandle(Z, Instance::RawCast(default_value.raw()));
-
-      const intptr_t local_index = KernelBytecode::DecodeA(load_name_instr);
-      ASSERT(local_index == KernelBytecode::DecodeA(load_value_instr));
-
-      LocalVariable* param_var =
-          AllocateParameter(param_index, VariableIndex(-param));
-      ASSERT(raw_parameters->At(param_index) == nullptr);
-      (*raw_parameters)[param_index] = param_var;
-    }
-  }
-
-  ASSERT(instr == frame_instr);
-
-  parsed_function()->set_default_parameter_values(default_values);
-  parsed_function()->SetRawParameters(raw_parameters);
-
-  return KernelBytecode::Next(frame_instr);
-}
-
-LocalVariable* BytecodeFlowGraphBuilder::LocalVariableAt(intptr_t local_index) {
-  ASSERT(!is_generating_interpreter());
-  if (local_index < 0) {
-    // Parameter
-    ASSERT(!function().HasOptionalParameters());
-    const intptr_t param_index = local_index +
-                                 function().num_fixed_parameters() +
-                                 kKBCParamEndSlotFromFp;
-    ASSERT((0 <= param_index) &&
-           (param_index < function().num_fixed_parameters()));
-    return parsed_function()->RawParameterVariable(param_index);
-  } else {
-    return local_vars_.At(local_index);
-  }
-}
-
-void BytecodeFlowGraphBuilder::StoreLocal(Operand local_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    LocalVariable* local_var = LocalVariableAt(local_index.value());
-    code_ += B->StoreLocalRaw(position_, local_var);
-  }
-}
-
-void BytecodeFlowGraphBuilder::LoadLocal(Operand local_index) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  } else {
-    LocalVariable* local_var = LocalVariableAt(local_index.value());
-    code_ += B->LoadLocal(local_var);
-  }
-}
-
-Value* BytecodeFlowGraphBuilder::Pop() {
-  LoadStackSlots(1);
-  return B->Pop();
-}
-
-intptr_t BytecodeFlowGraphBuilder::GetStackDepth() const {
-  ASSERT(!is_generating_interpreter());
-  return B->GetStackDepth();
-}
-
-bool BytecodeFlowGraphBuilder::IsStackEmpty() const {
-  ASSERT(!is_generating_interpreter());
-  return B->GetStackDepth() == 0;
-}
-
-InferredTypeMetadata BytecodeFlowGraphBuilder::GetInferredType(intptr_t pc) {
-  ASSERT(!inferred_types_attribute_.IsNull());
-  intptr_t i = inferred_types_index_;
-  const intptr_t len = inferred_types_attribute_.Length();
-  for (; i < len; i += InferredTypeBytecodeAttribute::kNumElements) {
-    ASSERT(i + InferredTypeBytecodeAttribute::kNumElements <= len);
-    const intptr_t attr_pc =
-        InferredTypeBytecodeAttribute::GetPCAt(inferred_types_attribute_, i);
-    if (attr_pc == pc) {
-      const InferredTypeMetadata result =
-          InferredTypeBytecodeAttribute::GetInferredTypeAt(
-              Z, inferred_types_attribute_, i);
-      // Found. Next time, continue search at the next entry.
-      inferred_types_index_ = i + InferredTypeBytecodeAttribute::kNumElements;
-      return result;
-    }
-    if (attr_pc > pc) {
-      break;
-    }
-  }
-  // Not found. Next time, continue search at the last inspected entry.
-  inferred_types_index_ = i;
-  return InferredTypeMetadata(kDynamicCid, InferredTypeMetadata::kFlagNullable);
-}
-
-void BytecodeFlowGraphBuilder::PropagateStackState(intptr_t target_pc) {
-  if (is_generating_interpreter() || IsStackEmpty()) {
-    return;
-  }
-
-  Value* current_stack = B->stack_;
-  Value* target_stack = stack_states_.Lookup(target_pc);
-
-  if (target_stack != nullptr) {
-    // Control flow join should observe the same stack state from
-    // all incoming branches.
-    RELEASE_ASSERT(target_stack == current_stack);
-  } else {
-    // Stack state propagation is supported for forward branches only.
-    RELEASE_ASSERT(target_pc > pc_);
-    stack_states_.Insert(target_pc, current_stack);
-  }
-}
-
-// Drop values from the stack unless they are used in control flow joins
-// which are not generated yet (dartbug.com/36374).
-void BytecodeFlowGraphBuilder::DropUnusedValuesFromStack() {
-  intptr_t drop_depth = GetStackDepth();
-  auto it = stack_states_.GetIterator();
-  for (const auto* current = it.Next(); current != nullptr;
-       current = it.Next()) {
-    if (current->key > pc_) {
-      Value* used_value = current->value;
-      Value* value = B->stack_;
-      // Find if a value on the expression stack is used in a propagated
-      // stack state, and adjust [drop_depth] to preserve it.
-      for (intptr_t i = 0; i < drop_depth; ++i) {
-        if (value == used_value) {
-          drop_depth = i;
-          break;
-        }
-        value = value->next_use();
-      }
-    }
-  }
-  for (intptr_t i = 0; i < drop_depth; ++i) {
-    B->Pop();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildInstruction(KernelBytecode::Opcode opcode) {
-  switch (opcode) {
-#define WIDE_CASE(name) case KernelBytecode::k##name##_Wide:
-#define WIDE_CASE_0(name)
-#define WIDE_CASE_A(name)
-#define WIDE_CASE_D(name) WIDE_CASE(name)
-#define WIDE_CASE_X(name) WIDE_CASE(name)
-#define WIDE_CASE_T(name) WIDE_CASE(name)
-#define WIDE_CASE_A_E(name) WIDE_CASE(name)
-#define WIDE_CASE_A_Y(name) WIDE_CASE(name)
-#define WIDE_CASE_D_F(name) WIDE_CASE(name)
-#define WIDE_CASE_A_B_C(name)
-
-#define BUILD_BYTECODE_CASE(name, encoding, kind, op1, op2, op3)               \
-  BUILD_BYTECODE_CASE_##kind(name, encoding)
-
-#define BUILD_BYTECODE_CASE_WIDE(name, encoding)
-#define BUILD_BYTECODE_CASE_RESV(name, encoding)
-#define BUILD_BYTECODE_CASE_ORDN(name, encoding)                               \
-  case KernelBytecode::k##name:                                                \
-    WIDE_CASE_##encoding(name) Build##name();                                  \
-    break;
-
-    PUBLIC_KERNEL_BYTECODES_LIST(BUILD_BYTECODE_CASE)
-
-#undef WIDE_CASE
-#undef WIDE_CASE_0
-#undef WIDE_CASE_A
-#undef WIDE_CASE_D
-#undef WIDE_CASE_X
-#undef WIDE_CASE_T
-#undef WIDE_CASE_A_E
-#undef WIDE_CASE_A_Y
-#undef WIDE_CASE_D_F
-#undef WIDE_CASE_A_B_C
-#undef BUILD_BYTECODE_CASE
-#undef BUILD_BYTECODE_CASE_WIDE
-#undef BUILD_BYTECODE_CASE_RESV
-#undef BUILD_BYTECODE_CASE_ORDN
-
-    default:
-      FATAL1("Unsupported bytecode instruction %s\n",
-             KernelBytecode::NameOf(opcode));
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildEntry() {
-  AllocateLocalVariables(DecodeOperandD());
-  AllocateFixedParameters();
-}
-
-void BytecodeFlowGraphBuilder::BuildEntryFixed() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t num_fixed_params = DecodeOperandA().value();
-  ASSERT(num_fixed_params == function().num_fixed_parameters());
-
-  AllocateLocalVariables(DecodeOperandE());
-  AllocateFixedParameters();
-
-  Fragment check_args;
-
-  ASSERT(throw_no_such_method_ == nullptr);
-  throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-
-  check_args += B->LoadArgDescriptor();
-  check_args +=
-      B->LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
-  check_args += B->IntConstant(num_fixed_params);
-  TargetEntryInstr *success1, *fail1;
-  check_args += B->BranchIfEqual(&success1, &fail1);
-  check_args = Fragment(check_args.entry, success1);
-
-  check_args += B->LoadArgDescriptor();
-  check_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
-  check_args += B->IntConstant(num_fixed_params);
-  TargetEntryInstr *success2, *fail2;
-  check_args += B->BranchIfEqual(&success2, &fail2);
-  check_args = Fragment(check_args.entry, success2);
-
-  Fragment(fail1) + B->Goto(throw_no_such_method_);
-  Fragment(fail2) + B->Goto(throw_no_such_method_);
-
-  ASSERT(IsStackEmpty());
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += check_args;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildEntryOptional() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const KBCInstr* next_instr = AllocateParametersAndLocalsForEntryOptional();
-
-  LocalVariable* temp_var = nullptr;
-  if (function().HasOptionalNamedParameters()) {
-    ASSERT(scratch_var_ != nullptr);
-    temp_var = scratch_var_;
-  }
-
-  Fragment copy_args_prologue;
-
-  // Code generated for EntryOptional is considered a prologue code.
-  // Prologue should span a range of block ids, so start a new block at the
-  // beginning and end a block at the end.
-  JoinEntryInstr* prologue_entry = B->BuildJoinEntry();
-  copy_args_prologue += B->Goto(prologue_entry);
-  copy_args_prologue = Fragment(copy_args_prologue.entry, prologue_entry);
-
-  ASSERT(throw_no_such_method_ == nullptr);
-  if (function().CanReceiveDynamicInvocation()) {
-    // We only pass a non-nullptr NSM block if argument shape checks are needed.
-    throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-  }
-
-  PrologueBuilder prologue_builder(parsed_function(), B->last_used_block_id_,
-                                   B->IsCompiledForOsr(), B->IsInlining());
-
-  copy_args_prologue += prologue_builder.BuildOptionalParameterHandling(
-      throw_no_such_method_, temp_var);
-
-  B->last_used_block_id_ = prologue_builder.last_used_block_id();
-
-  JoinEntryInstr* prologue_exit = B->BuildJoinEntry();
-  copy_args_prologue += B->Goto(prologue_exit);
-  copy_args_prologue.current = prologue_exit;
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += copy_args_prologue;
-  }
-
-  prologue_info_ =
-      PrologueInfo(prologue_entry->block_id(), prologue_exit->block_id() - 1);
-
-  // Skip LoadConstant and Frame instructions.
-  next_pc_ = pc_ + (next_instr - bytecode_instr_);
-
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadConstant() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // Handled in EntryOptional instruction.
-  UNREACHABLE();
-}
-
-void BytecodeFlowGraphBuilder::BuildFrame() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // Handled in EntryOptional instruction.
-  UNREACHABLE();
-}
-
-void BytecodeFlowGraphBuilder::BuildCheckFunctionTypeArgs() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t expected_num_type_args = DecodeOperandA().value();
-  LocalVariable* type_args_var = LocalVariableAt(DecodeOperandE().value());
-
-  const bool check_lengths = function().CanReceiveDynamicInvocation();
-
-  if (check_lengths && throw_no_such_method_ == nullptr) {
-    throw_no_such_method_ = B->BuildThrowNoSuchMethod();
-  }
-
-  Fragment setup_type_args;
-
-  // Type args are always optional, so length can always be zero.
-  // If expect_type_args and lengths are being checked, a non-zero length must
-  // match the declaration length.
-  if (expected_num_type_args != 0) {
-    JoinEntryInstr* done = B->BuildJoinEntry();
-
-    TargetEntryInstr *then, *otherwise;
-    setup_type_args += B->LoadArgDescriptor();
-    setup_type_args +=
-        B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-    LocalVariable* len = B->MakeTemporary();
-    setup_type_args += B->LoadLocal(len);
-    setup_type_args += B->IntConstant(0);
-    setup_type_args += B->BranchIfEqual(&then, &otherwise);
-
-    JoinEntryInstr* join2 = B->BuildJoinEntry();
-
-    Fragment store_type_args(otherwise);
-    if (check_lengths) {
-      Fragment check_length;
-      check_length += B->LoadLocal(len);
-      check_length += B->IntConstant(expected_num_type_args);
-      TargetEntryInstr *then2, *fail;
-      check_length += B->BranchIfEqual(&then2, &fail);
-      check_length.current = then2;  // Continue in the non-error case.
-
-      Fragment(fail) + B->Goto(throw_no_such_method_);
-
-      store_type_args += check_length;
-    }
-
-    store_type_args += B->LoadArgDescriptor();
-    store_type_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
-    store_type_args += B->LoadFpRelativeSlot(
-        compiler::target::kWordSize *
-            (1 + compiler::target::frame_layout.param_end_from_fp),
-        CompileType::CreateNullable(/*is_nullable=*/true, kTypeArgumentsCid));
-    store_type_args +=
-        B->StoreLocalRaw(TokenPosition::kNoSource, type_args_var);
-    store_type_args += B->Drop();
-    store_type_args += B->Goto(join2);
-
-    Fragment null_type_args(then);
-    null_type_args += B->NullConstant();
-    null_type_args += B->StoreLocalRaw(TokenPosition::kNoSource, type_args_var);
-    null_type_args += B->Drop();
-    null_type_args += B->Goto(join2);
-
-    Fragment(join2) + B->Drop() + B->Goto(done);
-
-    setup_type_args.current = done;
-  } else if (check_lengths) {
-    TargetEntryInstr *then, *fail;
-    setup_type_args += B->LoadArgDescriptor();
-    setup_type_args +=
-        B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-    setup_type_args += B->IntConstant(0);
-    setup_type_args += B->BranchIfEqual(&then, &fail);
-    setup_type_args.current = then;  // Continue in the non-error case.
-
-    Fragment(fail) + B->Goto(throw_no_such_method_);
-  }
-
-  ASSERT(IsStackEmpty());
-
-  if (expected_num_type_args != 0) {
-    parsed_function()->set_function_type_arguments(type_args_var);
-    parsed_function()->SetRawTypeArgumentsVariable(type_args_var);
-  }
-
-  if (!B->IsInlining() && !B->IsCompiledForOsr()) {
-    code_ += setup_type_args;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildCheckStack() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  const intptr_t loop_depth = DecodeOperandA().value();
-  if (loop_depth == 0) {
-    ASSERT(IsStackEmpty());
-    code_ += B->CheckStackOverflowInPrologue(position_);
-  } else {
-    const intptr_t stack_depth = B->GetStackDepth();
-    code_ += B->CheckStackOverflow(position_, stack_depth, loop_depth);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildDebugCheck() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  // DebugStepCheck instructions are emitted for all explicit DebugCheck
-  // opcodes as well as for implicit DEBUG_CHECK executed by the interpreter
-  // for some opcodes, but not before the first explicit DebugCheck opcode is
-  // encountered.
-  build_debug_step_checks_ = true;
-  BuildDebugStepCheck();
-}
-
-void BytecodeFlowGraphBuilder::BuildPushConstant() {
-  PushConstant(ConstantAt(DecodeOperandD()));
-}
-
-void BytecodeFlowGraphBuilder::BuildPushNull() {
-  code_ += B->NullConstant();
-}
-
-void BytecodeFlowGraphBuilder::BuildPushTrue() {
-  code_ += B->Constant(Bool::True());
-}
-
-void BytecodeFlowGraphBuilder::BuildPushFalse() {
-  code_ += B->Constant(Bool::False());
-}
-
-void BytecodeFlowGraphBuilder::BuildPushInt() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-  code_ += B->IntConstant(DecodeOperandX().value());
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreLocal() {
-  LoadStackSlots(1);
-  const Operand local_index = DecodeOperandX();
-  StoreLocal(local_index);
-}
-
-void BytecodeFlowGraphBuilder::BuildPopLocal() {
-  BuildStoreLocal();
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildPush() {
-  const Operand local_index = DecodeOperandX();
-  LoadLocal(local_index);
-}
-
-void BytecodeFlowGraphBuilder::BuildDirectCallCommon(bool is_unchecked_call) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const Function& target = Function::Cast(ConstantAt(DecodeOperandD()).value());
-  const intptr_t argc = DecodeOperandF().value();
-
-  switch (target.recognized_kind()) {
-    case MethodRecognizer::kFfiAsFunctionInternal:
-      BuildFfiAsFunction();
-      return;
-    case MethodRecognizer::kFfiNativeCallbackFunction:
-      if (CompilerState::Current().is_aot()) {
-        BuildFfiNativeCallbackFunction();
-        return;
-      }
-      break;
-    case MethodRecognizer::kObjectIdentical:
-      // Note: similar optimization is performed in AST flow graph builder -
-      // see StreamingFlowGraphBuilder::BuildStaticInvocation,
-      // special_case_identical.
-      // TODO(alexmarkov): find a better place for this optimization.
-      ASSERT(argc == 2);
-      code_ += B->StrictCompare(Token::kEQ_STRICT, /*number_check=*/true);
-      return;
-    case MethodRecognizer::kAsyncStackTraceHelper:
-    case MethodRecognizer::kSetAsyncThreadStackTrace:
-      if (!FLAG_causal_async_stacks) {
-        ASSERT(argc == 1);
-        // Drop the ignored parameter to _asyncStackTraceHelper(:async_op) or
-        // _setAsyncThreadStackTrace(stackTrace).
-        code_ += B->Drop();
-        code_ += B->NullConstant();
-        return;
-      }
-      break;
-    case MethodRecognizer::kClearAsyncThreadStackTrace:
-      if (!FLAG_causal_async_stacks) {
-        ASSERT(argc == 0);
-        code_ += B->NullConstant();
-        return;
-      }
-      break;
-    case MethodRecognizer::kStringBaseInterpolate:
-      ASSERT(argc == 1);
-      code_ += B->StringInterpolate(position_);
-      return;
-    default:
-      break;
-  }
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  InputsArray* arguments = B->GetArguments(argc);
-
-  StaticCallInstr* call = new (Z) StaticCallInstr(
-      position_, target, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), arguments,
-      *ic_data_array_, B->GetNextDeoptId(),
-      target.IsDynamicFunction() ? ICData::kSuper : ICData::kStatic);
-
-  if (is_unchecked_call) {
-    call->set_entry_kind(Code::EntryKind::kUnchecked);
-  }
-
-  if (!call->InitResultType(Z)) {
-    if (!inferred_types_attribute_.IsNull()) {
-      const InferredTypeMetadata result_type = GetInferredType(pc_);
-      if (!result_type.IsTrivial()) {
-        call->SetResultType(Z, result_type.ToCompileType(Z));
-      }
-    }
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildDirectCall() {
-  BuildDirectCallCommon(/* is_unchecked_call = */ false);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedDirectCall() {
-  BuildDirectCallCommon(/* is_unchecked_call = */ true);
-}
-
-static void ComputeTokenKindAndCheckedArguments(
-    const String& name,
-    const ArgumentsDescriptor& arg_desc,
-    Token::Kind* token_kind,
-    intptr_t* checked_argument_count) {
-  *token_kind = MethodTokenRecognizer::RecognizeTokenKind(name);
-
-  *checked_argument_count = 1;
-  if (*token_kind != Token::kILLEGAL) {
-    intptr_t argument_count = arg_desc.Count();
-    ASSERT(argument_count <= 2);
-    *checked_argument_count = (*token_kind == Token::kSET) ? 1 : argument_count;
-  } else if (Library::IsPrivateCoreLibName(name,
-                                           Symbols::_simpleInstanceOf())) {
-    ASSERT(arg_desc.Count() == 2);
-    *checked_argument_count = 2;
-    *token_kind = Token::kIS;
-  } else if (Library::IsPrivateCoreLibName(name, Symbols::_instanceOf())) {
-    ASSERT(arg_desc.Count() == 4);
-    *token_kind = Token::kIS;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildInterfaceCallCommon(
-    bool is_unchecked_call,
-    bool is_instantiated_call) {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const Function& interface_target =
-      Function::Cast(ConstantAt(DecodeOperandD()).value());
-  const String& name = String::ZoneHandle(Z, interface_target.name());
-  ASSERT(name.IsSymbol());
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  Token::Kind token_kind;
-  intptr_t checked_argument_count;
-  ComputeTokenKindAndCheckedArguments(name, arg_desc, &token_kind,
-                                      &checked_argument_count);
-
-  const intptr_t argc = DecodeOperandF().value();
-  InputsArray* arguments = B->GetArguments(argc);
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), checked_argument_count,
-      *ic_data_array_, B->GetNextDeoptId(), interface_target);
-
-  if (!inferred_types_attribute_.IsNull()) {
-    const InferredTypeMetadata result_type = GetInferredType(pc_);
-    if (!result_type.IsTrivial()) {
-      call->SetResultType(Z, result_type.ToCompileType(Z));
-    }
-  }
-
-  if (is_unchecked_call) {
-    call->set_entry_kind(Code::EntryKind::kUnchecked);
-  }
-
-  if (is_instantiated_call) {
-    const AbstractType& static_receiver_type =
-        AbstractType::Cast(ConstantAt(DecodeOperandD(), 2).value());
-    call->set_receivers_static_type(&static_receiver_type);
-  } else {
-    const Class& owner = Class::Handle(Z, interface_target.Owner());
-    const AbstractType& type =
-        AbstractType::ZoneHandle(Z, owner.DeclarationType());
-    call->set_receivers_static_type(&type);
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
-                           /*is_instantiated_call=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiatedInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
-                           /*is_instantiated_call=*/true);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/true,
-                           /*is_instantiated_call=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildUncheckedClosureCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  BuildDebugStepCheck();
-
-  const Array& arg_desc_array =
-      Array::Cast(ConstantAt(DecodeOperandD()).value());
-  const ArgumentsDescriptor arg_desc(arg_desc_array);
-
-  const intptr_t argc = DecodeOperandF().value();
-
-  LocalVariable* receiver_temp = B->MakeTemporary();
-  code_ += B->CheckNull(position_, receiver_temp, Symbols::Call(),
-                        /*clear_temp=*/false);
-
-  code_ += B->LoadNativeField(Slot::Closure_function());
-
-  InputsArray* arguments = B->GetArguments(argc + 1);
-
-  ClosureCallInstr* call = new (Z) ClosureCallInstr(
-      arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), position_,
-      B->GetNextDeoptId(), Code::EntryKind::kUnchecked);
-
-  // TODO(alexmarkov): use inferred result type for ClosureCallInstr
-  //  if (!inferred_types_attribute_.IsNull()) {
-  //    const InferredTypeMetadata result_type = GetInferredType(pc_);
-  //    if (!result_type.IsTrivial()) {
-  //      call->SetResultType(Z, result_type.ToCompileType(Z));
-  //    }
-  //  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildDynamicCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  const String& name = String::Cast(ConstantAt(DecodeOperandD()).value());
-  const ArgumentsDescriptor arg_desc(
-      Array::Cast(ConstantAt(DecodeOperandD(), 1).value()));
-
-  Token::Kind token_kind;
-  intptr_t checked_argument_count;
-  ComputeTokenKindAndCheckedArguments(name, arg_desc, &token_kind,
-                                      &checked_argument_count);
-
-  const intptr_t argc = DecodeOperandF().value();
-  InputsArray* arguments = B->GetArguments(argc);
-
-  const Function& interface_target = Function::null_function();
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, arg_desc.TypeArgsLen(),
-      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), checked_argument_count,
-      *ic_data_array_, B->GetNextDeoptId(), interface_target);
-
-  if (!inferred_types_attribute_.IsNull()) {
-    const InferredTypeMetadata result_type = GetInferredType(pc_);
-    if (!result_type.IsTrivial()) {
-      call->SetResultType(Z, result_type.ToCompileType(Z));
-    }
-  }
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildNativeCall() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(function().is_native());
-  B->InlineBailout("BytecodeFlowGraphBuilder::BuildNativeCall");
-
-  const auto& name = String::ZoneHandle(Z, function().native_name());
-  const intptr_t num_args =
-      function().NumParameters() + (function().IsGeneric() ? 1 : 0);
-  InputsArray* arguments = B->GetArguments(num_args);
-  auto* call =
-      new (Z) NativeCallInstr(&name, &function(), FLAG_link_natives_lazily,
-                              function().end_token_pos(), arguments);
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocate() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Class& klass = Class::Cast(ConstantAt(DecodeOperandD()).value());
-
-  AllocateObjectInstr* allocate = new (Z) AllocateObjectInstr(position_, klass);
-
-  code_ <<= allocate;
-  B->Push(allocate);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateT() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Class& klass = Class::Cast(PopConstant().value());
-  Value* type_arguments = Pop();
-
-  AllocateObjectInstr* allocate =
-      new (Z) AllocateObjectInstr(position_, klass, type_arguments);
-
-  code_ <<= allocate;
-  B->Push(allocate);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateContext() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t num_context_vars = DecodeOperandE().value();
-
-  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
-      context_id, num_context_vars);
-  code_ += B->AllocateContext(context_slots);
-}
-
-void BytecodeFlowGraphBuilder::BuildCloneContext() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t num_context_vars = DecodeOperandE().value();
-
-  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
-      context_id, num_context_vars);
-  CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), context_slots, B->GetNextDeoptId());
-  code_ <<= clone_instruction;
-  B->Push(clone_instruction);
-}
-
-void BytecodeFlowGraphBuilder::BuildCreateArrayTOS() {
-  LoadStackSlots(2);
-  code_ += B->CreateArray();
-}
-
-const Slot& ClosureSlotByField(const Field& field) {
-  const intptr_t offset = field.HostOffset();
-  if (offset == Closure::instantiator_type_arguments_offset()) {
-    return Slot::Closure_instantiator_type_arguments();
-  } else if (offset == Closure::function_type_arguments_offset()) {
-    return Slot::Closure_function_type_arguments();
-  } else if (offset == Closure::delayed_type_arguments_offset()) {
-    return Slot::Closure_delayed_type_arguments();
-  } else if (offset == Closure::function_offset()) {
-    return Slot::Closure_function();
-  } else if (offset == Closure::context_offset()) {
-    return Slot::Closure_context();
-  } else {
-    RELEASE_ASSERT(offset == Closure::hash_offset());
-    return Slot::Closure_hash();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreFieldTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  if (field.Owner() == isolate()->object_store()->closure_class()) {
-    // Stores to _Closure fields are lower-level.
-    code_ +=
-        B->StoreInstanceField(position_, ClosureSlotByField(field),
-                              StoreInstanceFieldInstr::Kind::kInitializing);
-  } else {
-    // The rest of the StoreFieldTOS are for field initializers.
-    // TODO(alexmarkov): Consider adding a flag to StoreFieldTOS or even
-    // adding a separate bytecode instruction.
-    code_ += B->StoreInstanceFieldGuarded(
-        field, StoreInstanceFieldInstr::Kind::kInitializing);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadFieldTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  if (field.Owner() == isolate()->object_store()->closure_class()) {
-    // Loads from _Closure fields are lower-level.
-    code_ += B->LoadNativeField(ClosureSlotByField(field));
-  } else {
-    code_ += B->LoadField(field, /*calls_initializer=*/false);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreContextParent() {
-  LoadStackSlots(2);
-
-  code_ += B->StoreInstanceField(position_, Slot::Context_parent(),
-                                 StoreInstanceFieldInstr::Kind::kInitializing);
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadContextParent() {
-  LoadStackSlots(1);
-
-  code_ += B->LoadNativeField(Slot::Context_parent());
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreContextVar() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t var_index = DecodeOperandE().value();
-
-  auto var =
-      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
-  code_ += B->StoreInstanceField(
-      position_, Slot::GetContextVariableSlotFor(thread(), *var));
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadContextVar() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t context_id = DecodeOperandA().value();
-  const intptr_t var_index = DecodeOperandE().value();
-
-  auto var =
-      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
-  code_ += B->LoadNativeField(Slot::GetContextVariableSlotFor(thread(), *var));
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadTypeArgumentsField() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  const intptr_t offset =
-      Smi::Cast(ConstantAt(DecodeOperandD()).value()).Value() *
-      compiler::target::kWordSize;
-
-  code_ += B->LoadNativeField(Slot::GetTypeArgumentsSlotAt(thread(), offset));
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreStaticTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index).value());
-
-  code_ += B->StoreStaticField(position_, field);
-}
-
-void BytecodeFlowGraphBuilder::BuildInitLateField() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(1);
-  Operand cp_index = DecodeOperandD();
-
-  const Field& field = Field::Cast(ConstantAt(cp_index, 1).value());
-  ASSERT(Smi::Cast(ConstantAt(cp_index).value()).Value() * kWordSize ==
-         field.HostOffset());
-
-  code_ += B->Constant(Object::sentinel());
-  code_ += B->StoreInstanceField(
-      field, StoreInstanceFieldInstr::Kind::kInitializing, kNoStoreBarrier);
-}
-
-void BytecodeFlowGraphBuilder::BuildPushUninitializedSentinel() {
-  code_ += B->Constant(Object::sentinel());
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfInitialized() {
-  code_ += B->Constant(Object::sentinel());
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildLoadStatic() {
-  const Constant operand = ConstantAt(DecodeOperandD());
-  const auto& field = Field::Cast(operand.value());
-  // All constant expressions (including access to const fields) are evaluated
-  // in bytecode. However, values of injected cid fields are only available in
-  // the VM. In such case, evaluate const fields with known value here.
-  if (field.is_const() && !field.has_nontrivial_initializer()) {
-    const auto& value = Object::ZoneHandle(Z, field.StaticValue());
-    ASSERT((value.raw() != Object::sentinel().raw()) &&
-           (value.raw() != Object::transition_sentinel().raw()));
-    code_ += B->Constant(value);
-    return;
-  }
-  code_ += B->LoadStaticField(field, /*calls_initializer=*/false);
-}
-
-void BytecodeFlowGraphBuilder::BuildStoreIndexedTOS() {
-  LoadStackSlots(3);
-  code_ += B->StoreIndexed(kArrayCid);
-}
-
-void BytecodeFlowGraphBuilder::BuildBooleanNegateTOS() {
-  LoadStackSlots(1);
-  code_ += B->BooleanNegate();
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiateType() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const AbstractType& type =
-      AbstractType::Cast(ConstantAt(DecodeOperandD()).value());
-
-  LoadStackSlots(2);
-  code_ += B->InstantiateType(type);
-}
-
-void BytecodeFlowGraphBuilder::BuildInstantiateTypeArgumentsTOS() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const TypeArguments& type_args =
-      TypeArguments::Cast(ConstantAt(DecodeOperandE()).value());
-
-  LoadStackSlots(2);
-  code_ += B->InstantiateTypeArguments(type_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertBoolean() {
-  LoadStackSlots(1);
-  code_ += B->AssertBool(position_);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertAssignable() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(5);
-
-  const AbstractType& dst_type =
-      AbstractType::Cast(B->Peek(/*depth=*/3)->AsConstant()->value());
-  if (dst_type.IsTopTypeForSubtyping()) {
-    code_ += B->Drop();  // dst_name
-    code_ += B->Drop();  // function_type_args
-    code_ += B->Drop();  // instantiator_type_args
-    code_ += B->Drop();  // dst_type
-    // Leave value on top.
-    return;
-  }
-
-  const String& dst_name = String::Cast(PopConstant().value());
-  Value* function_type_args = Pop();
-  Value* instantiator_type_args = Pop();
-  Value* dst_type_value = Pop();
-  Value* value = Pop();
-
-  AssertAssignableInstr* instr = new (Z) AssertAssignableInstr(
-      position_, value, dst_type_value, instantiator_type_args,
-      function_type_args, dst_name, B->GetNextDeoptId());
-
-  code_ <<= instr;
-
-  B->Push(instr);
-}
-
-void BytecodeFlowGraphBuilder::BuildAssertSubtype() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(5);
-
-  Value* dst_name = Pop();
-  Value* super_type = Pop();
-  Value* sub_type = Pop();
-  Value* function_type_args = Pop();
-  Value* instantiator_type_args = Pop();
-
-  AssertSubtypeInstr* instr = new (Z)
-      AssertSubtypeInstr(position_, instantiator_type_args, function_type_args,
-                         sub_type, super_type, dst_name, B->GetNextDeoptId());
-  code_ <<= instr;
-}
-
-void BytecodeFlowGraphBuilder::BuildNullCheck() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const String& selector =
-      String::CheckedZoneHandle(Z, ConstantAt(DecodeOperandD()).value().raw());
-
-  LocalVariable* receiver_temp = B->MakeTemporary();
-  code_ +=
-      B->CheckNull(position_, receiver_temp, selector, /*clear_temp=*/false);
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildJump() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-  code_ += B->Goto(join);
-  PropagateStackState(target_pc);
-  B->stack_ = nullptr;
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNoAsserts() {
-  ASSERT(IsStackEmpty());
-  if (!isolate()->asserts()) {
-    BuildJump();
-    // Skip all instructions up to the target PC, as they are all unreachable.
-    // If not skipped, some of the assert code may be considered reachable
-    // (if it contains jumps) and generated. The problem is that generated
-    // code may expect values left on the stack from unreachable
-    // (and not generated) code which immediately follows this Jump.
-    next_pc_ = pc_ + DecodeOperandT().value();
-    ASSERT(next_pc_ > pc_);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNotZeroTypeArgs() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  TargetEntryInstr *is_zero, *is_not_zero;
-  code_ += B->LoadArgDescriptor();
-  code_ += B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-  code_ += B->IntConstant(0);
-  code_ += B->BranchIfEqual(&is_zero, &is_not_zero);
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-  Fragment(is_not_zero) += B->Goto(join);
-  PropagateStackState(target_pc);
-
-  code_ = Fragment(code_.entry, is_zero);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfStrictCompare(Token::Kind cmp_kind) {
-  ASSERT((cmp_kind == Token::kEQ) || (cmp_kind == Token::kNE));
-
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LoadStackSlots(2);
-
-  // Fallthrough should correspond to 'then' branch target.
-  // This results in a slightly better regalloc.
-  TargetEntryInstr* then_entry = nullptr;
-  TargetEntryInstr* else_entry = nullptr;
-  code_ += B->BranchIfEqual(&then_entry, &else_entry,
-                            /* negate = */ (cmp_kind == Token::kEQ));
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* join = jump_targets_.Lookup(target_pc);
-  ASSERT(join != nullptr);
-
-  code_ = Fragment(else_entry);
-  code_ += B->Goto(join);
-  PropagateStackState(target_pc);
-
-  code_ = Fragment(then_entry);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfEqStrict() {
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNeStrict() {
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfTrue() {
-  code_ += B->Constant(Bool::True());
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfFalse() {
-  code_ += B->Constant(Bool::False());
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNull() {
-  code_ += B->NullConstant();
-  BuildJumpIfStrictCompare(Token::kEQ);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfNotNull() {
-  code_ += B->NullConstant();
-  BuildJumpIfStrictCompare(Token::kNE);
-}
-
-void BytecodeFlowGraphBuilder::BuildJumpIfUnchecked() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  ASSERT(IsStackEmpty());
-
-  const intptr_t target_pc = pc_ + DecodeOperandT().value();
-  JoinEntryInstr* target = jump_targets_.Lookup(target_pc);
-  ASSERT(target != nullptr);
-  FunctionEntryInstr* unchecked_entry = nullptr;
-  const intptr_t kCheckedEntry =
-      static_cast<intptr_t>(UncheckedEntryPointStyle::kNone);
-  const intptr_t kUncheckedEntry =
-      static_cast<intptr_t>(UncheckedEntryPointStyle::kSharedWithVariable);
-
-  switch (entry_point_style_) {
-    case UncheckedEntryPointStyle::kNone: {
-      JoinEntryInstr* do_checks = B->BuildJoinEntry();
-      code_ += B->Goto(B->InliningUncheckedEntry() ? target : do_checks);
-      code_ = Fragment(do_checks);
-    } break;
-
-    case UncheckedEntryPointStyle::kSeparate: {
-      // Route normal entry to checks.
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->IntConstant(kCheckedEntry);
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      Fragment do_checks = code_;
-
-      // Create a separate unchecked entry point.
-      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
-      code_ = Fragment(unchecked_entry);
-
-      // Re-build prologue for unchecked entry point. It can only contain
-      // Entry, CheckStack and DebugCheck instructions.
-      bytecode_instr_ = raw_bytecode_;
-      ASSERT(KernelBytecode::IsEntryOpcode(bytecode_instr_));
-      bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
-      while (!KernelBytecode::IsJumpIfUncheckedOpcode(bytecode_instr_)) {
-        ASSERT(KernelBytecode::IsCheckStackOpcode(bytecode_instr_) ||
-               KernelBytecode::IsDebugCheckOpcode(bytecode_instr_));
-        ASSERT(jump_targets_.Lookup(bytecode_instr_ - raw_bytecode_) ==
-               nullptr);
-        BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
-        bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
-      }
-      ASSERT((bytecode_instr_ - raw_bytecode_) == pc_);
-
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->IntConstant(
-            static_cast<intptr_t>(UncheckedEntryPointStyle::kSeparate));
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      code_ += B->Goto(target);
-
-      code_ = do_checks;
-    } break;
-
-    case UncheckedEntryPointStyle::kSharedWithVariable: {
-      LocalVariable* ep_var = parsed_function()->entry_points_temp_var();
-
-      // Dispatch based on the value of entry_points_temp_var.
-      TargetEntryInstr *do_checks, *skip_checks;
-      if (FLAG_enable_testing_pragmas) {
-        code_ += B->LoadLocal(ep_var);
-        code_ += B->BuildEntryPointsIntrospection();
-      }
-      code_ += B->LoadLocal(ep_var);
-      code_ += B->IntConstant(kUncheckedEntry);
-      code_ += B->BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
-
-      code_ = Fragment(skip_checks);
-      code_ += B->Goto(target);
-
-      // Relink the body of the function from normal entry to 'prologue_join'.
-      JoinEntryInstr* prologue_join = B->BuildJoinEntry();
-      FunctionEntryInstr* normal_entry = graph_entry_->normal_entry();
-      if (normal_entry->next() != nullptr) {
-        prologue_join->LinkTo(normal_entry->next());
-        normal_entry->set_next(nullptr);
-      }
-
-      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
-      code_ = Fragment(unchecked_entry);
-      code_ += B->IntConstant(kUncheckedEntry);
-      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
-      code_ += B->Drop();
-      code_ += B->Goto(prologue_join);
-
-      code_ = Fragment(normal_entry);
-      code_ += B->IntConstant(kCheckedEntry);
-      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
-      code_ += B->Drop();
-      code_ += B->Goto(prologue_join);
-
-      code_ = Fragment(do_checks);
-    } break;
-  }
-
-  if (unchecked_entry != nullptr) {
-    B->RecordUncheckedEntryPoint(graph_entry_, unchecked_entry);
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildDrop1() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-    // AdjustSP(-1);
-  } else {
-    code_ += B->Drop();
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildReturnTOS() {
-  BuildDebugStepCheck();
-  LoadStackSlots(1);
-  ASSERT(code_.is_open());
-  intptr_t yield_index = PcDescriptorsLayout::kInvalidYieldIndex;
-  if (function().IsAsyncClosure() || function().IsAsyncGenClosure()) {
-    if (pc_ == last_yield_point_pc_) {
-      // The return might actually be a yield point, if so we need to attach the
-      // yield index to the return instruction.
-      yield_index = last_yield_point_index_;
-    }
-  }
-  code_ += B->Return(position_, yield_index);
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildTrap() {
-  code_ += Fragment(new (Z) StopInstr("Bytecode Trap instruction")).closed();
-}
-
-void BytecodeFlowGraphBuilder::BuildThrow() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  if (DecodeOperandA().value() == 0) {
-    // throw
-    LoadStackSlots(1);
-    Value* exception = Pop();
-    code_ +=
-        Fragment(new (Z) ThrowInstr(position_, B->GetNextDeoptId(), exception))
-            .closed();
-  } else {
-    // rethrow
-    LoadStackSlots(2);
-    Value* stacktrace = Pop();
-    Value* exception = Pop();
-    code_ += Fragment(new (Z) ReThrowInstr(position_, kInvalidTryIndex,
-                                           B->GetNextDeoptId(), exception,
-                                           stacktrace))
-                 .closed();
-  }
-
-  ASSERT(code_.is_closed());
-
-  if (!IsStackEmpty()) {
-    DropUnusedValuesFromStack();
-    B->stack_ = nullptr;
-  }
-}
-
-void BytecodeFlowGraphBuilder::BuildMoveSpecial() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  LocalVariable* special_var = nullptr;
-  switch (DecodeOperandA().value()) {
-    case KernelBytecode::kExceptionSpecialIndex:
-      ASSERT(exception_var_ != nullptr);
-      special_var = exception_var_;
-      break;
-    case KernelBytecode::kStackTraceSpecialIndex:
-      ASSERT(stacktrace_var_ != nullptr);
-      special_var = stacktrace_var_;
-      break;
-    default:
-      UNREACHABLE();
-  }
-
-  code_ += B->LoadLocal(special_var);
-  StoreLocal(DecodeOperandY());
-  code_ += B->Drop();
-}
-
-void BytecodeFlowGraphBuilder::BuildSetFrame() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  // No-op in compiled code.
-  ASSERT(IsStackEmpty());
-}
-
-void BytecodeFlowGraphBuilder::BuildEqualsNull() {
-  BuildDebugStepCheck();
-
-  ASSERT(scratch_var_ != nullptr);
-  LoadStackSlots(1);
-
-  TargetEntryInstr* true_branch = nullptr;
-  TargetEntryInstr* false_branch = nullptr;
-  code_ += B->BranchIfNull(&true_branch, &false_branch);
-
-  JoinEntryInstr* join = B->BuildJoinEntry();
-
-  code_ = Fragment(true_branch);
-  code_ += B->Constant(Bool::True());
-  code_ += B->StoreLocalRaw(position_, scratch_var_);
-  code_ += B->Drop();
-  code_ += B->Goto(join);
-
-  code_ = Fragment(false_branch);
-  code_ += B->Constant(Bool::False());
-  code_ += B->StoreLocalRaw(position_, scratch_var_);
-  code_ += B->Drop();
-  code_ += B->Goto(join);
-
-  code_ = Fragment(join);
-  code_ += B->LoadLocal(scratch_var_);
-}
-
-void BytecodeFlowGraphBuilder::BuildPrimitiveOp(
-    const String& name,
-    Token::Kind token_kind,
-    const AbstractType& static_receiver_type,
-    int num_args) {
-  ASSERT((num_args == 1) || (num_args == 2));
-  ASSERT(MethodTokenRecognizer::RecognizeTokenKind(name) == token_kind);
-
-  // A DebugStepCheck is performed as part of the calling stub.
-
-  LoadStackSlots(num_args);
-  InputsArray* arguments = B->GetArguments(num_args);
-
-  InstanceCallInstr* call = new (Z) InstanceCallInstr(
-      position_, name, token_kind, arguments, 0, Array::null_array(), num_args,
-      *ic_data_array_, B->GetNextDeoptId());
-
-  call->set_receivers_static_type(&static_receiver_type);
-
-  code_ <<= call;
-  B->Push(call);
-}
-
-void BytecodeFlowGraphBuilder::BuildIntOp(const String& name,
-                                          Token::Kind token_kind,
-                                          int num_args) {
-  BuildPrimitiveOp(name, token_kind,
-                   AbstractType::ZoneHandle(Z, Type::IntType()), num_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildDoubleOp(const String& name,
-                                             Token::Kind token_kind,
-                                             int num_args) {
-  BuildPrimitiveOp(name, token_kind,
-                   AbstractType::ZoneHandle(Z, Type::Double()), num_args);
-}
-
-void BytecodeFlowGraphBuilder::BuildNegateInt() {
-  BuildIntOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
-}
-
-void BytecodeFlowGraphBuilder::BuildAddInt() {
-  BuildIntOp(Symbols::Plus(), Token::kADD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildSubInt() {
-  BuildIntOp(Symbols::Minus(), Token::kSUB, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildMulInt() {
-  BuildIntOp(Symbols::Star(), Token::kMUL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildTruncDivInt() {
-  BuildIntOp(Symbols::TruncDivOperator(), Token::kTRUNCDIV, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildModInt() {
-  BuildIntOp(Symbols::Percent(), Token::kMOD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitAndInt() {
-  BuildIntOp(Symbols::Ampersand(), Token::kBIT_AND, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitOrInt() {
-  BuildIntOp(Symbols::BitOr(), Token::kBIT_OR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildBitXorInt() {
-  BuildIntOp(Symbols::Caret(), Token::kBIT_XOR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildShlInt() {
-  BuildIntOp(Symbols::LeftShiftOperator(), Token::kSHL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildShrInt() {
-  BuildIntOp(Symbols::RightShiftOperator(), Token::kSHR, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntEq() {
-  BuildIntOp(Symbols::EqualOperator(), Token::kEQ, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntGt() {
-  BuildIntOp(Symbols::RAngleBracket(), Token::kGT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntLt() {
-  BuildIntOp(Symbols::LAngleBracket(), Token::kLT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntGe() {
-  BuildIntOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareIntLe() {
-  BuildIntOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildNegateDouble() {
-  BuildDoubleOp(Symbols::UnaryMinus(), Token::kNEGATE, 1);
-}
-
-void BytecodeFlowGraphBuilder::BuildAddDouble() {
-  BuildDoubleOp(Symbols::Plus(), Token::kADD, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildSubDouble() {
-  BuildDoubleOp(Symbols::Minus(), Token::kSUB, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildMulDouble() {
-  BuildDoubleOp(Symbols::Star(), Token::kMUL, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildDivDouble() {
-  BuildDoubleOp(Symbols::Slash(), Token::kDIV, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleEq() {
-  BuildDoubleOp(Symbols::EqualOperator(), Token::kEQ, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleGt() {
-  BuildDoubleOp(Symbols::RAngleBracket(), Token::kGT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleLt() {
-  BuildDoubleOp(Symbols::LAngleBracket(), Token::kLT, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleGe() {
-  BuildDoubleOp(Symbols::GreaterEqualOperator(), Token::kGTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildCompareDoubleLe() {
-  BuildDoubleOp(Symbols::LessEqualOperator(), Token::kLTE, 2);
-}
-
-void BytecodeFlowGraphBuilder::BuildAllocateClosure() {
-  if (is_generating_interpreter()) {
-    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
-  }
-
-  const Function& target = Function::Cast(ConstantAt(DecodeOperandD()).value());
-  code_ += B->AllocateClosure(position_, target);
-}
-
-// Builds graph for a call to 'dart:ffi::_asFunctionInternal'. The stack must
-// look like:
-//
-// <receiver> => pointer argument
-// <type arguments vector> => signatures
-// ...
-void BytecodeFlowGraphBuilder::BuildFfiAsFunction() {
-  // The bytecode FGB doesn't eagerly insert PushArguments, so the type
-  // arguments won't be wrapped in a PushArgumentsInstr.
-  const TypeArguments& type_args =
-      TypeArguments::Cast(B->Peek(/*depth=*/1)->AsConstant()->value());
-  // Drop type arguments, preserving pointer.
-  code_ += B->DropTempsPreserveTop(1);
-  code_ += B->BuildFfiAsFunctionInternalCall(type_args);
-}
-
-// Builds graph for a call to 'dart:ffi::_nativeCallbackFunction'.
-// The call-site must look like this (guaranteed by the FE which inserts it):
-//
-//   _nativeCallbackFunction<NativeSignatureType>(target, exceptionalReturn)
-//
-// Therefore the stack shall look like:
-//
-// <exceptional return value> => ensured (by FE) to be a constant
-// <target> => closure, ensured (by FE) to be a (non-partially-instantiated)
-//             static tearoff
-// <type args> => [NativeSignatureType]
-void BytecodeFlowGraphBuilder::BuildFfiNativeCallbackFunction() {
-  const TypeArguments& type_args =
-      TypeArguments::Cast(B->Peek(/*depth=*/2)->AsConstant()->value());
-  ASSERT(type_args.IsInstantiated() && type_args.Length() == 1);
-  const Function& native_sig = Function::Handle(
-      Z, Type::CheckedHandle(Z, type_args.TypeAt(0)).signature());
-
-  const Closure& target_closure =
-      Closure::Cast(B->Peek(/*depth=*/1)->AsConstant()->value());
-  ASSERT(!target_closure.IsNull());
-  Function& target = Function::Handle(Z, target_closure.function());
-  ASSERT(!target.IsNull() && target.IsImplicitClosureFunction());
-  target = target.parent_function();
-
-  const Instance& exceptional_return =
-      Instance::Cast(B->Peek(/*depth=*/0)->AsConstant()->value());
-
-  const Function& result =
-      Function::ZoneHandle(Z, compiler::ffi::NativeCallbackFunction(
-                                  native_sig, target, exceptional_return));
-  code_ += B->Constant(result);
-  code_ += B->DropTempsPreserveTop(3);
-}
-
-void BytecodeFlowGraphBuilder::BuildDebugStepCheck() {
-#if !defined(PRODUCT)
-  if (build_debug_step_checks_) {
-    code_ += B->DebugStepCheck(position_);
-  }
-#endif  // !defined(PRODUCT)
-}
-
-intptr_t BytecodeFlowGraphBuilder::GetTryIndex(const PcDescriptors& descriptors,
-                                               intptr_t pc) {
-  const uword pc_offset =
-      KernelBytecode::BytecodePcToOffset(pc, /* is_return_address = */ true);
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  intptr_t try_index = kInvalidTryIndex;
-  while (iter.MoveNext()) {
-    const intptr_t current_try_index = iter.TryIndex();
-    const uword start_pc = iter.PcOffset();
-    if (pc_offset < start_pc) {
-      break;
-    }
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const uword end_pc = iter.PcOffset();
-    if (start_pc <= pc_offset && pc_offset < end_pc) {
-      ASSERT(try_index < current_try_index);
-      try_index = current_try_index;
-    }
-  }
-  return try_index;
-}
-
-JoinEntryInstr* BytecodeFlowGraphBuilder::EnsureControlFlowJoin(
-    const PcDescriptors& descriptors,
-    intptr_t pc) {
-  ASSERT((0 <= pc) && (pc < bytecode_length_));
-  JoinEntryInstr* join = jump_targets_.Lookup(pc);
-  if (join == nullptr) {
-    join = B->BuildJoinEntry(GetTryIndex(descriptors, pc));
-    jump_targets_.Insert(pc, join);
-  }
-  return join;
-}
-
-bool BytecodeFlowGraphBuilder::RequiresScratchVar(const KBCInstr* instr) {
-  switch (KernelBytecode::DecodeOpcode(instr)) {
-    case KernelBytecode::kEntryOptional:
-      return KernelBytecode::DecodeC(instr) > 0;
-
-    case KernelBytecode::kEqualsNull:
-      return true;
-
-    case KernelBytecode::kNativeCall:
-    case KernelBytecode::kNativeCall_Wide:
-      return function().recognized_kind() == MethodRecognizer::kListFactory;
-
-    default:
-      return false;
-  }
-}
-
-void BytecodeFlowGraphBuilder::CollectControlFlow(
-    const PcDescriptors& descriptors,
-    const ExceptionHandlers& handlers,
-    GraphEntryInstr* graph_entry) {
-  bool seen_jump_if_unchecked = false;
-  for (intptr_t pc = 0; pc < bytecode_length_;) {
-    const KBCInstr* instr = &(raw_bytecode_[pc]);
-
-    if (KernelBytecode::IsJumpOpcode(instr)) {
-      const intptr_t target = pc + KernelBytecode::DecodeT(instr);
-      EnsureControlFlowJoin(descriptors, target);
-
-      if (KernelBytecode::IsJumpIfUncheckedOpcode(instr)) {
-        if (seen_jump_if_unchecked) {
-          FATAL1(
-              "Multiple JumpIfUnchecked bytecode instructions are not allowed: "
-              "%s.",
-              function().ToFullyQualifiedCString());
-        }
-        seen_jump_if_unchecked = true;
-        ASSERT(entry_point_style_ == UncheckedEntryPointStyle::kNone);
-        entry_point_style_ = ChooseEntryPointStyle(instr);
-        if (entry_point_style_ ==
-            UncheckedEntryPointStyle::kSharedWithVariable) {
-          parsed_function_->EnsureEntryPointsTemp();
-        }
-      }
-    } else if (KernelBytecode::IsCheckStackOpcode(instr) &&
-               (KernelBytecode::DecodeA(instr) != 0)) {
-      // (dartbug.com/36590) BlockEntryInstr::FindOsrEntryAndRelink assumes
-      // that CheckStackOverflow instruction is at the beginning of a join
-      // block.
-      EnsureControlFlowJoin(descriptors, pc);
-    }
-
-    if ((scratch_var_ == nullptr) && RequiresScratchVar(instr)) {
-      scratch_var_ = new (Z)
-          LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                        Symbols::ExprTemp(), Object::dynamic_type());
-    }
-
-    pc += (KernelBytecode::Next(instr) - instr);
-  }
-
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  while (iter.MoveNext()) {
-    const intptr_t start_pc = KernelBytecode::OffsetToBytecodePc(
-        iter.PcOffset(), /* is_return_address = */ true);
-    EnsureControlFlowJoin(descriptors, start_pc);
-
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const intptr_t end_pc = KernelBytecode::OffsetToBytecodePc(
-        iter.PcOffset(), /* is_return_address = */ true);
-    EnsureControlFlowJoin(descriptors, end_pc);
-  }
-
-  if (handlers.num_entries() > 0) {
-    B->InlineBailout("kernel::BytecodeFlowGraphBuilder::CollectControlFlow");
-
-    exception_var_ = new (Z)
-        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                      Symbols::ExceptionVar(), Object::dynamic_type());
-    stacktrace_var_ = new (Z)
-        LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                      Symbols::StackTraceVar(), Object::dynamic_type());
-  }
-
-  for (intptr_t try_index = 0; try_index < handlers.num_entries();
-       ++try_index) {
-    ExceptionHandlerInfo handler_info;
-    handlers.GetHandlerInfo(try_index, &handler_info);
-
-    const intptr_t handler_pc = KernelBytecode::OffsetToBytecodePc(
-        handler_info.handler_pc_offset, /* is_return_address = */ false);
-    JoinEntryInstr* join = EnsureControlFlowJoin(descriptors, handler_pc);
-
-    // Make sure exception handler starts with SetFrame bytecode instruction.
-    ASSERT(KernelBytecode::IsSetFrameOpcode(&(raw_bytecode_[handler_pc])));
-
-    const Array& handler_types =
-        Array::ZoneHandle(Z, handlers.GetHandledTypes(try_index));
-
-    CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
-        handler_info.is_generated != 0, B->AllocateBlockId(),
-        handler_info.outer_try_index, graph_entry, handler_types, try_index,
-        handler_info.needs_stacktrace != 0, B->GetNextDeoptId(), nullptr,
-        nullptr, exception_var_, stacktrace_var_);
-    graph_entry->AddCatchEntry(entry);
-
-    code_ = Fragment(entry);
-    code_ += B->Goto(join);
-  }
-}
-
-UncheckedEntryPointStyle BytecodeFlowGraphBuilder::ChooseEntryPointStyle(
-    const KBCInstr* jump_if_unchecked) {
-  ASSERT(KernelBytecode::IsJumpIfUncheckedOpcode(jump_if_unchecked));
-
-  if (!function().MayHaveUncheckedEntryPoint()) {
-    return UncheckedEntryPointStyle::kNone;
-  }
-
-  // Separate entry points are used if bytecode has the following pattern:
-  //   Entry
-  //   CheckStack (optional)
-  //   DebugCheck (optional)
-  //   JumpIfUnchecked
-  //
-  const KBCInstr* instr = raw_bytecode_;
-  if (!KernelBytecode::IsEntryOpcode(instr)) {
-    return UncheckedEntryPointStyle::kSharedWithVariable;
-  }
-  instr = KernelBytecode::Next(instr);
-  if (KernelBytecode::IsCheckStackOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-  }
-  if (KernelBytecode::IsDebugCheckOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-  }
-  if (instr != jump_if_unchecked) {
-    return UncheckedEntryPointStyle::kSharedWithVariable;
-  }
-  return UncheckedEntryPointStyle::kSeparate;
-}
-
-void BytecodeFlowGraphBuilder::CreateParameterVariables() {
-  const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
-  object_pool_ = bytecode.object_pool();
-  bytecode_instr_ = reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-
-  scratch_var_ = parsed_function_->EnsureExpressionTemp();
-
-  if (KernelBytecode::IsEntryOptionalOpcode(bytecode_instr_)) {
-    AllocateParametersAndLocalsForEntryOptional();
-  } else if (KernelBytecode::IsEntryOpcode(bytecode_instr_)) {
-    AllocateLocalVariables(DecodeOperandD());
-    AllocateFixedParameters();
-  } else if (KernelBytecode::IsEntryFixedOpcode(bytecode_instr_)) {
-    AllocateLocalVariables(DecodeOperandE());
-    AllocateFixedParameters();
-  } else {
-    UNREACHABLE();
-  }
-
-  if (function().IsGeneric()) {
-    // For recognized methods we generate the IL by hand. Yet we need to find
-    // out which [LocalVariable] is holding the function type arguments. We
-    // scan the bytecode for the CheckFunctionTypeArgs bytecode.
-    //
-    // Note that we cannot add an extra local variable for the type argument
-    // in [AllocateLocalVariables]. We sometimes reuse the same ParsedFunction
-    // multiple times. For non-recognized generic bytecode functions
-    // ParsedFunction::RawTypeArgumentsVariable() is set during flow graph
-    // construction (after local variables are allocated). So the next time,
-    // if ParsedFunction is reused, we would allocate an extra local variable.
-    // TODO(alexmarkov): revise how function type args variable is allocated
-    // and avoid looking at CheckFunctionTypeArgs bytecode.
-    const KBCInstr* instr =
-        reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-    const KBCInstr* end = reinterpret_cast<const KBCInstr*>(
-        bytecode.PayloadStart() + bytecode.Size());
-
-    LocalVariable* type_args_var = nullptr;
-    while (instr < end) {
-      if (KernelBytecode::IsCheckFunctionTypeArgs(instr)) {
-        const intptr_t expected_num_type_args = KernelBytecode::DecodeA(instr);
-        if (expected_num_type_args > 0) {  // Exclude weird closure case.
-          type_args_var = LocalVariableAt(KernelBytecode::DecodeE(instr));
-          break;
-        }
-      }
-      instr = KernelBytecode::Next(instr);
-    }
-
-    // Every generic function *must* have a kCheckFunctionTypeArgs bytecode.
-    ASSERT(type_args_var != nullptr);
-
-    // Normally the flow graph building code of bytecode will, as a side-effect
-    // of building the flow graph, register the function type arguments variable
-    // in the [ParsedFunction] (see [BuildCheckFunctionTypeArgs]).
-    parsed_function_->set_function_type_arguments(type_args_var);
-    parsed_function_->SetRawTypeArgumentsVariable(type_args_var);
-  }
-}
-
-intptr_t BytecodeFlowGraphBuilder::UpdateScope(
-    BytecodeLocalVariablesIterator* iter,
-    intptr_t pc) {
-  // Leave scopes that have ended.
-  while ((current_scope_ != nullptr) && (current_scope_->end_pc_ <= pc)) {
-    for (LocalVariable* local : current_scope_->hidden_vars_) {
-      local_vars_[-local->index().value()] = local;
-    }
-    current_scope_ = current_scope_->parent_;
-  }
-
-  // Enter scopes that have started.
-  intptr_t next_pc = bytecode_length_;
-  while (!iter->IsDone()) {
-    if (iter->IsScope()) {
-      if (iter->StartPC() > pc) {
-        next_pc = iter->StartPC();
-        break;
-      }
-      if (iter->EndPC() > pc) {
-        // Push new scope and declare its variables.
-        current_scope_ = new (Z) BytecodeScope(
-            Z, iter->EndPC(), iter->ContextLevel(), current_scope_);
-        if (!seen_parameters_scope_) {
-          // Skip variables from the first scope as it may contain variables
-          // which were used in prologue (parameters, function type arguments).
-          // The already used variables should not be replaced with new ones.
-          seen_parameters_scope_ = true;
-          iter->MoveNext();
-          continue;
-        }
-        while (iter->MoveNext() && iter->IsVariableDeclaration()) {
-          const intptr_t index = iter->Index();
-          if (!iter->IsCaptured() && (index >= 0)) {
-            LocalVariable* local = new (Z) LocalVariable(
-                TokenPosition::kNoSource, TokenPosition::kNoSource,
-                String::ZoneHandle(Z, iter->Name()),
-                AbstractType::ZoneHandle(Z, iter->Type()));
-            local->set_index(VariableIndex(-index));
-            ASSERT(local_vars_[index]->index().value() == -index);
-            current_scope_->hidden_vars_.Add(local_vars_[index]);
-            local_vars_[index] = local;
-          }
-        }
-        continue;
-      }
-    }
-    iter->MoveNext();
-  }
-  if (current_scope_ != nullptr && next_pc > current_scope_->end_pc_) {
-    next_pc = current_scope_->end_pc_;
-  }
-  B->set_context_depth(
-      current_scope_ != nullptr ? current_scope_->context_level_ : 0);
-  return next_pc;
-}
-
-FlowGraph* BytecodeFlowGraphBuilder::BuildGraph() {
-  const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
-
-  object_pool_ = bytecode.object_pool();
-  raw_bytecode_ = reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-  bytecode_length_ = bytecode.Size() / sizeof(KBCInstr);
-
-  graph_entry_ = new (Z) GraphEntryInstr(*parsed_function_, B->osr_id_);
-
-  auto normal_entry = B->BuildFunctionEntry(graph_entry_);
-  graph_entry_->set_normal_entry(normal_entry);
-
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(Z, bytecode.pc_descriptors());
-  const ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(Z, bytecode.exception_handlers());
-
-  CollectControlFlow(descriptors, handlers, graph_entry_);
-
-  inferred_types_attribute_ ^= BytecodeReader::GetBytecodeAttribute(
-      function(), Symbols::vm_inferred_type_metadata());
-
-  kernel::BytecodeSourcePositionsIterator source_pos_iter(Z, bytecode);
-  bool update_position = source_pos_iter.MoveNext();
-
-  kernel::BytecodeLocalVariablesIterator local_vars_iter(Z, bytecode);
-  intptr_t next_pc_to_update_scope =
-      local_vars_iter.MoveNext() ? 0 : bytecode_length_;
-
-  code_ = Fragment(normal_entry);
-
-  for (pc_ = 0; pc_ < bytecode_length_; pc_ = next_pc_) {
-    bytecode_instr_ = &(raw_bytecode_[pc_]);
-    next_pc_ = pc_ + (KernelBytecode::Next(bytecode_instr_) - bytecode_instr_);
-
-    JoinEntryInstr* join = jump_targets_.Lookup(pc_);
-    if (join != nullptr) {
-      Value* stack_state = stack_states_.Lookup(pc_);
-      if (code_.is_open()) {
-        if (stack_state != B->stack_) {
-          ASSERT(stack_state == nullptr);
-          stack_states_.Insert(pc_, B->stack_);
-        }
-        code_ += B->Goto(join);
-      } else {
-        ASSERT(IsStackEmpty());
-        B->stack_ = stack_state;
-      }
-      code_ = Fragment(join);
-      join->set_stack_depth(B->GetStackDepth());
-      B->SetCurrentTryIndex(join->try_index());
-    } else {
-      // Unreachable bytecode is not allowed.
-      ASSERT(!code_.is_closed());
-    }
-
-    while (update_position &&
-           static_cast<uword>(pc_) >= source_pos_iter.PcOffset()) {
-      position_ = source_pos_iter.TokenPos();
-      if (source_pos_iter.IsYieldPoint()) {
-        last_yield_point_pc_ = source_pos_iter.PcOffset();
-        ++last_yield_point_index_;
-      }
-      update_position = source_pos_iter.MoveNext();
-    }
-
-    if (pc_ >= next_pc_to_update_scope) {
-      next_pc_to_update_scope = UpdateScope(&local_vars_iter, pc_);
-    }
-
-    BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
-
-    if (code_.is_closed()) {
-      ASSERT(IsStackEmpty());
-    }
-  }
-
-  // When compiling for OSR, use a depth first search to find the OSR
-  // entry and make graph entry jump to it instead of normal entry.
-  // Catch entries are always considered reachable, even if they
-  // become unreachable after OSR.
-  if (B->IsCompiledForOsr()) {
-    graph_entry_->RelinkToOsrEntry(Z, B->last_used_block_id_ + 1);
-  }
-
-  FlowGraph* flow_graph = new (Z) FlowGraph(
-      *parsed_function_, graph_entry_, B->last_used_block_id_, prologue_info_);
-
-  if (FLAG_print_flow_graph_from_bytecode) {
-    FlowGraphPrinter::PrintGraph("Constructed from bytecode", flow_graph);
-  }
-
-  return flow_graph;
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
deleted file mode 100644
index c98d743..0000000
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ /dev/null
@@ -1,252 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/backend/il.h"
-#include "vm/compiler/frontend/base_flow_graph_builder.h"
-#include "vm/compiler/frontend/kernel_translation_helper.h"  // For InferredTypeMetadata
-#include "vm/constants_kbc.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeLocalVariablesIterator;
-
-// This class builds flow graph from bytecode. It is used either to compile
-// from bytecode, or generate bytecode interpreter (the latter is not
-// fully implemented yet).
-// TODO(alexmarkov): extend this class and IL to generate an interpreter in
-// addition to compiling bytecode.
-class BytecodeFlowGraphBuilder {
- public:
-  BytecodeFlowGraphBuilder(BaseFlowGraphBuilder* flow_graph_builder,
-                           ParsedFunction* parsed_function,
-                           ZoneGrowableArray<const ICData*>* ic_data_array)
-      : flow_graph_builder_(flow_graph_builder),
-        zone_(flow_graph_builder->zone_),
-        is_generating_interpreter_(
-            false),  // TODO(alexmarkov): pass as argument
-        parsed_function_(parsed_function),
-        ic_data_array_(ic_data_array),
-        object_pool_(ObjectPool::Handle(zone_)),
-        bytecode_length_(0),
-        pc_(0),
-        position_(TokenPosition::kNoSource),
-        local_vars_(zone_, 0),
-        parameters_(zone_, 0),
-        exception_var_(nullptr),
-        stacktrace_var_(nullptr),
-        scratch_var_(nullptr),
-        prologue_info_(-1, -1),
-        throw_no_such_method_(nullptr),
-        inferred_types_attribute_(Array::Handle(zone_)) {}
-
-  FlowGraph* BuildGraph();
-
-  // Create parameter variables without building a flow graph.
-  void CreateParameterVariables();
-
- protected:
-  // Returns `true` if building a flow graph for a bytecode interpreter, or
-  // `false` if compiling a function from bytecode.
-  bool is_generating_interpreter() const { return is_generating_interpreter_; }
-
- private:
-  // Operand of bytecode instruction, either intptr_t value (if compiling
-  // bytecode) or Definition (if generating interpreter).
-  class Operand {
-   public:
-    explicit Operand(Definition* definition)
-        : definition_(definition), value_(0) {
-      ASSERT(definition != nullptr);
-    }
-
-    explicit Operand(intptr_t value) : definition_(nullptr), value_(value) {}
-
-    Definition* definition() const {
-      ASSERT(definition_ != nullptr);
-      return definition_;
-    }
-
-    intptr_t value() const {
-      ASSERT(definition_ == nullptr);
-      return value_;
-    }
-
-   private:
-    Definition* definition_;
-    intptr_t value_;
-  };
-
-  // Constant from a constant pool.
-  // It is either Object (if compiling bytecode) or Definition
-  // (if generating interpreter).
-  class Constant {
-   public:
-    explicit Constant(Definition* definition)
-        : definition_(definition), value_(Object::null_object()) {
-      ASSERT(definition != nullptr);
-    }
-
-    explicit Constant(Zone* zone, const Object& value)
-        : definition_(nullptr), value_(value) {}
-
-    Definition* definition() const {
-      ASSERT(definition_ != nullptr);
-      return definition_;
-    }
-
-    const Object& value() const {
-      ASSERT(definition_ == nullptr);
-      return value_;
-    }
-
-   private:
-    Definition* definition_;
-    const Object& value_;
-  };
-
-  // Scope declared in bytecode local variables information.
-  class BytecodeScope : public ZoneAllocated {
-   public:
-    BytecodeScope(Zone* zone,
-                  intptr_t end_pc,
-                  intptr_t context_level,
-                  BytecodeScope* parent)
-        : end_pc_(end_pc),
-          context_level_(context_level),
-          parent_(parent),
-          hidden_vars_(zone, 4) {}
-
-    const intptr_t end_pc_;
-    const intptr_t context_level_;
-    BytecodeScope* const parent_;
-    ZoneGrowableArray<LocalVariable*> hidden_vars_;
-  };
-
-  Operand DecodeOperandA();
-  Operand DecodeOperandB();
-  Operand DecodeOperandC();
-  Operand DecodeOperandD();
-  Operand DecodeOperandE();
-  Operand DecodeOperandF();
-  Operand DecodeOperandX();
-  Operand DecodeOperandY();
-  Operand DecodeOperandT();
-  Constant ConstantAt(Operand entry_index, intptr_t add_index = 0);
-  void PushConstant(Constant constant);
-  Constant PopConstant();
-  void LoadStackSlots(intptr_t num_slots);
-  void AllocateLocalVariables(Operand frame_size,
-                              intptr_t num_param_locals = 0);
-  LocalVariable* AllocateParameter(intptr_t param_index,
-                                   VariableIndex var_index);
-  void AllocateFixedParameters();
-
-  // Allocates parameters and local variables in case of EntryOptional.
-  // Returns pointer to the instruction after EntryOptional/LoadConstant/Frame
-  // bytecodes.
-  const KBCInstr* AllocateParametersAndLocalsForEntryOptional();
-
-  LocalVariable* LocalVariableAt(intptr_t local_index);
-  void StoreLocal(Operand local_index);
-  void LoadLocal(Operand local_index);
-  Value* Pop();
-  intptr_t GetStackDepth() const;
-  bool IsStackEmpty() const;
-  InferredTypeMetadata GetInferredType(intptr_t pc);
-  void PropagateStackState(intptr_t target_pc);
-  void DropUnusedValuesFromStack();
-  void BuildJumpIfStrictCompare(Token::Kind cmp_kind);
-  void BuildPrimitiveOp(const String& name,
-                        Token::Kind token_kind,
-                        const AbstractType& static_receiver_type,
-                        int num_args);
-  void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
-  void BuildDoubleOp(const String& name, Token::Kind token_kind, int num_args);
-  void BuildDirectCallCommon(bool is_unchecked_call);
-  void BuildInterfaceCallCommon(bool is_unchecked_call,
-                                bool is_instantiated_call);
-
-  void BuildInstruction(KernelBytecode::Opcode opcode);
-  void BuildFfiAsFunction();
-  void BuildFfiNativeCallbackFunction();
-  void BuildDebugStepCheck();
-
-#define DECLARE_BUILD_METHOD(name, encoding, kind, op1, op2, op3)              \
-  void Build##name();
-  KERNEL_BYTECODES_LIST(DECLARE_BUILD_METHOD)
-#undef DECLARE_BUILD_METHOD
-
-  intptr_t GetTryIndex(const PcDescriptors& descriptors, intptr_t pc);
-  JoinEntryInstr* EnsureControlFlowJoin(const PcDescriptors& descriptors,
-                                        intptr_t pc);
-  bool RequiresScratchVar(const KBCInstr* instr);
-  void CollectControlFlow(const PcDescriptors& descriptors,
-                          const ExceptionHandlers& handlers,
-                          GraphEntryInstr* graph_entry);
-
-  // Update current scope, context level and local variables for the given PC.
-  // Returns next PC where scope might need an update.
-  intptr_t UpdateScope(BytecodeLocalVariablesIterator* iter, intptr_t pc);
-
-  // Figure out entry points style.
-  UncheckedEntryPointStyle ChooseEntryPointStyle(
-      const KBCInstr* jump_if_unchecked);
-
-  Thread* thread() const { return flow_graph_builder_->thread_; }
-  Isolate* isolate() const { return thread()->isolate(); }
-
-  ParsedFunction* parsed_function() const {
-    ASSERT(!is_generating_interpreter());
-    return parsed_function_;
-  }
-  const Function& function() const { return parsed_function()->function(); }
-
-  BaseFlowGraphBuilder* flow_graph_builder_;
-  Zone* zone_;
-  bool is_generating_interpreter_;
-
-  // The following members are available only when compiling bytecode.
-
-  ParsedFunction* parsed_function_;
-  ZoneGrowableArray<const ICData*>* ic_data_array_;
-  ObjectPool& object_pool_;
-  const KBCInstr* raw_bytecode_ = nullptr;
-  intptr_t bytecode_length_;
-  intptr_t pc_;
-  intptr_t next_pc_ = -1;
-  const KBCInstr* bytecode_instr_ = nullptr;
-  TokenPosition position_;
-  intptr_t last_yield_point_pc_ = 0;
-  intptr_t last_yield_point_index_ = 0;
-  Fragment code_;
-  ZoneGrowableArray<LocalVariable*> local_vars_;
-  ZoneGrowableArray<LocalVariable*> parameters_;
-  LocalVariable* exception_var_;
-  LocalVariable* stacktrace_var_;
-  LocalVariable* scratch_var_;
-  IntMap<JoinEntryInstr*> jump_targets_;
-  IntMap<Value*> stack_states_;
-  PrologueInfo prologue_info_;
-  JoinEntryInstr* throw_no_such_method_;
-  GraphEntryInstr* graph_entry_ = nullptr;
-  UncheckedEntryPointStyle entry_point_style_ = UncheckedEntryPointStyle::kNone;
-  bool build_debug_step_checks_ = false;
-  bool seen_parameters_scope_ = false;
-  BytecodeScope* current_scope_ = nullptr;
-  Array& inferred_types_attribute_;
-  intptr_t inferred_types_index_ = 0;
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_FLOW_GRAPH_BUILDER_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
deleted file mode 100644
index a6a4252..0000000
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ /dev/null
@@ -1,3776 +0,0 @@
-// 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.
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-
-#include "vm/bit_vector.h"
-#include "vm/bootstrap.h"
-#include "vm/class_finalizer.h"
-#include "vm/class_id.h"
-#include "vm/code_descriptors.h"
-#include "vm/compiler/aot/precompiler.h"  // For Obfuscator
-#include "vm/compiler/assembler/disassembler_kbc.h"
-#include "vm/compiler/frontend/bytecode_scope_builder.h"
-#include "vm/constants_kbc.h"
-#include "vm/dart_api_impl.h"  // For Api::IsFfiEnabled().
-#include "vm/dart_entry.h"
-#include "vm/debugger.h"
-#include "vm/flags.h"
-#include "vm/hash.h"
-#include "vm/longjump.h"
-#include "vm/object_store.h"
-#include "vm/resolver.h"
-#include "vm/reusable_handles.h"
-#include "vm/scopes.h"
-#include "vm/stack_frame_kbc.h"
-#include "vm/timeline.h"
-
-#define Z (zone_)
-#define H (translation_helper_)
-#define I (translation_helper_.isolate())
-
-namespace dart {
-
-DEFINE_FLAG(bool, dump_kernel_bytecode, false, "Dump kernel bytecode");
-
-namespace kernel {
-
-BytecodeMetadataHelper::BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                               ActiveClass* active_class)
-    : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
-      active_class_(active_class) {}
-
-void BytecodeMetadataHelper::ParseBytecodeFunction(
-    ParsedFunction* parsed_function) {
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeMetadataHelper::ParseBytecodeFunction");
-
-  const Function& function = parsed_function->function();
-  ASSERT(function.is_declared_in_bytecode());
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-
-  bytecode_reader.ParseBytecodeFunction(parsed_function, function);
-}
-
-bool BytecodeMetadataHelper::ReadLibraries() {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeMetadataHelper::ReadLibraries");
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return false;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.ReadLibraryDeclarations(bytecode_component.GetNumLibraries());
-  return true;
-}
-
-void BytecodeMetadataHelper::ReadLibrary(const Library& library) {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeMetadataHelper::ReadLibrary");
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(!library.Loaded());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.FindAndReadSpecificLibrary(
-      library, bytecode_component.GetNumLibraries());
-}
-
-bool BytecodeMetadataHelper::FindModifiedLibrariesForHotReload(
-    BitVector* modified_libs,
-    bool* is_empty_program,
-    intptr_t* p_num_classes,
-    intptr_t* p_num_procedures) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  if (translation_helper_.GetBytecodeComponent() == Array::null()) {
-    return false;
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              bytecode_component.GetLibraryIndexOffset());
-  bytecode_reader.FindModifiedLibrariesForHotReload(
-      modified_libs, bytecode_component.GetNumLibraries());
-
-  if (is_empty_program != nullptr) {
-    *is_empty_program = (bytecode_component.GetNumLibraries() == 0);
-  }
-  if (p_num_classes != nullptr) {
-    *p_num_classes = bytecode_component.GetNumClasses();
-  }
-  if (p_num_procedures != nullptr) {
-    *p_num_procedures = bytecode_component.GetNumCodes();
-  }
-  return true;
-}
-
-LibraryPtr BytecodeMetadataHelper::GetMainLibrary() {
-  const intptr_t md_offset = GetComponentMetadataPayloadOffset();
-  if (md_offset < 0) {
-    return Library::null();
-  }
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(helper_->zone_, GetBytecodeComponent()));
-  const intptr_t main_offset = bytecode_component.GetMainOffset();
-  if (main_offset == 0) {
-    return Library::null();
-  }
-
-  BytecodeReaderHelper bytecode_reader(&H, active_class_, &bytecode_component);
-  AlternativeReadingScope alt(&bytecode_reader.reader(), main_offset);
-  return bytecode_reader.ReadMain();
-}
-
-ArrayPtr BytecodeMetadataHelper::GetBytecodeComponent() {
-  ArrayPtr array = translation_helper_.GetBytecodeComponent();
-  if (array == Array::null()) {
-    array = ReadBytecodeComponent();
-    ASSERT(array != Array::null());
-  }
-  return array;
-}
-
-ArrayPtr BytecodeMetadataHelper::ReadBytecodeComponent() {
-  const intptr_t md_offset = GetComponentMetadataPayloadOffset();
-  if (md_offset < 0) {
-    return Array::null();
-  }
-
-  BytecodeReaderHelper component_reader(&H, nullptr, nullptr);
-  return component_reader.ReadBytecodeComponent(md_offset);
-}
-
-BytecodeReaderHelper::BytecodeReaderHelper(
-    TranslationHelper* translation_helper,
-    ActiveClass* active_class,
-    BytecodeComponentData* bytecode_component)
-    : reader_(translation_helper->metadata_payloads()),
-      translation_helper_(*translation_helper),
-      active_class_(active_class),
-      thread_(translation_helper->thread()),
-      zone_(translation_helper->zone()),
-      bytecode_component_(bytecode_component),
-      scoped_function_(Function::Handle(translation_helper->zone())),
-      scoped_function_name_(String::Handle(translation_helper->zone())),
-      scoped_function_class_(Class::Handle(translation_helper->zone())) {}
-
-void BytecodeReaderHelper::ReadCode(const Function& function,
-                                    intptr_t code_offset) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(!function.IsImplicitGetterFunction() &&
-         !function.IsImplicitSetterFunction());
-  if (code_offset == 0) {
-    FATAL2("Function %s (kind %s) doesn't have bytecode",
-           function.ToFullyQualifiedCString(),
-           Function::KindToCString(function.kind()));
-  }
-
-  AlternativeReadingScope alt(&reader_, code_offset);
-  // This scope is needed to set active_class_->enclosing_ which is used to
-  // assign parent function for function types.
-  ActiveEnclosingFunctionScope active_enclosing_function(active_class_,
-                                                         &function);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_exceptions_table =
-      (flags & Code::kHasExceptionsTableFlag) != 0;
-  const bool has_source_positions =
-      (flags & Code::kHasSourcePositionsFlag) != 0;
-  const bool has_local_variables = (flags & Code::kHasLocalVariablesFlag) != 0;
-  const bool has_nullable_fields = (flags & Code::kHasNullableFieldsFlag) != 0;
-  const bool has_closures = (flags & Code::kHasClosuresFlag) != 0;
-  const bool has_parameter_flags = (flags & Code::kHasParameterFlagsFlag) != 0;
-  const bool has_forwarding_stub_target =
-      (flags & Code::kHasForwardingStubTargetFlag) != 0;
-  const bool has_default_function_type_args =
-      (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-
-  if (has_parameter_flags) {
-    intptr_t num_flags = reader_.ReadUInt();
-    for (intptr_t i = 0; i < num_flags; ++i) {
-      reader_.ReadUInt();
-    }
-  }
-  if (has_forwarding_stub_target) {
-    reader_.ReadUInt();
-  }
-  if (has_default_function_type_args) {
-    reader_.ReadUInt();
-  }
-
-  intptr_t num_closures = 0;
-  if (has_closures) {
-    num_closures = reader_.ReadListLength();
-    closures_ = &Array::Handle(Z, Array::New(num_closures));
-    for (intptr_t i = 0; i < num_closures; i++) {
-      ReadClosureDeclaration(function, i);
-    }
-  }
-
-  // Create object pool and read pool entries.
-  const intptr_t obj_count = reader_.ReadListLength();
-  const ObjectPool& pool = ObjectPool::Handle(Z, ObjectPool::New(obj_count));
-  ReadConstantPool(function, pool, 0);
-
-  // Read bytecode and attach to function.
-  const Bytecode& bytecode = Bytecode::Handle(Z, ReadBytecode(pool));
-  function.AttachBytecode(bytecode);
-  ASSERT(bytecode.GetBinary(Z) == reader_.typed_data()->raw());
-
-  ReadExceptionsTable(bytecode, has_exceptions_table);
-
-  ReadSourcePositions(bytecode, has_source_positions);
-
-  ReadLocalVariables(bytecode, has_local_variables);
-
-  if (FLAG_dump_kernel_bytecode) {
-    KernelBytecodeDisassembler::Disassemble(function);
-  }
-
-  // Initialization of fields with null literal is elided from bytecode.
-  // Record the corresponding stores if field guards are enabled.
-  if (has_nullable_fields) {
-    ASSERT(function.IsGenerativeConstructor());
-    const intptr_t num_fields = reader_.ReadListLength();
-    if (I->use_field_guards()) {
-      Field& field = Field::Handle(Z);
-      for (intptr_t i = 0; i < num_fields; i++) {
-        field ^= ReadObject();
-        field.RecordStore(Object::null_object());
-      }
-    } else {
-      for (intptr_t i = 0; i < num_fields; i++) {
-        ReadObject();
-      }
-    }
-  }
-
-  // Read closures.
-  if (has_closures) {
-    Function& closure = Function::Handle(Z);
-    Bytecode& closure_bytecode = Bytecode::Handle(Z);
-    for (intptr_t i = 0; i < num_closures; i++) {
-      closure ^= closures_->At(i);
-
-      const intptr_t flags = reader_.ReadUInt();
-      const bool has_exceptions_table =
-          (flags & ClosureCode::kHasExceptionsTableFlag) != 0;
-      const bool has_source_positions =
-          (flags & ClosureCode::kHasSourcePositionsFlag) != 0;
-      const bool has_local_variables =
-          (flags & ClosureCode::kHasLocalVariablesFlag) != 0;
-
-      // Read closure bytecode and attach to closure function.
-      closure_bytecode = ReadBytecode(pool);
-      closure.AttachBytecode(closure_bytecode);
-      ASSERT(bytecode.GetBinary(Z) == reader_.typed_data()->raw());
-
-      ReadExceptionsTable(closure_bytecode, has_exceptions_table);
-
-      ReadSourcePositions(closure_bytecode, has_source_positions);
-
-      ReadLocalVariables(closure_bytecode, has_local_variables);
-
-      if (FLAG_dump_kernel_bytecode) {
-        KernelBytecodeDisassembler::Disassemble(closure);
-      }
-
-#if !defined(PRODUCT)
-      thread_->isolate()->debugger()->NotifyBytecodeLoaded(closure);
-#endif
-    }
-  }
-
-#if !defined(PRODUCT)
-  thread_->isolate()->debugger()->NotifyBytecodeLoaded(function);
-#endif
-}
-
-static intptr_t IndexFor(Zone* zone,
-                         const Function& function,
-                         const String& name) {
-  const Bytecode& bc = Bytecode::Handle(zone, function.bytecode());
-  const ObjectPool& pool = ObjectPool::Handle(zone, bc.object_pool());
-  const KBCInstr* pc = reinterpret_cast<const KBCInstr*>(bc.PayloadStart());
-
-  ASSERT(KernelBytecode::IsEntryOptionalOpcode(pc));
-  ASSERT(KernelBytecode::DecodeB(pc) ==
-         function.NumOptionalPositionalParameters());
-  ASSERT(KernelBytecode::DecodeC(pc) == function.NumOptionalNamedParameters());
-  pc = KernelBytecode::Next(pc);
-
-  const intptr_t num_opt_params = function.NumOptionalParameters();
-  const intptr_t num_fixed_params = function.num_fixed_parameters();
-  for (intptr_t i = 0; i < num_opt_params; i++) {
-    const KBCInstr* load_name = pc;
-    const KBCInstr* load_value = KernelBytecode::Next(load_name);
-    pc = KernelBytecode::Next(load_value);
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-    ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-    if (pool.ObjectAt(KernelBytecode::DecodeE(load_name)) == name.raw()) {
-      return num_fixed_params + i;
-    }
-  }
-
-  UNREACHABLE();
-  return -1;
-}
-
-ArrayPtr BytecodeReaderHelper::CreateForwarderChecks(const Function& function) {
-  ASSERT(function.kind() != FunctionLayout::kDynamicInvocationForwarder);
-  ASSERT(function.is_declared_in_bytecode());
-
-  TypeArguments& default_args = TypeArguments::Handle(Z);
-  if (function.bytecode_offset() != 0) {
-    AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-
-    const intptr_t flags = reader_.ReadUInt();
-    const bool has_parameter_flags =
-        (flags & Code::kHasParameterFlagsFlag) != 0;
-    const bool has_forwarding_stub_target =
-        (flags & Code::kHasForwardingStubTargetFlag) != 0;
-    const bool has_default_function_type_args =
-        (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-
-    if (has_parameter_flags) {
-      intptr_t num_flags = reader_.ReadUInt();
-      for (intptr_t i = 0; i < num_flags; ++i) {
-        reader_.ReadUInt();
-      }
-    }
-    if (has_forwarding_stub_target) {
-      reader_.ReadUInt();
-    }
-
-    if (has_default_function_type_args) {
-      const intptr_t index = reader_.ReadUInt();
-      const Bytecode& code = Bytecode::Handle(Z, function.bytecode());
-      const ObjectPool& pool = ObjectPool::Handle(Z, code.object_pool());
-      default_args ^= pool.ObjectAt(index);
-    }
-  }
-
-  auto& name = String::Handle(Z);
-  auto& check = ParameterTypeCheck::Handle(Z);
-  auto& checks = GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-
-  checks.Add(function);
-  checks.Add(default_args);
-
-  const auto& type_params =
-      TypeArguments::Handle(Z, function.type_parameters());
-  if (!type_params.IsNull()) {
-    auto& type_param = TypeParameter::Handle(Z);
-    auto& bound = AbstractType::Handle(Z);
-    for (intptr_t i = 0, n = type_params.Length(); i < n; ++i) {
-      type_param ^= type_params.TypeAt(i);
-      bound = type_param.bound();
-      if (!bound.IsTopTypeForSubtyping() &&
-          !type_param.IsGenericCovariantImpl()) {
-        name = type_param.name();
-        ASSERT(type_param.IsFinalized());
-        check = ParameterTypeCheck::New();
-        check.set_param(type_param);
-        check.set_type_or_bound(bound);
-        check.set_name(name);
-        checks.Add(check);
-      }
-    }
-  }
-
-  const intptr_t num_params = function.NumParameters();
-  const intptr_t num_pos_params = function.HasOptionalNamedParameters()
-                                      ? function.num_fixed_parameters()
-                                      : num_params;
-
-  BitVector is_covariant(Z, num_params);
-  BitVector is_generic_covariant_impl(Z, num_params);
-  ReadParameterCovariance(function, &is_covariant, &is_generic_covariant_impl);
-
-  auto& type = AbstractType::Handle(Z);
-  auto& cache = SubtypeTestCache::Handle(Z);
-  const bool has_optional_parameters = function.HasOptionalParameters();
-  for (intptr_t i = function.NumImplicitParameters(); i < num_params; ++i) {
-    type = function.ParameterTypeAt(i);
-    if (!type.IsTopTypeForSubtyping() &&
-        !is_generic_covariant_impl.Contains(i) && !is_covariant.Contains(i)) {
-      name = function.ParameterNameAt(i);
-      intptr_t index;
-      if (i >= num_pos_params) {
-        // Named parameter.
-        index = IndexFor(Z, function, name);
-      } else if (has_optional_parameters) {
-        // Fixed or optional parameter.
-        index = i;
-      } else {
-        // Fixed parameter.
-        index = -kKBCParamEndSlotFromFp - num_params + i;
-      }
-      check = ParameterTypeCheck::New();
-      check.set_index(index);
-      check.set_type_or_bound(type);
-      check.set_name(name);
-      cache = SubtypeTestCache::New();
-      check.set_cache(cache);
-      checks.Add(check);
-    }
-  }
-
-  return Array::MakeFixedLength(checks);
-}
-
-void BytecodeReaderHelper::ReadClosureDeclaration(const Function& function,
-                                                  intptr_t closureIndex) {
-  // Closure flags, must be in sync with ClosureDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasOptionalPositionalParamsFlag = 1 << 0;
-  const int kHasOptionalNamedParamsFlag = 1 << 1;
-  const int kHasTypeParamsFlag = 1 << 2;
-  const int kHasSourcePositionsFlag = 1 << 3;
-  const int kIsAsyncFlag = 1 << 4;
-  const int kIsAsyncStarFlag = 1 << 5;
-  const int kIsSyncStarFlag = 1 << 6;
-  const int kIsDebuggableFlag = 1 << 7;
-  const int kHasAttributesFlag = 1 << 8;
-  const int kHasParameterFlagsFlag = 1 << 9;
-
-  const intptr_t flags = reader_.ReadUInt();
-
-  Object& parent = Object::Handle(Z, ReadObject());
-  if (!parent.IsFunction()) {
-    ASSERT(parent.IsField());
-    ASSERT(function.kind() == FunctionLayout::kFieldInitializer);
-    // Closure in a static field initializer, so use current function as parent.
-    parent = function.raw();
-  }
-
-  String& name = String::CheckedHandle(Z, ReadObject());
-  ASSERT(name.IsSymbol());
-
-  TokenPosition position = TokenPosition::kNoSource;
-  TokenPosition end_position = TokenPosition::kNoSource;
-  if ((flags & kHasSourcePositionsFlag) != 0) {
-    position = reader_.ReadPosition();
-    end_position = reader_.ReadPosition();
-  }
-
-  const Function& closure = Function::Handle(
-      Z, Function::NewClosureFunction(name, Function::Cast(parent), position));
-
-  closure.set_is_declared_in_bytecode(true);
-  closure.set_end_token_pos(end_position);
-
-  if ((flags & kIsSyncStarFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kSyncGen);
-  } else if ((flags & kIsAsyncFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kAsync);
-    closure.set_is_inlinable(!FLAG_causal_async_stacks &&
-                             !FLAG_lazy_async_stacks);
-  } else if ((flags & kIsAsyncStarFlag) != 0) {
-    closure.set_modifier(FunctionLayout::kAsyncGen);
-    closure.set_is_inlinable(!FLAG_causal_async_stacks &&
-                             !FLAG_lazy_async_stacks);
-  }
-  if (Function::Cast(parent).IsAsyncOrGenerator()) {
-    closure.set_is_generated_body(true);
-  }
-  closure.set_is_debuggable((flags & kIsDebuggableFlag) != 0);
-
-  closures_->SetAt(closureIndex, closure);
-
-  Type& signature_type = Type::Handle(
-      Z, ReadFunctionSignature(
-             closure, (flags & kHasOptionalPositionalParamsFlag) != 0,
-             (flags & kHasOptionalNamedParamsFlag) != 0,
-             (flags & kHasTypeParamsFlag) != 0,
-             /* has_positional_param_names = */ true,
-             (flags & kHasParameterFlagsFlag) != 0, Nullability::kNonNullable));
-
-  closure.SetSignatureType(signature_type);
-
-  if ((flags & kHasAttributesFlag) != 0) {
-    ReadAttributes(closure);
-  }
-
-  I->AddClosureFunction(closure);
-}
-
-static bool IsNonCanonical(const AbstractType& type) {
-  return type.IsTypeRef() || (type.IsType() && !type.IsCanonical());
-}
-
-static bool HasNonCanonicalTypes(Zone* zone, const Function& func) {
-  auto& type = AbstractType::Handle(zone);
-  for (intptr_t i = 0; i < func.NumParameters(); ++i) {
-    type = func.ParameterTypeAt(i);
-    if (IsNonCanonical(type)) {
-      return true;
-    }
-  }
-  type = func.result_type();
-  if (IsNonCanonical(type)) {
-    return true;
-  }
-  const auto& type_params = TypeArguments::Handle(zone, func.type_parameters());
-  if (!type_params.IsNull()) {
-    for (intptr_t i = 0; i < type_params.Length(); ++i) {
-      type = type_params.TypeAt(i);
-      type = TypeParameter::Cast(type).bound();
-      if (IsNonCanonical(type)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-TypePtr BytecodeReaderHelper::ReadFunctionSignature(
-    const Function& func,
-    bool has_optional_positional_params,
-    bool has_optional_named_params,
-    bool has_type_params,
-    bool has_positional_param_names,
-    bool has_parameter_flags,
-    Nullability nullability) {
-  FunctionTypeScope function_type_scope(this);
-
-  if (has_type_params) {
-    ReadTypeParametersDeclaration(Class::Handle(Z), func);
-  }
-
-  const intptr_t kImplicitClosureParam = 1;
-  const intptr_t num_params = kImplicitClosureParam + reader_.ReadUInt();
-
-  intptr_t num_required_params = num_params;
-  if (has_optional_positional_params || has_optional_named_params) {
-    num_required_params = kImplicitClosureParam + reader_.ReadUInt();
-  }
-
-  func.set_num_fixed_parameters(num_required_params);
-  func.SetNumOptionalParameters(num_params - num_required_params,
-                                !has_optional_named_params);
-  func.set_parameter_types(
-      Array::Handle(Z, Array::New(num_params, Heap::kOld)));
-  func.CreateNameArrayIncludingFlags(Heap::kOld);
-
-  intptr_t i = 0;
-  func.SetParameterTypeAt(i, AbstractType::dynamic_type());
-  func.SetParameterNameAt(i, Symbols::ClosureParameter());
-  ++i;
-
-  AbstractType& type = AbstractType::Handle(Z);
-  String& name = String::Handle(Z);
-  for (; i < num_params; ++i) {
-    if (has_positional_param_names ||
-        (has_optional_named_params && (i >= num_required_params))) {
-      name ^= ReadObject();
-    } else {
-      name = Symbols::NotNamed().raw();
-    }
-    func.SetParameterNameAt(i, name);
-    type ^= ReadObject();
-    func.SetParameterTypeAt(i, type);
-  }
-  if (has_parameter_flags) {
-    intptr_t num_flags = reader_.ReadUInt();
-    for (intptr_t i = 0; i < num_flags; ++i) {
-      intptr_t flag = reader_.ReadUInt();
-      if ((flag & Parameter::kIsRequiredFlag) != 0) {
-        RELEASE_ASSERT(kImplicitClosureParam + i >= num_required_params);
-        func.SetIsRequiredAt(kImplicitClosureParam + i);
-      }
-    }
-  }
-  func.TruncateUnusedParameterFlags();
-
-  type ^= ReadObject();
-  func.set_result_type(type);
-
-  // Finalize function type.
-  type = func.SignatureType(nullability);
-  ClassFinalizer::FinalizationKind finalization = ClassFinalizer::kCanonicalize;
-  if (pending_recursive_types_ != nullptr && HasNonCanonicalTypes(Z, func)) {
-    // This function type is a part of recursive type. Avoid canonicalization
-    // as not all TypeRef objects are filled up at this point.
-    finalization = ClassFinalizer::kFinalize;
-  }
-  type = ClassFinalizer::FinalizeType(type, finalization);
-  return Type::Cast(type).raw();
-}
-
-void BytecodeReaderHelper::ReadTypeParametersDeclaration(
-    const Class& parameterized_class,
-    const Function& parameterized_function) {
-  ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
-
-  const intptr_t num_type_params = reader_.ReadUInt();
-  ASSERT(num_type_params > 0);
-
-  intptr_t offset;
-  NNBDMode nnbd_mode;
-  if (!parameterized_class.IsNull()) {
-    offset = parameterized_class.NumTypeArguments() - num_type_params;
-    nnbd_mode = parameterized_class.nnbd_mode();
-  } else {
-    offset = parameterized_function.NumParentTypeParameters();
-    nnbd_mode = parameterized_function.nnbd_mode();
-  }
-  const Nullability nullability = (nnbd_mode == NNBDMode::kOptedInLib)
-                                      ? Nullability::kNonNullable
-                                      : Nullability::kLegacy;
-
-  // First setup the type parameters, so if any of the following code uses it
-  // (in a recursive way) we're fine.
-  //
-  // Step a) Create array of [TypeParameter] objects (without bound).
-  const TypeArguments& type_parameters =
-      TypeArguments::Handle(Z, TypeArguments::New(num_type_params));
-  String& name = String::Handle(Z);
-  TypeParameter& parameter = TypeParameter::Handle(Z);
-  AbstractType& type = AbstractType::Handle(Z);
-  for (intptr_t i = 0; i < num_type_params; ++i) {
-    name ^= ReadObject();
-    ASSERT(name.IsSymbol());
-    parameter = TypeParameter::New(parameterized_class, parameterized_function,
-                                   i, name, /* bound = */ type,
-                                   /* is_generic_covariant_impl = */ false,
-                                   nullability, TokenPosition::kNoSource);
-    parameter.set_index(offset + i);
-    parameter.SetIsFinalized();
-    parameter.SetCanonical();
-    parameter.SetDeclaration(true);
-    // For functions, default type arguments aren't available here but with the
-    // bytecode, so update any non-dynamic default arguments when reading the
-    // bytecode. (For classes, we don't currently use this, so dynamic is fine.)
-    parameter.set_default_argument(Object::dynamic_type());
-    type_parameters.SetTypeAt(i, parameter);
-  }
-
-  if (!parameterized_class.IsNull()) {
-    parameterized_class.set_type_parameters(type_parameters);
-  } else if (!parameterized_function.IsFactory()) {
-    // Do not set type parameters for factories, as VM uses class type
-    // parameters instead.
-    parameterized_function.set_type_parameters(type_parameters);
-    parameterized_function.UpdateCachedDefaultTypeArguments(thread_);
-    if (parameterized_function.IsSignatureFunction()) {
-      if (function_type_type_parameters_ == nullptr) {
-        function_type_type_parameters_ = &type_parameters;
-      } else {
-        function_type_type_parameters_ = &TypeArguments::Handle(
-            Z, function_type_type_parameters_->ConcatenateTypeParameters(
-                   Z, type_parameters));
-      }
-    } else {
-      ASSERT(function_type_type_parameters_ == nullptr);
-    }
-  }
-
-  // Step b) Fill in the bounds of all [TypeParameter]s.
-  for (intptr_t i = 0; i < num_type_params; ++i) {
-    parameter ^= type_parameters.TypeAt(i);
-    type ^= ReadObject();
-    // Convert dynamic to Object? or Object* in bounds of type parameters so
-    // they are equivalent when doing subtype checks for function types.
-    // TODO(https://github.com/dart-lang/language/issues/495): revise this
-    // when function subtyping is fixed.
-    if (type.IsDynamicType()) {
-      type = nnbd_mode == NNBDMode::kOptedInLib
-                 ? I->object_store()->nullable_object_type()
-                 : I->object_store()->legacy_object_type();
-    }
-    parameter.set_bound(type);
-  }
-
-  // Fix bounds in all derived type parameters (with different nullabilities).
-  if (active_class_->derived_type_parameters != nullptr) {
-    auto& derived = TypeParameter::Handle(Z);
-    for (intptr_t i = 0, n = active_class_->derived_type_parameters->Length();
-         i < n; ++i) {
-      derived ^= active_class_->derived_type_parameters->At(i);
-      if (derived.bound() == AbstractType::null() &&
-          ((!parameterized_class.IsNull() &&
-            derived.parameterized_class() == parameterized_class.raw()) ||
-           (!parameterized_function.IsNull() &&
-            derived.parameterized_function() ==
-                parameterized_function.raw()))) {
-        ASSERT(derived.IsFinalized());
-        parameter ^= type_parameters.TypeAt(derived.index() - offset);
-        type = parameter.bound();
-        derived.set_bound(type);
-        type = parameter.default_argument();
-        derived.set_default_argument(type);
-      }
-    }
-  }
-}
-
-intptr_t BytecodeReaderHelper::ReadConstantPool(const Function& function,
-                                                const ObjectPool& pool,
-                                                intptr_t start_index) {
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadConstantPool");
-
-  // These enums and the code below reading the constant pool from kernel must
-  // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
-  enum ConstantPoolTag {
-    kInvalid,
-    kUnused1,
-    kUnused2,
-    kUnused3,
-    kUnused4,
-    kUnused5,
-    kUnused6,
-    kUnused6a,
-    kUnused7,
-    kStaticField,
-    kInstanceField,
-    kClass,
-    kTypeArgumentsField,
-    kUnused8,
-    kType,
-    kUnused9,
-    kUnused10,
-    kUnused11,
-    kUnused12,
-    kClosureFunction,
-    kEndClosureFunctionScope,
-    kNativeEntry,
-    kSubtypeTestCache,
-    kUnused13,
-    kEmptyTypeArguments,
-    kUnused14,
-    kUnused15,
-    kObjectRef,
-    kDirectCall,
-    kInterfaceCall,
-    kInstantiatedInterfaceCall,
-    kDynamicCall,
-    kDirectCallViaDynamicForwarder,
-  };
-
-  Object& obj = Object::Handle(Z);
-  Object& elem = Object::Handle(Z);
-  Field& field = Field::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  String& name = String::Handle(Z);
-  const intptr_t obj_count = pool.Length();
-  for (intptr_t i = start_index; i < obj_count; ++i) {
-    const intptr_t tag = reader_.ReadTag();
-    switch (tag) {
-      case ConstantPoolTag::kInvalid:
-        UNREACHABLE();
-      case ConstantPoolTag::kStaticField:
-        obj = ReadObject();
-        ASSERT(obj.IsField());
-        break;
-      case ConstantPoolTag::kInstanceField:
-        field ^= ReadObject();
-        // InstanceField constant occupies 2 entries.
-        // The first entry is used for field offset.
-        obj = Smi::New(field.HostOffset() / kWordSize);
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for field object.
-        obj = field.raw();
-        break;
-      case ConstantPoolTag::kClass:
-        obj = ReadObject();
-        ASSERT(obj.IsClass());
-        break;
-      case ConstantPoolTag::kTypeArgumentsField:
-        cls ^= ReadObject();
-        obj = Smi::New(cls.host_type_arguments_field_offset() / kWordSize);
-        break;
-      case ConstantPoolTag::kType:
-        obj = ReadObject();
-        ASSERT(obj.IsAbstractType());
-        break;
-      case ConstantPoolTag::kClosureFunction: {
-        intptr_t closure_index = reader_.ReadUInt();
-        obj = closures_->At(closure_index);
-        ASSERT(obj.IsFunction());
-        // Set current entry.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-
-        // This scope is needed to set active_class_->enclosing_ which is used
-        // to assign parent function for function types.
-        ActiveEnclosingFunctionScope active_enclosing_function(
-            active_class_, &Function::Cast(obj));
-
-        // Read constant pool until corresponding EndClosureFunctionScope.
-        i = ReadConstantPool(function, pool, i + 1);
-
-        // Proceed with the rest of entries.
-        continue;
-      }
-      case ConstantPoolTag::kEndClosureFunctionScope: {
-        // EndClosureFunctionScope entry is not used and set to null.
-        obj = Object::null();
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        return i;
-      }
-      case ConstantPoolTag::kNativeEntry: {
-        name = ReadString();
-        obj = NativeEntry(function, name);
-        pool.SetTypeAt(i, ObjectPool::EntryType::kNativeEntryData,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        continue;
-      }
-      case ConstantPoolTag::kSubtypeTestCache: {
-        obj = SubtypeTestCache::New();
-      } break;
-      case ConstantPoolTag::kEmptyTypeArguments:
-        obj = Object::empty_type_arguments().raw();
-        break;
-      case ConstantPoolTag::kObjectRef:
-        obj = ReadObject();
-        break;
-      case ConstantPoolTag::kDirectCall: {
-        // DirectCall constant occupies 2 entries.
-        // The first entry is used for target function.
-        obj = ReadObject();
-        ASSERT(obj.IsFunction());
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kInterfaceCall: {
-        elem = ReadObject();
-        ASSERT(elem.IsFunction());
-        // InterfaceCall constant occupies 2 entries.
-        // The first entry is used for interface target.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, elem);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kInstantiatedInterfaceCall: {
-        elem = ReadObject();
-        ASSERT(elem.IsFunction());
-        // InstantiatedInterfaceCall constant occupies 3 entries:
-        // 1) Interface target.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, elem);
-        ++i;
-        ASSERT(i < obj_count);
-        // 2) Arguments descriptor.
-        obj = ReadObject();
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // 3) Static receiver type.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kDynamicCall: {
-        name ^= ReadObject();
-        ASSERT(name.IsSymbol());
-        // Do not mangle ==:
-        //   * operator == takes an Object so it is either not checked or
-        //     checked at the entry because the parameter is marked covariant,
-        //     neither of those cases require a dynamic invocation forwarder
-        if (!Field::IsGetterName(name) &&
-            (name.raw() != Symbols::EqualOperator().raw())) {
-          name = Function::CreateDynamicInvocationForwarderName(name);
-        }
-        // DynamicCall constant occupies 2 entries: selector and arguments
-        // descriptor.
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, name);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      case ConstantPoolTag::kDirectCallViaDynamicForwarder: {
-        // DirectCallViaDynamicForwarder constant occupies 2 entries.
-        // The first entry is used for target function.
-        obj = ReadObject();
-        ASSERT(obj.IsFunction());
-        name = Function::Cast(obj).name();
-        name = Function::CreateDynamicInvocationForwarderName(name);
-        obj = Function::Cast(obj).GetDynamicInvocationForwarder(name);
-
-        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                       ObjectPool::Patchability::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        ++i;
-        ASSERT(i < obj_count);
-        // The second entry is used for arguments descriptor.
-        obj = ReadObject();
-      } break;
-      default:
-        UNREACHABLE();
-    }
-    pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
-                   ObjectPool::Patchability::kNotPatchable);
-    pool.SetObjectAt(i, obj);
-  }
-
-  return obj_count - 1;
-}
-
-BytecodePtr BytecodeReaderHelper::ReadBytecode(const ObjectPool& pool) {
-#if defined(SUPPORT_TIMELINE)
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadBytecode");
-#endif  // defined(SUPPORT_TIMELINE)
-  const intptr_t size = reader_.ReadUInt();
-  const intptr_t offset = reader_.offset();
-
-  const uint8_t* data = reader_.BufferAt(offset);
-  reader_.set_offset(offset + size);
-
-  // Create and return bytecode object.
-  return Bytecode::New(reinterpret_cast<uword>(data), size, offset, pool);
-}
-
-void BytecodeReaderHelper::ReadExceptionsTable(const Bytecode& bytecode,
-                                               bool has_exceptions_table) {
-#if defined(SUPPORT_TIMELINE)
-  TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
-                    "BytecodeReaderHelper::ReadExceptionsTable");
-#endif
-
-  const intptr_t try_block_count =
-      has_exceptions_table ? reader_.ReadListLength() : 0;
-  if (try_block_count > 0) {
-    const ObjectPool& pool = ObjectPool::Handle(Z, bytecode.object_pool());
-    AbstractType& handler_type = AbstractType::Handle(Z);
-    Array& handler_types = Array::Handle(Z);
-    DescriptorList* pc_descriptors_list = new (Z) DescriptorList(Z);
-    ExceptionHandlerList* exception_handlers_list =
-        new (Z) ExceptionHandlerList();
-
-    // Encoding of ExceptionsTable is described in
-    // pkg/vm/lib/bytecode/exceptions.dart.
-    for (intptr_t try_index = 0; try_index < try_block_count; try_index++) {
-      intptr_t outer_try_index_plus1 = reader_.ReadUInt();
-      intptr_t outer_try_index = outer_try_index_plus1 - 1;
-      // PcDescriptors are expressed in terms of return addresses.
-      intptr_t start_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ true);
-      intptr_t end_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ true);
-      intptr_t handler_pc =
-          KernelBytecode::BytecodePcToOffset(reader_.ReadUInt(),
-                                             /* is_return_address = */ false);
-      uint8_t flags = reader_.ReadByte();
-      const uint8_t kFlagNeedsStackTrace = 1 << 0;
-      const uint8_t kFlagIsSynthetic = 1 << 1;
-      const bool needs_stacktrace = (flags & kFlagNeedsStackTrace) != 0;
-      const bool is_generated = (flags & kFlagIsSynthetic) != 0;
-      intptr_t type_count = reader_.ReadListLength();
-      ASSERT(type_count > 0);
-      handler_types = Array::New(type_count, Heap::kOld);
-      for (intptr_t i = 0; i < type_count; i++) {
-        intptr_t type_index = reader_.ReadUInt();
-        ASSERT(type_index < pool.Length());
-        handler_type ^= pool.ObjectAt(type_index);
-        handler_types.SetAt(i, handler_type);
-      }
-      pc_descriptors_list->AddDescriptor(
-          PcDescriptorsLayout::kOther, start_pc, DeoptId::kNone,
-          TokenPosition::kNoSource, try_index,
-          PcDescriptorsLayout::kInvalidYieldIndex);
-      pc_descriptors_list->AddDescriptor(
-          PcDescriptorsLayout::kOther, end_pc, DeoptId::kNone,
-          TokenPosition::kNoSource, try_index,
-          PcDescriptorsLayout::kInvalidYieldIndex);
-
-      // The exception handler keeps a zone handle of the types array, rather
-      // than a raw pointer. Do not share the handle across iterations to avoid
-      // clobbering the array.
-      exception_handlers_list->AddHandler(
-          try_index, outer_try_index, handler_pc, is_generated,
-          Array::ZoneHandle(Z, handler_types.raw()), needs_stacktrace);
-    }
-    const PcDescriptors& descriptors = PcDescriptors::Handle(
-        Z, pc_descriptors_list->FinalizePcDescriptors(bytecode.PayloadStart()));
-    bytecode.set_pc_descriptors(descriptors);
-    const ExceptionHandlers& handlers = ExceptionHandlers::Handle(
-        Z, exception_handlers_list->FinalizeExceptionHandlers(
-               bytecode.PayloadStart()));
-    bytecode.set_exception_handlers(handlers);
-  } else {
-    bytecode.set_pc_descriptors(Object::empty_descriptors());
-    bytecode.set_exception_handlers(Object::empty_exception_handlers());
-  }
-}
-
-void BytecodeReaderHelper::ReadSourcePositions(const Bytecode& bytecode,
-                                               bool has_source_positions) {
-  if (!has_source_positions) {
-    return;
-  }
-
-  intptr_t offset = reader_.ReadUInt();
-  bytecode.set_source_positions_binary_offset(
-      bytecode_component_->GetSourcePositionsOffset() + offset);
-}
-
-void BytecodeReaderHelper::ReadLocalVariables(const Bytecode& bytecode,
-                                              bool has_local_variables) {
-  if (!has_local_variables) {
-    return;
-  }
-
-  const intptr_t offset = reader_.ReadUInt();
-  bytecode.set_local_variables_binary_offset(
-      bytecode_component_->GetLocalVariablesOffset() + offset);
-}
-
-TypedDataPtr BytecodeReaderHelper::NativeEntry(const Function& function,
-                                               const String& external_name) {
-  MethodRecognizer::Kind kind = function.recognized_kind();
-  // This list of recognized methods must be kept in sync with the list of
-  // methods handled specially by the NativeCall bytecode in the interpreter.
-  switch (kind) {
-    case MethodRecognizer::kObjectEquals:
-    case MethodRecognizer::kStringBaseLength:
-    case MethodRecognizer::kStringBaseIsEmpty:
-    case MethodRecognizer::kGrowableArrayLength:
-    case MethodRecognizer::kObjectArrayLength:
-    case MethodRecognizer::kImmutableArrayLength:
-    case MethodRecognizer::kTypedListLength:
-    case MethodRecognizer::kTypedListViewLength:
-    case MethodRecognizer::kByteDataViewLength:
-    case MethodRecognizer::kByteDataViewOffsetInBytes:
-    case MethodRecognizer::kTypedDataViewOffsetInBytes:
-    case MethodRecognizer::kByteDataViewTypedData:
-    case MethodRecognizer::kTypedDataViewTypedData:
-    case MethodRecognizer::kClassIDgetID:
-    case MethodRecognizer::kGrowableArrayCapacity:
-    case MethodRecognizer::kListFactory:
-    case MethodRecognizer::kObjectArrayAllocate:
-    case MethodRecognizer::kLinkedHashMap_getIndex:
-    case MethodRecognizer::kLinkedHashMap_setIndex:
-    case MethodRecognizer::kLinkedHashMap_getData:
-    case MethodRecognizer::kLinkedHashMap_setData:
-    case MethodRecognizer::kLinkedHashMap_getHashMask:
-    case MethodRecognizer::kLinkedHashMap_setHashMask:
-    case MethodRecognizer::kLinkedHashMap_getUsedData:
-    case MethodRecognizer::kLinkedHashMap_setUsedData:
-    case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
-    case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
-    case MethodRecognizer::kFfiAbi:
-#define TYPED_DATA_FACTORY(clazz)                                              \
-  case MethodRecognizer::kTypedData_##clazz##_factory:
-      CLASS_LIST_TYPED_DATA(TYPED_DATA_FACTORY)
-#undef TYPED_DATA_FACTORY
-      break;
-    case MethodRecognizer::kAsyncStackTraceHelper:
-      // If causal async stacks are disabled the interpreter.cc will handle this
-      // native call specially.
-      if (!FLAG_causal_async_stacks) {
-        break;
-      }
-      FALL_THROUGH;
-    default:
-      kind = MethodRecognizer::kUnknown;
-  }
-  NativeFunctionWrapper trampoline = NULL;
-  NativeFunction native_function = NULL;
-  intptr_t argc_tag = 0;
-  if (kind == MethodRecognizer::kUnknown) {
-    if (!FLAG_link_natives_lazily) {
-      const Class& cls = Class::Handle(Z, function.Owner());
-      const Library& library = Library::Handle(Z, cls.library());
-      Dart_NativeEntryResolver resolver = library.native_entry_resolver();
-      const bool is_bootstrap_native = Bootstrap::IsBootstrapResolver(resolver);
-      const int num_params =
-          NativeArguments::ParameterCountForResolution(function);
-      bool is_auto_scope = true;
-      native_function = NativeEntry::ResolveNative(library, external_name,
-                                                   num_params, &is_auto_scope);
-      if (native_function == nullptr) {
-        Report::MessageF(Report::kError, Script::Handle(function.script()),
-                         function.token_pos(), Report::AtLocation,
-                         "native function '%s' (%" Pd
-                         " arguments) cannot be found",
-                         external_name.ToCString(), function.NumParameters());
-      }
-      if (is_bootstrap_native) {
-        trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-      } else if (is_auto_scope) {
-        trampoline = &NativeEntry::AutoScopeNativeCallWrapper;
-      } else {
-        trampoline = &NativeEntry::NoScopeNativeCallWrapper;
-      }
-    }
-    argc_tag = NativeArguments::ComputeArgcTag(function);
-  }
-  return NativeEntryData::New(kind, trampoline, native_function, argc_tag);
-}
-
-ArrayPtr BytecodeReaderHelper::ReadBytecodeComponent(intptr_t md_offset) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  AlternativeReadingScope alt(&reader_, md_offset);
-
-  const intptr_t start_offset = reader_.offset();
-
-  intptr_t magic = reader_.ReadUInt32();
-  if (magic != KernelBytecode::kMagicValue) {
-    FATAL1("Unexpected Dart bytecode magic %" Px, magic);
-  }
-
-  const intptr_t version = reader_.ReadUInt32();
-  if ((version < KernelBytecode::kMinSupportedBytecodeFormatVersion) ||
-      (version > KernelBytecode::kMaxSupportedBytecodeFormatVersion)) {
-    FATAL3("Unsupported Dart bytecode format version %" Pd
-           ". "
-           "This version of Dart VM supports bytecode format versions from %" Pd
-           " to %" Pd ".",
-           version, KernelBytecode::kMinSupportedBytecodeFormatVersion,
-           KernelBytecode::kMaxSupportedBytecodeFormatVersion);
-  }
-
-  reader_.ReadUInt32();  // Skip stringTable.numItems
-  const intptr_t string_table_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip objectTable.numItems
-  const intptr_t object_table_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip main.numItems
-  const intptr_t main_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_libraries = reader_.ReadUInt32();
-  const intptr_t library_index_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip libraries.numItems
-  const intptr_t libraries_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_classes = reader_.ReadUInt32();
-  const intptr_t classes_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip members.numItems
-  const intptr_t members_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_codes = reader_.ReadUInt32();
-  const intptr_t codes_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip sourcePositions.numItems
-  const intptr_t source_positions_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip sourceFiles.numItems
-  const intptr_t source_files_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip lineStarts.numItems
-  const intptr_t line_starts_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip localVariables.numItems
-  const intptr_t local_variables_offset = start_offset + reader_.ReadUInt32();
-
-  reader_.ReadUInt32();  // Skip annotations.numItems
-  const intptr_t annotations_offset = start_offset + reader_.ReadUInt32();
-
-  const intptr_t num_protected_names = reader_.ReadUInt32();
-  const intptr_t protected_names_offset = start_offset + reader_.ReadUInt32();
-
-  // Read header of string table.
-  reader_.set_offset(string_table_offset);
-  const intptr_t num_one_byte_strings = reader_.ReadUInt32();
-  const intptr_t num_two_byte_strings = reader_.ReadUInt32();
-  const intptr_t strings_contents_offset =
-      reader_.offset() + (num_one_byte_strings + num_two_byte_strings) * 4;
-
-  // Read header of object table.
-  reader_.set_offset(object_table_offset);
-  const intptr_t num_objects = reader_.ReadUInt();
-  const intptr_t objects_size = reader_.ReadUInt();
-
-  // Skip over contents of objects.
-  const intptr_t objects_contents_offset = reader_.offset();
-  const intptr_t object_offsets_offset = objects_contents_offset + objects_size;
-  reader_.set_offset(object_offsets_offset);
-
-  auto& bytecode_component_array = Array::Handle(
-      Z,
-      BytecodeComponentData::New(
-          Z, version, num_objects, string_table_offset, strings_contents_offset,
-          object_offsets_offset, objects_contents_offset, main_offset,
-          num_libraries, library_index_offset, libraries_offset, num_classes,
-          classes_offset, members_offset, num_codes, codes_offset,
-          source_positions_offset, source_files_offset, line_starts_offset,
-          local_variables_offset, annotations_offset, Heap::kOld));
-
-  BytecodeComponentData bytecode_component(&bytecode_component_array);
-
-  // Read object offsets.
-  Smi& offs = Smi::Handle(Z);
-  for (intptr_t i = 0; i < num_objects; ++i) {
-    offs = Smi::New(reader_.ReadUInt());
-    bytecode_component.SetObject(i, offs);
-  }
-
-  // Read protected names.
-  if (I->obfuscate() && (num_protected_names > 0)) {
-    bytecode_component_ = &bytecode_component;
-
-    reader_.set_offset(protected_names_offset);
-    Obfuscator obfuscator(thread_, Object::null_string());
-    auto& name = String::Handle(Z);
-    for (intptr_t i = 0; i < num_protected_names; ++i) {
-      name = ReadString();
-      obfuscator.PreventRenaming(name);
-    }
-
-    bytecode_component_ = nullptr;
-  }
-
-  H.SetBytecodeComponent(bytecode_component_array);
-
-  return bytecode_component_array.raw();
-}
-
-void BytecodeReaderHelper::ResetObjects() {
-  reader_.set_offset(bytecode_component_->GetObjectOffsetsOffset());
-  const intptr_t num_objects = bytecode_component_->GetNumObjects();
-
-  // Read object offsets.
-  Smi& offs = Smi::Handle(Z);
-  for (intptr_t i = 0; i < num_objects; ++i) {
-    offs = Smi::New(reader_.ReadUInt());
-    bytecode_component_->SetObject(i, offs);
-  }
-}
-
-ObjectPtr BytecodeReaderHelper::ReadObject() {
-  uint32_t header = reader_.ReadUInt();
-  if ((header & kReferenceBit) != 0) {
-    intptr_t index = header >> kIndexShift;
-    if (index == 0) {
-      return Object::null();
-    }
-    ObjectPtr obj = bytecode_component_->GetObject(index);
-    if (obj->IsHeapObject()) {
-      return obj;
-    }
-    // Object is not loaded yet.
-    intptr_t offset = bytecode_component_->GetObjectsContentsOffset() +
-                      Smi::Value(Smi::RawCast(obj));
-    AlternativeReadingScope alt(&reader_, offset);
-    header = reader_.ReadUInt();
-
-    obj = ReadObjectContents(header);
-    ASSERT(obj->IsHeapObject());
-    {
-      REUSABLE_OBJECT_HANDLESCOPE(thread_);
-      Object& obj_handle = thread_->ObjectHandle();
-      obj_handle = obj;
-      bytecode_component_->SetObject(index, obj_handle);
-    }
-    return obj;
-  }
-
-  return ReadObjectContents(header);
-}
-
-StringPtr BytecodeReaderHelper::ConstructorName(const Class& cls,
-                                                const String& name) {
-  GrowableHandlePtrArray<const String> pieces(Z, 3);
-  pieces.Add(String::Handle(Z, cls.Name()));
-  pieces.Add(Symbols::Dot());
-  pieces.Add(name);
-  return Symbols::FromConcatAll(thread_, pieces);
-}
-
-ObjectPtr BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
-  ASSERT(((header & kReferenceBit) == 0));
-
-  // Must be in sync with enum ObjectKind in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum ObjectKind {
-    kInvalid,
-    kLibrary,
-    kClass,
-    kMember,
-    kClosure,
-    kUnused1,
-    kUnused2,
-    kUnused3,
-    kUnused4,
-    kName,
-    kTypeArguments,
-    kUnused5,
-    kConstObject,
-    kArgDesc,
-    kScript,
-    kType,
-  };
-
-  // Member flags, must be in sync with _MemberHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const intptr_t kFlagIsField = kFlagBit0;
-  const intptr_t kFlagIsConstructor = kFlagBit1;
-
-  // ArgDesc flags, must be in sync with _ArgDescHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasNamedArgs = kFlagBit0;
-  const int kFlagHasTypeArgs = kFlagBit1;
-
-  // Script flags, must be in sync with _ScriptHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasSourceFile = kFlagBit0;
-
-  // Name flags, must be in sync with _NameHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const intptr_t kFlagIsPublic = kFlagBit0;
-
-  const intptr_t kind = (header >> kKindShift) & kKindMask;
-  const intptr_t flags = header & kFlagsMask;
-
-  switch (kind) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kLibrary: {
-      String& uri = String::CheckedHandle(Z, ReadObject());
-      LibraryPtr library = Library::LookupLibrary(thread_, uri);
-      if (library == Library::null()) {
-        // We do not register expression evaluation libraries with the VM:
-        // The expression evaluation functions should be GC-able as soon as
-        // they are not reachable anymore and we never look them up by name.
-        if (uri.raw() == Symbols::EvalSourceUri().raw()) {
-          ASSERT(expression_evaluation_library_ != nullptr);
-          return expression_evaluation_library_->raw();
-        }
-#if !defined(PRODUCT)
-        ASSERT(Isolate::Current()->HasAttemptedReload());
-        const String& msg = String::Handle(
-            Z,
-            String::NewFormatted("Unable to find library %s", uri.ToCString()));
-        Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-        FATAL1("Unable to find library %s", uri.ToCString());
-#endif
-      }
-      return library;
-    }
-    case kClass: {
-      const Library& library = Library::CheckedHandle(Z, ReadObject());
-      const String& class_name = String::CheckedHandle(Z, ReadObject());
-      if (class_name.raw() == Symbols::Empty().raw()) {
-        NoSafepointScope no_safepoint_scope(thread_);
-        ClassPtr cls = library.toplevel_class();
-        if (cls == Class::null()) {
-          FATAL1("Unable to find toplevel class %s", library.ToCString());
-        }
-        return cls;
-      }
-      ClassPtr cls = library.LookupLocalClass(class_name);
-      if (cls == Class::null()) {
-        if (IsExpressionEvaluationLibrary(library)) {
-          return H.GetExpressionEvaluationRealClass();
-        }
-#if !defined(PRODUCT)
-        ASSERT(Isolate::Current()->HasAttemptedReload());
-        const String& msg = String::Handle(
-            Z,
-            String::NewFormatted("Unable to find class %s in %s",
-                                 class_name.ToCString(), library.ToCString()));
-        Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-        FATAL2("Unable to find class %s in %s", class_name.ToCString(),
-               library.ToCString());
-#endif
-      }
-      return cls;
-    }
-    case kMember: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      String& name = String::CheckedHandle(Z, ReadObject());
-      if ((flags & kFlagIsField) != 0) {
-        FieldPtr field = cls.LookupField(name);
-        if (field == Field::null()) {
-#if !defined(PRODUCT)
-          ASSERT(Isolate::Current()->HasAttemptedReload());
-          const String& msg = String::Handle(
-              Z, String::NewFormatted("Unable to find field %s in %s",
-                                      name.ToCString(), cls.ToCString()));
-          Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-          FATAL2("Unable to find field %s in %s", name.ToCString(),
-                 cls.ToCString());
-#endif
-        }
-        return field;
-      } else {
-        if ((flags & kFlagIsConstructor) != 0) {
-          name = ConstructorName(cls, name);
-        }
-        ASSERT(!name.IsNull() && name.IsSymbol());
-        if (name.raw() == scoped_function_name_.raw() &&
-            cls.raw() == scoped_function_class_.raw()) {
-          return scoped_function_.raw();
-        }
-        FunctionPtr function = Function::null();
-        if (cls.EnsureIsFinalized(thread_) == Error::null()) {
-          function = Resolver::ResolveFunction(Z, cls, name);
-        }
-        if (function == Function::null()) {
-          // When requesting a getter, also return method extractors.
-          if (Field::IsGetterName(name)) {
-            String& method_name =
-                String::Handle(Z, Field::NameFromGetter(name));
-            function = Resolver::ResolveFunction(Z, cls, method_name);
-            if (function != Function::null()) {
-              function = Function::Handle(Z, function).GetMethodExtractor(name);
-              if (function != Function::null()) {
-                return function;
-              }
-            }
-          }
-#if !defined(PRODUCT)
-          ASSERT(Isolate::Current()->HasAttemptedReload());
-          const String& msg = String::Handle(
-              Z, String::NewFormatted("Unable to find function %s in %s",
-                                      name.ToCString(), cls.ToCString()));
-          Report::LongJump(LanguageError::Handle(Z, LanguageError::New(msg)));
-#else
-          FATAL2("Unable to find function %s in %s", name.ToCString(),
-                 cls.ToCString());
-#endif
-        }
-        return function;
-      }
-    }
-    case kClosure: {
-      ReadObject();  // Skip enclosing member.
-      const intptr_t closure_index = reader_.ReadUInt();
-      return closures_->At(closure_index);
-    }
-    case kName: {
-      if ((flags & kFlagIsPublic) == 0) {
-        const Library& library = Library::CheckedHandle(Z, ReadObject());
-        ASSERT(!library.IsNull());
-        auto& name = String::Handle(Z, ReadString(/* is_canonical = */ false));
-        name = library.PrivateName(name);
-        if (I->obfuscate()) {
-          const auto& library_key = String::Handle(Z, library.private_key());
-          Obfuscator obfuscator(thread_, library_key);
-          return obfuscator.Rename(name);
-        }
-        return name.raw();
-      }
-      if (I->obfuscate()) {
-        Obfuscator obfuscator(thread_, Object::null_string());
-        const auto& name = String::Handle(Z, ReadString());
-        return obfuscator.Rename(name);
-      } else {
-        return ReadString();
-      }
-    }
-    case kTypeArguments: {
-      return ReadTypeArguments();
-    }
-    case kConstObject: {
-      const intptr_t tag = flags / kFlagBit0;
-      return ReadConstObject(tag);
-    }
-    case kArgDesc: {
-      const intptr_t num_arguments = reader_.ReadUInt();
-      const intptr_t num_type_args =
-          ((flags & kFlagHasTypeArgs) != 0) ? reader_.ReadUInt() : 0;
-      if ((flags & kFlagHasNamedArgs) == 0) {
-        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments);
-      } else {
-        const intptr_t num_arg_names = reader_.ReadListLength();
-        const Array& array = Array::Handle(Z, Array::New(num_arg_names));
-        String& name = String::Handle(Z);
-        for (intptr_t i = 0; i < num_arg_names; ++i) {
-          name ^= ReadObject();
-          array.SetAt(i, name);
-        }
-        return ArgumentsDescriptor::NewBoxed(num_type_args, num_arguments,
-                                             array);
-      }
-    }
-    case kScript: {
-      const String& uri = String::CheckedHandle(Z, ReadObject());
-      Script& script = Script::Handle(Z);
-      if ((flags & kFlagHasSourceFile) != 0) {
-        // TODO(alexmarkov): read source and line starts only when needed.
-        script =
-            ReadSourceFile(uri, bytecode_component_->GetSourceFilesOffset() +
-                                    reader_.ReadUInt());
-      } else {
-        script = Script::New(uri, Object::null_string());
-      }
-      script.set_kernel_program_info(H.GetKernelProgramInfo());
-      return script.raw();
-    }
-    case kType: {
-      const intptr_t tag = (flags & kTagMask) / kFlagBit0;
-      const Nullability nullability =
-          Reader::ConvertNullability(static_cast<KernelNullability>(
-              (flags & kNullabilityMask) / kFlagBit4));
-      return ReadType(tag, nullability);
-    }
-    default:
-      UNREACHABLE();
-  }
-
-  return Object::null();
-}
-
-ObjectPtr BytecodeReaderHelper::ReadConstObject(intptr_t tag) {
-  // Must be in sync with enum ConstTag in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum ConstTag {
-    kInvalid,
-    kInstance,
-    kInt,
-    kDouble,
-    kList,
-    kTearOff,
-    kBool,
-    kSymbol,
-    kTearOffInstantiation,
-    kString,
-  };
-
-  switch (tag) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kInstance: {
-      const Type& type = Type::CheckedHandle(Z, ReadObject());
-      const Class& cls = Class::Handle(Z, type.type_class());
-      const Instance& obj = Instance::Handle(Z, Instance::New(cls, Heap::kOld));
-      if (type.arguments() != TypeArguments::null()) {
-        const TypeArguments& type_args =
-            TypeArguments::Handle(Z, type.arguments());
-        obj.SetTypeArguments(type_args);
-      }
-      const intptr_t num_fields = reader_.ReadUInt();
-      Field& field = Field::Handle(Z);
-      Object& value = Object::Handle(Z);
-      for (intptr_t i = 0; i < num_fields; ++i) {
-        field ^= ReadObject();
-        value = ReadObject();
-        obj.SetField(field, value);
-      }
-      return H.Canonicalize(obj);
-    }
-    case kInt: {
-      const int64_t value = reader_.ReadSLEB128AsInt64();
-      if (Smi::IsValid(value)) {
-        return Smi::New(static_cast<intptr_t>(value));
-      }
-      const Integer& obj = Integer::Handle(Z, Integer::New(value, Heap::kOld));
-      return H.Canonicalize(obj);
-    }
-    case kDouble: {
-      const int64_t bits = reader_.ReadSLEB128AsInt64();
-      double value = bit_cast<double, int64_t>(bits);
-      const Double& obj = Double::Handle(Z, Double::New(value, Heap::kOld));
-      return H.Canonicalize(obj);
-    }
-    case kList: {
-      const AbstractType& elem_type =
-          AbstractType::CheckedHandle(Z, ReadObject());
-      const intptr_t length = reader_.ReadUInt();
-      const Array& array = Array::Handle(Z, Array::New(length, elem_type));
-      Object& value = Object::Handle(Z);
-      for (intptr_t i = 0; i < length; ++i) {
-        value = ReadObject();
-        array.SetAt(i, value);
-      }
-      array.MakeImmutable();
-      return H.Canonicalize(array);
-    }
-    case kTearOff: {
-      Object& obj = Object::Handle(Z, ReadObject());
-      ASSERT(obj.IsFunction());
-      obj = Function::Cast(obj).ImplicitClosureFunction();
-      ASSERT(obj.IsFunction());
-      obj = Function::Cast(obj).ImplicitStaticClosure();
-      ASSERT(obj.IsInstance());
-      return H.Canonicalize(Instance::Cast(obj));
-    }
-    case kBool: {
-      bool is_true = reader_.ReadByte() != 0;
-      return is_true ? Bool::True().raw() : Bool::False().raw();
-    }
-    case kSymbol: {
-      const String& name = String::CheckedHandle(Z, ReadObject());
-      ASSERT(name.IsSymbol());
-      const Library& library = Library::Handle(Z, Library::InternalLibrary());
-      ASSERT(!library.IsNull());
-      const Class& cls =
-          Class::Handle(Z, library.LookupClass(Symbols::Symbol()));
-      ASSERT(!cls.IsNull());
-      const Field& field = Field::Handle(
-          Z, cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
-      ASSERT(!field.IsNull());
-      const Instance& obj = Instance::Handle(Z, Instance::New(cls, Heap::kOld));
-      obj.SetField(field, name);
-      return H.Canonicalize(obj);
-    }
-    case kTearOffInstantiation: {
-      Closure& closure = Closure::CheckedHandle(Z, ReadObject());
-      const TypeArguments& type_args =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      closure = Closure::New(
-          TypeArguments::Handle(Z, closure.instantiator_type_arguments()),
-          TypeArguments::Handle(Z, closure.function_type_arguments()),
-          type_args, Function::Handle(Z, closure.function()),
-          Context::Handle(Z, closure.context()), Heap::kOld);
-      return H.Canonicalize(closure);
-    }
-    case kString:
-      return ReadString();
-    default:
-      UNREACHABLE();
-  }
-  return Object::null();
-}
-
-ObjectPtr BytecodeReaderHelper::ReadType(intptr_t tag,
-                                         Nullability nullability) {
-  // Must be in sync with enum TypeTag in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  enum TypeTag {
-    kInvalid,
-    kDynamic,
-    kVoid,
-    kSimpleType,
-    kTypeParameter,
-    kGenericType,
-    kRecursiveGenericType,
-    kRecursiveTypeRef,
-    kFunctionType,
-    kNever,
-  };
-
-  // FunctionType flags, must be in sync with _FunctionTypeHandle constants in
-  // pkg/vm/lib/bytecode/object_table.dart.
-  const int kFlagHasOptionalPositionalParams = 1 << 0;
-  const int kFlagHasOptionalNamedParams = 1 << 1;
-  const int kFlagHasTypeParams = 1 << 2;
-
-  switch (tag) {
-    case kInvalid:
-      UNREACHABLE();
-      break;
-    case kDynamic:
-      return AbstractType::dynamic_type().raw();
-    case kVoid:
-      return AbstractType::void_type().raw();
-    case kNever:
-      return Type::Handle(Z, Type::NeverType())
-          .ToNullability(nullability, Heap::kOld);
-    case kSimpleType: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const Type& type = Type::Handle(Z, cls.DeclarationType());
-      return type.ToNullability(nullability, Heap::kOld);
-    }
-    case kTypeParameter: {
-      Object& parent = Object::Handle(Z, ReadObject());
-      const intptr_t index_in_parent = reader_.ReadUInt();
-      TypeArguments& type_parameters = TypeArguments::Handle(Z);
-      if (parent.IsClass()) {
-        type_parameters = Class::Cast(parent).type_parameters();
-      } else if (parent.IsFunction()) {
-        if (Function::Cast(parent).IsFactory()) {
-          // For factory constructors VM uses type parameters of a class
-          // instead of constructor's type parameters.
-          parent = Function::Cast(parent).Owner();
-          type_parameters = Class::Cast(parent).type_parameters();
-        } else {
-          type_parameters = Function::Cast(parent).type_parameters();
-        }
-      } else if (parent.IsNull()) {
-        ASSERT(function_type_type_parameters_ != nullptr);
-        type_parameters = function_type_type_parameters_->raw();
-      } else {
-        UNREACHABLE();
-      }
-      TypeParameter& type_parameter = TypeParameter::Handle(Z);
-      type_parameter ^= type_parameters.TypeAt(index_in_parent);
-      if (type_parameter.bound() == AbstractType::null()) {
-        AbstractType& derived = AbstractType::Handle(
-            Z, type_parameter.ToNullability(nullability, Heap::kOld));
-        active_class_->RecordDerivedTypeParameter(Z, type_parameter,
-                                                  TypeParameter::Cast(derived));
-        return derived.raw();
-      }
-      return type_parameter.ToNullability(nullability, Heap::kOld);
-    }
-    case kGenericType: {
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const TypeArguments& type_arguments =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      const Type& type =
-          Type::Handle(Z, Type::New(cls, type_arguments,
-                                    TokenPosition::kNoSource, nullability));
-      type.SetIsFinalized();
-      return type.Canonicalize(thread_, nullptr);
-    }
-    case kRecursiveGenericType: {
-      const intptr_t id = reader_.ReadUInt();
-      const Class& cls = Class::CheckedHandle(Z, ReadObject());
-      if (!cls.is_declaration_loaded()) {
-        LoadReferencedClass(cls);
-      }
-      const auto saved_pending_recursive_types = pending_recursive_types_;
-      if (id == 0) {
-        pending_recursive_types_ = &GrowableObjectArray::Handle(
-            Z, GrowableObjectArray::New(Heap::kOld));
-      }
-      ASSERT(id == pending_recursive_types_->Length());
-      const auto& type_ref =
-          TypeRef::Handle(Z, TypeRef::New(AbstractType::null_abstract_type()));
-      pending_recursive_types_->Add(type_ref);
-
-      reading_type_arguments_of_recursive_type_ = true;
-      const TypeArguments& type_arguments =
-          TypeArguments::CheckedHandle(Z, ReadObject());
-      reading_type_arguments_of_recursive_type_ = false;
-
-      ASSERT(id == pending_recursive_types_->Length() - 1);
-      ASSERT(pending_recursive_types_->At(id) == type_ref.raw());
-      pending_recursive_types_->SetLength(id);
-      pending_recursive_types_ = saved_pending_recursive_types;
-
-      Type& type =
-          Type::Handle(Z, Type::New(cls, type_arguments,
-                                    TokenPosition::kNoSource, nullability));
-      type_ref.set_type(type);
-      type.SetIsFinalized();
-      if (id != 0) {
-        // Do not canonicalize non-root recursive types
-        // as not all TypeRef objects are filled up at this point.
-        return type.raw();
-      }
-      return type.Canonicalize(thread_, nullptr);
-    }
-    case kRecursiveTypeRef: {
-      const intptr_t id = reader_.ReadUInt();
-      ASSERT(pending_recursive_types_ != nullptr);
-      ASSERT(pending_recursive_types_->Length() >= id);
-      return pending_recursive_types_->At(id);
-    }
-    case kFunctionType: {
-      const intptr_t flags = reader_.ReadUInt();
-      Function& signature_function = Function::ZoneHandle(
-          Z, Function::NewSignatureFunction(*active_class_->klass,
-                                            active_class_->enclosing != NULL
-                                                ? *active_class_->enclosing
-                                                : Function::null_function(),
-                                            TokenPosition::kNoSource));
-
-      // This scope is needed to set active_class_->enclosing_ which is used to
-      // assign parent function for function types.
-      ActiveEnclosingFunctionScope active_enclosing_function(
-          active_class_, &signature_function);
-
-      // TODO(alexmarkov): skip type finalization
-      return ReadFunctionSignature(
-          signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
-          (flags & kFlagHasOptionalNamedParams) != 0,
-          (flags & kFlagHasTypeParams) != 0,
-          /* has_positional_param_names = */ false,
-          /* has_parameter_flags */ false, nullability);
-    }
-    default:
-      UNREACHABLE();
-  }
-  return Object::null();
-}
-
-StringPtr BytecodeReaderHelper::ReadString(bool is_canonical) {
-  const int kFlagTwoByteString = 1;
-  const int kHeaderFields = 2;
-  const int kUInt32Size = 4;
-
-  uint32_t ref = reader_.ReadUInt();
-  const bool isOneByteString = (ref & kFlagTwoByteString) == 0;
-  intptr_t index = ref >> 1;
-
-  if (!isOneByteString) {
-    const uint32_t num_one_byte_strings =
-        reader_.ReadUInt32At(bytecode_component_->GetStringsHeaderOffset());
-    index += num_one_byte_strings;
-  }
-
-  AlternativeReadingScope alt(&reader_,
-                              bytecode_component_->GetStringsHeaderOffset() +
-                                  (kHeaderFields + index - 1) * kUInt32Size);
-  intptr_t start_offs = reader_.ReadUInt32();
-  intptr_t end_offs = reader_.ReadUInt32();
-  if (index == 0) {
-    // For the 0-th string we read a header field instead of end offset of
-    // the previous string.
-    start_offs = 0;
-  }
-
-  // Bytecode strings reside in ExternalTypedData which is not movable by GC,
-  // so it is OK to take a direct pointer to string characters even if
-  // symbol allocation triggers GC.
-  const uint8_t* data = reader_.BufferAt(
-      bytecode_component_->GetStringsContentsOffset() + start_offs);
-
-  if (is_canonical) {
-    if (isOneByteString) {
-      return Symbols::FromLatin1(thread_, data, end_offs - start_offs);
-    } else {
-      return Symbols::FromUTF16(thread_,
-                                reinterpret_cast<const uint16_t*>(data),
-                                (end_offs - start_offs) >> 1);
-    }
-  } else {
-    if (isOneByteString) {
-      return String::FromLatin1(data, end_offs - start_offs, Heap::kOld);
-    } else {
-      return String::FromUTF16(reinterpret_cast<const uint16_t*>(data),
-                               (end_offs - start_offs) >> 1, Heap::kOld);
-    }
-  }
-}
-
-ScriptPtr BytecodeReaderHelper::ReadSourceFile(const String& uri,
-                                               intptr_t offset) {
-  // SourceFile flags, must be in sync with SourceFile constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasLineStartsFlag = 1 << 0;
-  const int kHasSourceFlag = 1 << 1;
-
-  AlternativeReadingScope alt(&reader_, offset);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const String& import_uri = String::CheckedHandle(Z, ReadObject());
-
-  TypedData& line_starts = TypedData::Handle(Z);
-  if ((flags & kHasLineStartsFlag) != 0) {
-    // TODO(alexmarkov): read line starts only when needed.
-    const intptr_t line_starts_offset =
-        bytecode_component_->GetLineStartsOffset() + reader_.ReadUInt();
-
-    AlternativeReadingScope alt(&reader_, line_starts_offset);
-
-    const intptr_t num_line_starts = reader_.ReadUInt();
-    line_starts = reader_.ReadLineStartsData(num_line_starts);
-  }
-
-  String& source = String::Handle(Z);
-  if ((flags & kHasSourceFlag) != 0) {
-    source = ReadString(/* is_canonical = */ false);
-  }
-
-  const Script& script =
-      Script::Handle(Z, Script::New(import_uri, uri, source));
-  script.set_line_starts(line_starts);
-
-  if (source.IsNull() && line_starts.IsNull()) {
-    // This script provides a uri only, but no source or line_starts array.
-    // This could be a reference to a Script in another kernel binary.
-    // Make an attempt to find source and line starts when needed.
-    script.SetLazyLookupSourceAndLineStarts(true);
-  }
-
-  return script.raw();
-}
-
-TypeArgumentsPtr BytecodeReaderHelper::ReadTypeArguments() {
-  const bool is_recursive = reading_type_arguments_of_recursive_type_;
-  reading_type_arguments_of_recursive_type_ = false;
-  const intptr_t length = reader_.ReadUInt();
-  TypeArguments& type_arguments =
-      TypeArguments::ZoneHandle(Z, TypeArguments::New(length));
-  AbstractType& type = AbstractType::Handle(Z);
-  for (intptr_t i = 0; i < length; ++i) {
-    type ^= ReadObject();
-    type_arguments.SetTypeAt(i, type);
-  }
-  if (is_recursive) {
-    // Avoid canonicalization of type arguments of recursive type
-    // as not all TypeRef objects are filled up at this point.
-    // Type arguments will be canoncialized when the root recursive
-    // type is canonicalized.
-    ASSERT(pending_recursive_types_ != nullptr);
-    return type_arguments.raw();
-  }
-  return type_arguments.Canonicalize(thread_, nullptr);
-}
-
-void BytecodeReaderHelper::ReadAttributes(const Object& key) {
-  ASSERT(key.IsFunction() || key.IsField());
-  const auto& value = Object::Handle(Z, ReadObject());
-
-  Array& attributes =
-      Array::Handle(Z, I->object_store()->bytecode_attributes());
-  if (attributes.IsNull()) {
-    attributes = HashTables::New<BytecodeAttributesMap>(16, Heap::kOld);
-  }
-  BytecodeAttributesMap map(attributes.raw());
-  bool present = map.UpdateOrInsert(key, value);
-  ASSERT(!present);
-  I->object_store()->set_bytecode_attributes(map.Release());
-
-  if (key.IsField()) {
-    const Field& field = Field::Cast(key);
-    const auto& inferred_type_attr =
-        Array::CheckedHandle(Z, BytecodeReader::GetBytecodeAttribute(
-                                    key, Symbols::vm_inferred_type_metadata()));
-
-    if (!inferred_type_attr.IsNull() &&
-        (InferredTypeBytecodeAttribute::GetPCAt(inferred_type_attr, 0) ==
-         InferredTypeBytecodeAttribute::kFieldTypePC)) {
-      const InferredTypeMetadata type =
-          InferredTypeBytecodeAttribute::GetInferredTypeAt(
-              Z, inferred_type_attr, 0);
-      if (!type.IsTrivial()) {
-        field.set_guarded_cid(type.cid);
-        field.set_is_nullable(type.IsNullable());
-        field.set_guarded_list_length(Field::kNoFixedLength);
-      }
-    }
-  }
-}
-
-void BytecodeReaderHelper::ReadMembers(const Class& cls, bool discard_fields) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  ASSERT(cls.is_type_finalized());
-  ASSERT(!cls.is_loaded());
-
-  const intptr_t num_functions = reader_.ReadUInt();
-  functions_ = &Array::Handle(Z, Array::New(num_functions, Heap::kOld));
-  function_index_ = 0;
-
-  ReadFieldDeclarations(cls, discard_fields);
-  ReadFunctionDeclarations(cls);
-
-  cls.set_is_loaded(true);
-}
-
-void BytecodeReaderHelper::ReadFieldDeclarations(const Class& cls,
-                                                 bool discard_fields) {
-  // Field flags, must be in sync with FieldDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kHasNontrivialInitializerFlag = 1 << 0;
-  const int kHasGetterFlag = 1 << 1;
-  const int kHasSetterFlag = 1 << 2;
-  const int kIsReflectableFlag = 1 << 3;
-  const int kIsStaticFlag = 1 << 4;
-  const int kIsConstFlag = 1 << 5;
-  const int kIsFinalFlag = 1 << 6;
-  const int kIsCovariantFlag = 1 << 7;
-  const int kIsGenericCovariantImplFlag = 1 << 8;
-  const int kHasSourcePositionsFlag = 1 << 9;
-  const int kHasAnnotationsFlag = 1 << 10;
-  const int kHasPragmaFlag = 1 << 11;
-  const int kHasCustomScriptFlag = 1 << 12;
-  const int kHasInitializerCodeFlag = 1 << 13;
-  const int kHasAttributesFlag = 1 << 14;
-  const int kIsLateFlag = 1 << 15;
-  const int kIsExtensionMemberFlag = 1 << 16;
-  const int kHasInitializerFlag = 1 << 17;
-
-  const int num_fields = reader_.ReadListLength();
-  if ((num_fields == 0) && !cls.is_enum_class()) {
-    return;
-  }
-  const Array& fields = Array::Handle(
-      Z, Array::New(num_fields + (cls.is_enum_class() ? 1 : 0), Heap::kOld));
-  String& name = String::Handle(Z);
-  Object& script_class = Object::Handle(Z);
-  AbstractType& type = AbstractType::Handle(Z);
-  Field& field = Field::Handle(Z);
-  Instance& value = Instance::Handle(Z);
-  Function& function = Function::Handle(Z);
-
-  for (intptr_t i = 0; i < num_fields; ++i) {
-    intptr_t flags = reader_.ReadUInt();
-
-    const bool is_static = (flags & kIsStaticFlag) != 0;
-    const bool is_final = (flags & kIsFinalFlag) != 0;
-    const bool is_const = (flags & kIsConstFlag) != 0;
-    const bool is_late = (flags & kIsLateFlag) != 0;
-    const bool has_nontrivial_initializer =
-        (flags & kHasNontrivialInitializerFlag) != 0;
-    const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-    const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
-    const bool has_initializer = (flags & kHasInitializerFlag) != 0;
-
-    name ^= ReadObject();
-    type ^= ReadObject();
-
-    if ((flags & kHasCustomScriptFlag) != 0) {
-      Script& script = Script::CheckedHandle(Z, ReadObject());
-      script_class = GetPatchClass(cls, script);
-    } else {
-      script_class = cls.raw();
-    }
-
-    TokenPosition position = TokenPosition::kNoSource;
-    TokenPosition end_position = TokenPosition::kNoSource;
-    if ((flags & kHasSourcePositionsFlag) != 0) {
-      position = reader_.ReadPosition();
-      end_position = reader_.ReadPosition();
-    }
-
-    field = Field::New(name, is_static, is_final, is_const,
-                       (flags & kIsReflectableFlag) != 0, is_late, script_class,
-                       type, position, end_position);
-
-    field.set_is_declared_in_bytecode(true);
-    field.set_has_pragma(has_pragma);
-    field.set_is_covariant((flags & kIsCovariantFlag) != 0);
-    field.set_is_generic_covariant_impl((flags & kIsGenericCovariantImplFlag) !=
-                                        0);
-    field.set_has_nontrivial_initializer(has_nontrivial_initializer);
-    field.set_is_extension_member(is_extension_member);
-    field.set_has_initializer(has_initializer);
-
-    if (!has_nontrivial_initializer) {
-      value ^= ReadObject();
-      if (is_static) {
-        if (field.is_late() && !has_initializer) {
-          field.SetStaticValue(Object::sentinel(), true);
-        } else {
-          field.SetStaticValue(value, true);
-        }
-      } else {
-        field.set_saved_initial_value(value);
-        // Null-initialized instance fields are tracked separately for each
-        // constructor (see handling of kHasNullableFieldsFlag).
-        if (!value.IsNull()) {
-          // Note: optimizer relies on DoubleInitialized bit in its
-          // field-unboxing heuristics.
-          // See JitCallSpecializer::VisitStoreInstanceField for more details.
-          field.RecordStore(value);
-          if (value.IsDouble()) {
-            field.set_is_double_initialized(true);
-          }
-        }
-      }
-    }
-
-    if ((flags & kHasInitializerCodeFlag) != 0) {
-      const intptr_t code_offset = reader_.ReadUInt();
-      field.set_bytecode_offset(code_offset +
-                                bytecode_component_->GetCodesOffset());
-      if (is_static) {
-        field.SetStaticValue(Object::sentinel(), true);
-      }
-    }
-
-    if ((flags & kHasGetterFlag) != 0) {
-      name ^= ReadObject();
-      function = Function::New(name,
-                               is_static ? FunctionLayout::kImplicitStaticGetter
-                                         : FunctionLayout::kImplicitGetter,
-                               is_static, is_const,
-                               false,  // is_abstract
-                               false,  // is_external
-                               false,  // is_native
-                               script_class, position);
-      function.set_end_token_pos(end_position);
-      function.set_result_type(type);
-      function.set_is_debuggable(false);
-      function.set_accessor_field(field);
-      function.set_is_declared_in_bytecode(true);
-      function.set_is_extension_member(is_extension_member);
-      if (is_const && has_nontrivial_initializer) {
-        function.set_bytecode_offset(field.bytecode_offset());
-      }
-      H.SetupFieldAccessorFunction(cls, function, type);
-      functions_->SetAt(function_index_++, function);
-    }
-
-    if ((flags & kHasSetterFlag) != 0) {
-      ASSERT(is_late || ((!is_static) && (!is_final)));
-      ASSERT(!is_const);
-      name ^= ReadObject();
-      function = Function::New(name, FunctionLayout::kImplicitSetter, is_static,
-                               false,  // is_const
-                               false,  // is_abstract
-                               false,  // is_external
-                               false,  // is_native
-                               script_class, position);
-      function.set_end_token_pos(end_position);
-      function.set_result_type(Object::void_type());
-      function.set_is_debuggable(false);
-      function.set_accessor_field(field);
-      function.set_is_declared_in_bytecode(true);
-      function.set_is_extension_member(is_extension_member);
-      H.SetupFieldAccessorFunction(cls, function, type);
-      functions_->SetAt(function_index_++, function);
-    }
-
-    if ((flags & kHasAnnotationsFlag) != 0) {
-      intptr_t annotations_offset =
-          reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-      ASSERT(annotations_offset > 0);
-
-      if (FLAG_enable_mirrors || has_pragma) {
-        Library& library = Library::Handle(Z, cls.library());
-        library.AddFieldMetadata(field, TokenPosition::kNoSource, 0,
-                                 annotations_offset);
-        if (has_pragma) {
-          // TODO(alexmarkov): read annotations right away using
-          //  annotations_offset.
-          NoOOBMessageScope no_msg_scope(thread_);
-          NoReloadScope no_reload_scope(thread_->isolate(), thread_);
-          library.GetMetadata(field);
-        }
-      }
-    }
-
-    if ((flags & kHasAttributesFlag) != 0) {
-      ReadAttributes(field);
-    }
-
-    fields.SetAt(i, field);
-  }
-
-  if (cls.is_enum_class()) {
-    // Add static field 'const _deleted_enum_sentinel'.
-    field = Field::New(Symbols::_DeletedEnumSentinel(),
-                       /* is_static = */ true,
-                       /* is_final = */ true,
-                       /* is_const = */ true,
-                       /* is_reflectable = */ false,
-                       /* is_late = */ false, cls, Object::dynamic_type(),
-                       TokenPosition::kNoSource, TokenPosition::kNoSource);
-
-    fields.SetAt(num_fields, field);
-  }
-
-  if (!discard_fields) {
-    cls.SetFields(fields);
-  }
-
-  if (cls.IsTopLevel()) {
-    const Library& library = Library::Handle(Z, cls.library());
-    for (intptr_t i = 0, n = fields.Length(); i < n; ++i) {
-      field ^= fields.At(i);
-      name = field.name();
-      library.AddObject(field, name);
-    }
-  }
-}
-
-PatchClassPtr BytecodeReaderHelper::GetPatchClass(const Class& cls,
-                                                  const Script& script) {
-  if (patch_class_ != nullptr && patch_class_->patched_class() == cls.raw() &&
-      patch_class_->script() == script.raw()) {
-    return patch_class_->raw();
-  }
-  if (patch_class_ == nullptr) {
-    patch_class_ = &PatchClass::Handle(Z);
-  }
-  *patch_class_ = PatchClass::New(cls, script);
-  return patch_class_->raw();
-}
-
-void BytecodeReaderHelper::ReadFunctionDeclarations(const Class& cls) {
-  // Function flags, must be in sync with FunctionDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kIsConstructorFlag = 1 << 0;
-  const int kIsGetterFlag = 1 << 1;
-  const int kIsSetterFlag = 1 << 2;
-  const int kIsFactoryFlag = 1 << 3;
-  const int kIsStaticFlag = 1 << 4;
-  const int kIsAbstractFlag = 1 << 5;
-  const int kIsConstFlag = 1 << 6;
-  const int kHasOptionalPositionalParamsFlag = 1 << 7;
-  const int kHasOptionalNamedParamsFlag = 1 << 8;
-  const int kHasTypeParamsFlag = 1 << 9;
-  const int kIsReflectableFlag = 1 << 10;
-  const int kIsDebuggableFlag = 1 << 11;
-  const int kIsAsyncFlag = 1 << 12;
-  const int kIsAsyncStarFlag = 1 << 13;
-  const int kIsSyncStarFlag = 1 << 14;
-  // const int kIsForwardingStubFlag = 1 << 15;
-  const int kIsNoSuchMethodForwarderFlag = 1 << 16;
-  const int kIsNativeFlag = 1 << 17;
-  const int kIsExternalFlag = 1 << 18;
-  const int kHasSourcePositionsFlag = 1 << 19;
-  const int kHasAnnotationsFlag = 1 << 20;
-  const int kHasPragmaFlag = 1 << 21;
-  const int kHasCustomScriptFlag = 1 << 22;
-  const int kHasAttributesFlag = 1 << 23;
-  const int kIsExtensionMemberFlag = 1 << 24;
-  const int kHasParameterFlagsFlag = 1 << 25;
-
-  const intptr_t num_functions = reader_.ReadListLength();
-  ASSERT(function_index_ + num_functions == functions_->Length());
-
-  if (function_index_ + num_functions == 0) {
-    return;
-  }
-
-  String& name = String::Handle(Z);
-  Object& script_class = Object::Handle(Z);
-  Function& function = Function::Handle(Z);
-  Array& parameter_types = Array::Handle(Z);
-  AbstractType& type = AbstractType::Handle(Z);
-
-  name = cls.ScrubbedName();
-  const bool is_async_await_completer_owner =
-      Symbols::_AsyncAwaitCompleter().Equals(name);
-
-  for (intptr_t i = 0; i < num_functions; ++i) {
-    intptr_t flags = reader_.ReadUInt();
-
-    const bool is_static = (flags & kIsStaticFlag) != 0;
-    const bool is_factory = (flags & kIsFactoryFlag) != 0;
-    const bool is_native = (flags & kIsNativeFlag) != 0;
-    const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-    const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
-
-    name ^= ReadObject();
-
-    if ((flags & kHasCustomScriptFlag) != 0) {
-      Script& script = Script::CheckedHandle(Z, ReadObject());
-      script_class = GetPatchClass(cls, script);
-    } else {
-      script_class = cls.raw();
-    }
-
-    TokenPosition position = TokenPosition::kNoSource;
-    TokenPosition end_position = TokenPosition::kNoSource;
-    if ((flags & kHasSourcePositionsFlag) != 0) {
-      position = reader_.ReadPosition();
-      end_position = reader_.ReadPosition();
-    }
-
-    FunctionLayout::Kind kind = FunctionLayout::kRegularFunction;
-    if ((flags & kIsGetterFlag) != 0) {
-      kind = FunctionLayout::kGetterFunction;
-    } else if ((flags & kIsSetterFlag) != 0) {
-      kind = FunctionLayout::kSetterFunction;
-    } else if ((flags & (kIsConstructorFlag | kIsFactoryFlag)) != 0) {
-      kind = FunctionLayout::kConstructor;
-      name = ConstructorName(cls, name);
-    }
-
-    function = Function::New(name, kind, is_static, (flags & kIsConstFlag) != 0,
-                             (flags & kIsAbstractFlag) != 0,
-                             (flags & kIsExternalFlag) != 0, is_native,
-                             script_class, position);
-
-    const bool is_expression_evaluation =
-        (name.raw() == Symbols::DebugProcedureName().raw());
-
-    // Declare function scope as types (type parameters) in function
-    // signature may back-reference to the function being declared.
-    // At this moment, owner class is not fully loaded yet and it won't be
-    // able to serve function lookup requests.
-    FunctionScope function_scope(this, function, name, cls);
-
-    function.set_is_declared_in_bytecode(true);
-    function.set_has_pragma(has_pragma);
-    function.set_end_token_pos(end_position);
-    function.set_is_synthetic((flags & kIsNoSuchMethodForwarderFlag) != 0);
-    function.set_is_reflectable((flags & kIsReflectableFlag) != 0);
-    function.set_is_debuggable((flags & kIsDebuggableFlag) != 0);
-    function.set_is_extension_member(is_extension_member);
-
-    // _AsyncAwaitCompleter.start should be made non-visible in stack traces,
-    // since it is an implementation detail of our await/async desugaring.
-    if (is_async_await_completer_owner &&
-        Symbols::_AsyncAwaitStart().Equals(name)) {
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    }
-
-    if ((flags & kIsSyncStarFlag) != 0) {
-      function.set_modifier(FunctionLayout::kSyncGen);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    } else if ((flags & kIsAsyncFlag) != 0) {
-      function.set_modifier(FunctionLayout::kAsync);
-      function.set_is_inlinable(!FLAG_causal_async_stacks &&
-                                !FLAG_lazy_async_stacks);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    } else if ((flags & kIsAsyncStarFlag) != 0) {
-      function.set_modifier(FunctionLayout::kAsyncGen);
-      function.set_is_inlinable(!FLAG_causal_async_stacks &&
-                                !FLAG_lazy_async_stacks);
-      function.set_is_visible(!FLAG_causal_async_stacks &&
-                              !FLAG_lazy_async_stacks);
-    }
-
-    if ((flags & kHasTypeParamsFlag) != 0) {
-      ReadTypeParametersDeclaration(Class::Handle(Z), function);
-    }
-
-    const intptr_t num_implicit_params = (!is_static || is_factory) ? 1 : 0;
-    const intptr_t num_params = num_implicit_params + reader_.ReadUInt();
-
-    intptr_t num_required_params = num_params;
-    if ((flags & (kHasOptionalPositionalParamsFlag |
-                  kHasOptionalNamedParamsFlag)) != 0) {
-      num_required_params = num_implicit_params + reader_.ReadUInt();
-    }
-
-    function.set_num_fixed_parameters(num_required_params);
-    function.SetNumOptionalParameters(
-        num_params - num_required_params,
-        (flags & kHasOptionalNamedParamsFlag) == 0);
-
-    parameter_types = Array::New(num_params, Heap::kOld);
-    function.set_parameter_types(parameter_types);
-    function.CreateNameArrayIncludingFlags(Heap::kOld);
-
-    intptr_t param_index = 0;
-    if (!is_static) {
-      if (is_expression_evaluation) {
-        // Do not reference enclosing class as expression evaluation
-        // method logically belongs to another (real) class.
-        // Enclosing class is not registered and doesn't have
-        // a valid cid, so it can't be used in a type.
-        function.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
-      } else {
-        function.SetParameterTypeAt(param_index, H.GetDeclarationType(cls));
-      }
-      function.SetParameterNameAt(param_index, Symbols::This());
-      ++param_index;
-    } else if (is_factory) {
-      function.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
-      function.SetParameterNameAt(param_index,
-                                  Symbols::TypeArgumentsParameter());
-      ++param_index;
-    }
-
-    for (; param_index < num_params; ++param_index) {
-      name ^= ReadObject();
-      function.SetParameterNameAt(param_index, name);
-      type ^= ReadObject();
-      function.SetParameterTypeAt(param_index, type);
-    }
-
-    if ((flags & kHasParameterFlagsFlag) != 0) {
-      const intptr_t length = reader_.ReadUInt();
-      const intptr_t offset = function.NumImplicitParameters();
-      for (intptr_t i = 0; i < length; i++) {
-        const intptr_t param_flags = reader_.ReadUInt();
-        if ((param_flags & Parameter::kIsRequiredFlag) != 0) {
-          RELEASE_ASSERT(function.HasOptionalNamedParameters());
-          RELEASE_ASSERT(i + offset >= function.num_fixed_parameters());
-          function.SetIsRequiredAt(i + offset);
-        }
-      }
-    }
-    function.TruncateUnusedParameterFlags();
-
-    type ^= ReadObject();
-    function.set_result_type(type);
-
-    if (is_native) {
-      name ^= ReadObject();
-      function.set_native_name(name);
-    }
-
-    if ((flags & kIsAbstractFlag) == 0) {
-      const intptr_t code_offset = reader_.ReadUInt();
-      function.set_bytecode_offset(code_offset +
-                                   bytecode_component_->GetCodesOffset());
-    }
-
-    if ((flags & kHasAnnotationsFlag) != 0) {
-      const intptr_t annotations_offset =
-          reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-      ASSERT(annotations_offset > 0);
-
-      if (FLAG_enable_mirrors || has_pragma) {
-        Library& library = Library::Handle(Z, cls.library());
-        library.AddFunctionMetadata(function, TokenPosition::kNoSource, 0,
-                                    annotations_offset);
-
-        if (has_pragma) {
-          if (H.constants().IsNull() &&
-              library.raw() == Library::CoreLibrary()) {
-            // Bootstrapping, need to postpone evaluation of pragma annotations
-            // as classes are not fully loaded/finalized yet.
-            const auto& pragma_funcs = GrowableObjectArray::Handle(
-                Z, H.EnsurePotentialPragmaFunctions());
-            pragma_funcs.Add(function);
-          } else {
-            // TODO(alexmarkov): read annotations right away using
-            //  annotations_offset.
-            Thread* thread = H.thread();
-            NoOOBMessageScope no_msg_scope(thread);
-            NoReloadScope no_reload_scope(thread->isolate(), thread);
-            library.GetMetadata(function);
-          }
-        }
-      }
-    }
-
-    if ((flags & kHasAttributesFlag) != 0) {
-      ASSERT(!is_expression_evaluation);
-      ReadAttributes(function);
-    }
-
-    if (is_expression_evaluation) {
-      H.SetExpressionEvaluationFunction(function);
-      // Read bytecode of expression evaluation function eagerly,
-      // while expression_evaluation_library_ and FunctionScope
-      // are still set, as its constant pool may reference back to a library
-      // or a function which are not registered and cannot be looked up.
-      ASSERT(!function.is_abstract());
-      ASSERT(function.bytecode_offset() != 0);
-      // Replace class of the function in scope as we're going to look for
-      // expression evaluation function in a real class.
-      if (!cls.IsTopLevel()) {
-        scoped_function_class_ = H.GetExpressionEvaluationRealClass();
-      }
-      CompilerState compiler_state(thread_, FLAG_precompiled_mode);
-      ReadCode(function, function.bytecode_offset());
-    }
-
-    functions_->SetAt(function_index_++, function);
-  }
-
-  {
-    Thread* thread = Thread::Current();
-    SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
-    cls.SetFunctions(*functions_);
-  }
-
-  if (cls.IsTopLevel()) {
-    const Library& library = Library::Handle(Z, cls.library());
-    for (intptr_t i = 0, n = functions_->Length(); i < n; ++i) {
-      function ^= functions_->At(i);
-      name = function.name();
-      library.AddObject(function, name);
-    }
-  }
-
-  functions_ = nullptr;
-}
-
-void BytecodeReaderHelper::LoadReferencedClass(const Class& cls) {
-  ASSERT(!cls.is_declaration_loaded());
-
-  if (!cls.is_declared_in_bytecode()) {
-    cls.EnsureDeclarationLoaded();
-    return;
-  }
-
-  const auto& script = Script::Handle(Z, cls.script());
-  if (H.GetKernelProgramInfo().raw() != script.kernel_program_info()) {
-    // Class comes from a different binary.
-    cls.EnsureDeclarationLoaded();
-    return;
-  }
-
-  // We can reuse current BytecodeReaderHelper.
-  ActiveClassScope active_class_scope(active_class_, &cls);
-  AlternativeReadingScope alt(&reader_, cls.bytecode_offset());
-  ReadClassDeclaration(cls);
-}
-
-void BytecodeReaderHelper::ReadClassDeclaration(const Class& cls) {
-  // Class flags, must be in sync with ClassDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kIsAbstractFlag = 1 << 0;
-  const int kIsEnumFlag = 1 << 1;
-  const int kHasTypeParamsFlag = 1 << 2;
-  const int kHasTypeArgumentsFlag = 1 << 3;
-  const int kIsTransformedMixinApplicationFlag = 1 << 4;
-  const int kHasSourcePositionsFlag = 1 << 5;
-  const int kHasAnnotationsFlag = 1 << 6;
-  const int kHasPragmaFlag = 1 << 7;
-
-  // Class is allocated when reading library declaration in
-  // BytecodeReaderHelper::ReadLibraryDeclaration.
-  // Its cid is set in Class::New / Isolate::RegisterClass /
-  // ClassTable::Register, unless it was loaded for expression evaluation.
-  ASSERT(cls.is_declared_in_bytecode());
-  ASSERT(!cls.is_declaration_loaded() || loading_native_wrappers_library_);
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_pragma = (flags & kHasPragmaFlag) != 0;
-
-  // Set early to enable access to type_parameters().
-  // TODO(alexmarkov): revise early stamping of native wrapper classes
-  //  as loaded.
-  if (!cls.is_declaration_loaded()) {
-    cls.set_is_declaration_loaded();
-  }
-
-  const auto& script = Script::CheckedHandle(Z, ReadObject());
-  cls.set_script(script);
-
-  TokenPosition position = TokenPosition::kNoSource;
-  TokenPosition end_position = TokenPosition::kNoSource;
-  if ((flags & kHasSourcePositionsFlag) != 0) {
-    position = reader_.ReadPosition();
-    end_position = reader_.ReadPosition();
-    cls.set_token_pos(position);
-    cls.set_end_token_pos(end_position);
-  }
-
-  cls.set_has_pragma(has_pragma);
-
-  if ((flags & kIsAbstractFlag) != 0) {
-    cls.set_is_abstract();
-  }
-  if ((flags & kIsEnumFlag) != 0) {
-    cls.set_is_enum_class();
-  }
-  if ((flags & kIsTransformedMixinApplicationFlag) != 0) {
-    cls.set_is_transformed_mixin_application();
-  }
-
-  intptr_t num_type_arguments = 0;
-  if ((flags & kHasTypeArgumentsFlag) != 0) {
-    num_type_arguments = reader_.ReadUInt();
-  }
-  cls.set_num_type_arguments(num_type_arguments);
-
-  if ((flags & kHasTypeParamsFlag) != 0) {
-    ReadTypeParametersDeclaration(cls, Function::null_function());
-  }
-
-  auto& type = AbstractType::CheckedHandle(Z, ReadObject());
-  cls.set_super_type(type);
-
-  const intptr_t num_interfaces = reader_.ReadUInt();
-  if (num_interfaces > 0) {
-    const auto& interfaces =
-        Array::Handle(Z, Array::New(num_interfaces, Heap::kOld));
-    for (intptr_t i = 0; i < num_interfaces; ++i) {
-      type ^= ReadObject();
-      interfaces.SetAt(i, type);
-    }
-    cls.set_interfaces(interfaces);
-  }
-
-  if ((flags & kHasAnnotationsFlag) != 0) {
-    intptr_t annotations_offset =
-        reader_.ReadUInt() + bytecode_component_->GetAnnotationsOffset();
-    ASSERT(annotations_offset > 0);
-
-    if (FLAG_enable_mirrors || has_pragma) {
-      const auto& library = Library::Handle(Z, cls.library());
-      if (cls.IsTopLevel()) {
-        ASSERT(!has_pragma);
-        library.AddLibraryMetadata(cls, TokenPosition::kNoSource, 0,
-                                   annotations_offset);
-      } else {
-        const auto& top_level_class =
-            Class::Handle(Z, library.toplevel_class());
-
-        library.AddClassMetadata(cls, top_level_class, TokenPosition::kNoSource,
-                                 0, annotations_offset);
-      }
-    }
-  }
-
-  const intptr_t members_offset = reader_.ReadUInt();
-  cls.set_bytecode_offset(members_offset +
-                          bytecode_component_->GetMembersOffset());
-
-  // All types are finalized if loading from bytecode.
-  // TODO(alexmarkov): revise early stamping of native wrapper classes
-  //  as type-finalized.
-  if (!cls.is_type_finalized()) {
-    cls.set_is_type_finalized();
-  }
-
-  // Avoid registering expression evaluation class in a hierarchy, as
-  // it doesn't have cid and shouldn't be found when enumerating subclasses.
-  if (expression_evaluation_library_ == nullptr) {
-    // TODO(alexmarkov): move this to class finalization.
-    ClassFinalizer::RegisterClassInHierarchy(Z, cls);
-  }
-}
-
-void BytecodeReaderHelper::ReadLibraryDeclaration(const Library& library,
-                                                  bool lookup_classes) {
-  // Library flags, must be in sync with LibraryDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  const int kUsesDartMirrorsFlag = 1 << 0;
-  const int kUsesDartFfiFlag = 1 << 1;
-  const int kHasExtensionsFlag = 1 << 2;
-  const int kIsNonNullableByDefaultFlag = 1 << 3;
-
-  ASSERT(library.is_declared_in_bytecode());
-  ASSERT(!library.Loaded());
-  ASSERT(library.toplevel_class() == Object::null());
-
-  // TODO(alexmarkov): fill in library.used_scripts.
-
-  const intptr_t flags = reader_.ReadUInt();
-  if (((flags & kUsesDartMirrorsFlag) != 0) && !FLAG_enable_mirrors) {
-    H.ReportError(
-        "import of dart:mirrors is not supported in the current Dart runtime");
-  }
-  if (((flags & kUsesDartFfiFlag) != 0) && !Api::IsFfiEnabled()) {
-    H.ReportError(
-        "import of dart:ffi is not supported in the current Dart runtime");
-  }
-
-  auto& name = String::CheckedHandle(Z, ReadObject());
-  library.SetName(name);
-
-  const auto& script = Script::CheckedHandle(Z, ReadObject());
-
-  if ((flags & kHasExtensionsFlag) != 0) {
-    const intptr_t num_extensions = reader_.ReadUInt();
-    auto& import_namespace = Namespace::Handle(Z);
-    auto& native_library = Library::Handle(Z);
-    for (intptr_t i = 0; i < num_extensions; ++i) {
-      name ^= ReadObject();
-      ASSERT(name.StartsWith(Symbols::DartExtensionScheme()));
-
-      // Create a dummy library and add it as an import to the current library.
-      // Actual loading occurs in KernelLoader::LoadNativeExtensionLibraries().
-      // This also allows later to discover and reload this native extension,
-      // e.g. when running from an app-jit snapshot.
-      // See Loader::ReloadNativeExtensions(...) which relies on
-      // Dart_GetImportsOfScheme('dart-ext').
-      native_library = Library::New(name);
-      import_namespace = Namespace::New(native_library, Array::null_array(),
-                                        Array::null_array());
-      library.AddImport(import_namespace);
-    }
-    H.AddPotentialExtensionLibrary(library);
-  }
-
-  if ((flags & kIsNonNullableByDefaultFlag) != 0) {
-    library.set_is_nnbd(true);
-  }
-
-  // The bootstrapper will take care of creating the native wrapper classes,
-  // but we will add the synthetic constructors to them here.
-  if (name.raw() ==
-      Symbols::Symbol(Symbols::kDartNativeWrappersLibNameId).raw()) {
-    ASSERT(library.LoadInProgress());
-    loading_native_wrappers_library_ = true;
-  } else {
-    loading_native_wrappers_library_ = false;
-    library.SetLoadInProgress();
-  }
-
-  const bool register_class = !IsExpressionEvaluationLibrary(library);
-
-  const intptr_t num_classes = reader_.ReadUInt();
-  ASSERT(num_classes > 0);
-  auto& cls = Class::Handle(Z);
-
-  for (intptr_t i = 0; i < num_classes; ++i) {
-    name ^= ReadObject();
-    const intptr_t class_offset =
-        bytecode_component_->GetClassesOffset() + reader_.ReadUInt();
-
-    if (i == 0) {
-      ASSERT(name.raw() == Symbols::Empty().raw());
-      cls = Class::New(library, Symbols::TopLevel(), script,
-                       TokenPosition::kNoSource, register_class);
-      library.set_toplevel_class(cls);
-    } else {
-      if (lookup_classes) {
-        cls = library.LookupLocalClass(name);
-      }
-      if (lookup_classes && !cls.IsNull()) {
-        ASSERT(!cls.is_declaration_loaded() ||
-               loading_native_wrappers_library_);
-        cls.set_script(script);
-      } else {
-        cls = Class::New(library, name, script, TokenPosition::kNoSource,
-                         register_class);
-        if (register_class) {
-          library.AddClass(cls);
-        }
-      }
-    }
-
-    cls.set_is_declared_in_bytecode(true);
-    cls.set_bytecode_offset(class_offset);
-
-    if (loading_native_wrappers_library_ || !register_class) {
-      AlternativeReadingScope alt(&reader_, class_offset);
-      ReadClassDeclaration(cls);
-      ActiveClassScope active_class_scope(active_class_, &cls);
-      AlternativeReadingScope alt2(&reader_, cls.bytecode_offset());
-      ReadMembers(cls, /* discard_fields = */ false);
-    }
-  }
-
-  ASSERT(!library.Loaded());
-  library.SetLoaded();
-
-  loading_native_wrappers_library_ = false;
-}
-
-void BytecodeReaderHelper::ReadLibraryDeclarations(intptr_t num_libraries) {
-  auto& library = Library::Handle(Z);
-  auto& uri = String::Handle(Z);
-
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    const intptr_t library_offset =
-        bytecode_component_->GetLibrariesOffset() + reader_.ReadUInt();
-
-    if (!FLAG_precompiled_mode && !I->should_load_vmservice()) {
-      if (uri.raw() == Symbols::DartVMServiceIO().raw()) {
-        continue;
-      }
-    }
-
-    bool lookup_classes = true;
-    library = Library::LookupLibrary(thread_, uri);
-    if (library.IsNull()) {
-      lookup_classes = false;
-      library = Library::New(uri);
-
-      if (uri.raw() == Symbols::EvalSourceUri().raw()) {
-        ASSERT(expression_evaluation_library_ == nullptr);
-        expression_evaluation_library_ = &Library::Handle(Z, library.raw());
-      } else {
-        library.Register(thread_);
-      }
-    }
-
-    if (library.Loaded()) {
-      continue;
-    }
-
-    library.set_is_declared_in_bytecode(true);
-    library.set_bytecode_offset(library_offset);
-
-    AlternativeReadingScope alt(&reader_, library_offset);
-    ReadLibraryDeclaration(library, lookup_classes);
-  }
-}
-
-void BytecodeReaderHelper::FindAndReadSpecificLibrary(const Library& library,
-                                                      intptr_t num_libraries) {
-  auto& uri = String::Handle(Z);
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    const intptr_t library_offset =
-        bytecode_component_->GetLibrariesOffset() + reader_.ReadUInt();
-
-    if (uri.raw() == library.url()) {
-      library.set_is_declared_in_bytecode(true);
-      library.set_bytecode_offset(library_offset);
-
-      AlternativeReadingScope alt(&reader_, library_offset);
-      ReadLibraryDeclaration(library, /* lookup_classes = */ true);
-      return;
-    }
-  }
-}
-
-void BytecodeReaderHelper::FindModifiedLibrariesForHotReload(
-    BitVector* modified_libs,
-    intptr_t num_libraries) {
-  auto& uri = String::Handle(Z);
-  auto& lib = Library::Handle(Z);
-  for (intptr_t i = 0; i < num_libraries; ++i) {
-    uri ^= ReadObject();
-    reader_.ReadUInt();  // Skip offset.
-
-    lib = Library::LookupLibrary(thread_, uri);
-    if (!lib.IsNull() && !lib.is_dart_scheme()) {
-      // This is a library that already exists so mark it as being modified.
-      modified_libs->Add(lib.index());
-    }
-  }
-}
-
-void BytecodeReaderHelper::ReadParameterCovariance(
-    const Function& function,
-    BitVector* is_covariant,
-    BitVector* is_generic_covariant_impl) {
-  ASSERT(function.is_declared_in_bytecode());
-
-  const intptr_t num_params = function.NumParameters();
-  ASSERT(is_covariant->length() == num_params);
-  ASSERT(is_generic_covariant_impl->length() == num_params);
-
-  AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-
-  const intptr_t code_flags = reader_.ReadUInt();
-  if ((code_flags & Code::kHasParameterFlagsFlag) != 0) {
-    const intptr_t num_explicit_params = reader_.ReadUInt();
-    ASSERT(num_params ==
-           function.NumImplicitParameters() + num_explicit_params);
-
-    for (intptr_t i = function.NumImplicitParameters(); i < num_params; ++i) {
-      const intptr_t flags = reader_.ReadUInt();
-
-      if ((flags & Parameter::kIsCovariantFlag) != 0) {
-        is_covariant->Add(i);
-      }
-      if ((flags & Parameter::kIsGenericCovariantImplFlag) != 0) {
-        is_generic_covariant_impl->Add(i);
-      }
-    }
-  }
-}
-
-ObjectPtr BytecodeReaderHelper::BuildParameterDescriptor(
-    const Function& function) {
-  ASSERT(function.is_declared_in_bytecode());
-
-  Object& result = Object::Handle(Z);
-  if (!function.HasBytecode()) {
-    result = BytecodeReader::ReadFunctionBytecode(Thread::Current(), function);
-    if (result.IsError()) {
-      return result.raw();
-    }
-  }
-
-  const intptr_t num_params = function.NumParameters();
-  const intptr_t num_implicit_params = function.NumImplicitParameters();
-  const intptr_t num_explicit_params = num_params - num_implicit_params;
-  const Array& descriptor = Array::Handle(
-      Z, Array::New(num_explicit_params * Parser::kParameterEntrySize));
-
-  // 1. Find isFinal in the Code declaration.
-  bool found_final = false;
-  if (!function.is_abstract()) {
-    AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-    const intptr_t code_flags = reader_.ReadUInt();
-
-    if ((code_flags & Code::kHasParameterFlagsFlag) != 0) {
-      const intptr_t num_explicit_params_written = reader_.ReadUInt();
-      ASSERT(num_explicit_params == num_explicit_params_written);
-      for (intptr_t i = 0; i < num_explicit_params; ++i) {
-        const intptr_t flags = reader_.ReadUInt();
-        descriptor.SetAt(
-            i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
-            Bool::Get((flags & Parameter::kIsFinalFlag) != 0));
-      }
-      found_final = true;
-    }
-  }
-  if (!found_final) {
-    for (intptr_t i = 0; i < num_explicit_params; ++i) {
-      descriptor.SetAt(
-          i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
-          Bool::Get(false));
-    }
-  }
-
-  // 2. Find metadata implicitly after the function declaration's metadata.
-  const Class& klass = Class::Handle(Z, function.Owner());
-  const Library& library = Library::Handle(Z, klass.library());
-  const Object& metadata = Object::Handle(
-      Z, library.GetExtendedMetadata(function, num_explicit_params));
-  if (metadata.IsError()) {
-    return metadata.raw();
-  }
-  if (Array::Cast(metadata).Length() != 0) {
-    for (intptr_t i = 0; i < num_explicit_params; i++) {
-      result = Array::Cast(metadata).At(i);
-      descriptor.SetAt(
-          i * Parser::kParameterEntrySize + Parser::kParameterMetadataOffset,
-          result);
-    }
-  }
-
-  // 3. Find the defaultValues in the EntryOptional sequence.
-  if (!function.is_abstract()) {
-    const Bytecode& bytecode = Bytecode::Handle(Z, function.bytecode());
-    ASSERT(!bytecode.IsNull());
-    const ObjectPool& constants = ObjectPool::Handle(Z, bytecode.object_pool());
-    ASSERT(!constants.IsNull());
-    const KBCInstr* instr =
-        reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-    if (KernelBytecode::IsEntryOptionalOpcode(instr)) {
-      // Note that number of fixed parameters may not match 'A' operand of
-      // EntryOptional bytecode as [function] could be an implicit closure
-      // function with an extra implicit argument, while bytecode corresponds
-      // to a static function without any implicit arguments.
-      const intptr_t num_fixed_params = function.num_fixed_parameters();
-      const intptr_t num_opt_pos_params = KernelBytecode::DecodeB(instr);
-      const intptr_t num_opt_named_params = KernelBytecode::DecodeC(instr);
-      instr = KernelBytecode::Next(instr);
-      ASSERT(num_opt_pos_params == function.NumOptionalPositionalParameters());
-      ASSERT(num_opt_named_params == function.NumOptionalNamedParameters());
-      ASSERT((num_opt_pos_params == 0) || (num_opt_named_params == 0));
-
-      for (intptr_t i = 0; i < num_opt_pos_params; i++) {
-        const KBCInstr* load_value_instr = instr;
-        instr = KernelBytecode::Next(instr);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
-        descriptor.SetAt((num_fixed_params - num_implicit_params + i) *
-                                 Parser::kParameterEntrySize +
-                             Parser::kParameterDefaultValueOffset,
-                         result);
-      }
-      for (intptr_t i = 0; i < num_opt_named_params; i++) {
-        const KBCInstr* load_name_instr = instr;
-        const KBCInstr* load_value_instr =
-            KernelBytecode::Next(load_name_instr);
-        instr = KernelBytecode::Next(load_value_instr);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_name_instr));
-        intptr_t param_index;
-        for (param_index = num_fixed_params; param_index < num_params;
-             param_index++) {
-          if (function.ParameterNameAt(param_index) == result.raw()) {
-            break;
-          }
-        }
-        ASSERT(param_index < num_params);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
-        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
-        descriptor.SetAt(
-            (param_index - num_implicit_params) * Parser::kParameterEntrySize +
-                Parser::kParameterDefaultValueOffset,
-            result);
-      }
-    }
-  }
-
-  return descriptor.raw();
-}
-
-void BytecodeReaderHelper::ParseBytecodeFunction(
-    ParsedFunction* parsed_function,
-    const Function& function) {
-  // Handle function kinds which don't have a user-defined body first.
-  switch (function.kind()) {
-    case FunctionLayout::kImplicitClosureFunction:
-      ParseForwarderFunction(parsed_function, function,
-                             Function::Handle(Z, function.parent_function()));
-      return;
-    case FunctionLayout::kDynamicInvocationForwarder:
-      ParseForwarderFunction(parsed_function, function,
-                             Function::Handle(Z, function.ForwardingTarget()));
-      return;
-    case FunctionLayout::kImplicitGetter:
-    case FunctionLayout::kImplicitSetter:
-    case FunctionLayout::kMethodExtractor:
-      BytecodeScopeBuilder(parsed_function).BuildScopes();
-      return;
-    case FunctionLayout::kImplicitStaticGetter: {
-      if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
-        break;
-      } else {
-        BytecodeScopeBuilder(parsed_function).BuildScopes();
-        return;
-      }
-    }
-    case FunctionLayout::kRegularFunction:
-    case FunctionLayout::kGetterFunction:
-    case FunctionLayout::kSetterFunction:
-    case FunctionLayout::kClosureFunction:
-    case FunctionLayout::kConstructor:
-    case FunctionLayout::kFieldInitializer:
-      break;
-    case FunctionLayout::kNoSuchMethodDispatcher:
-    case FunctionLayout::kInvokeFieldDispatcher:
-    case FunctionLayout::kSignatureFunction:
-    case FunctionLayout::kIrregexpFunction:
-    case FunctionLayout::kFfiTrampoline:
-      UNREACHABLE();
-      break;
-  }
-
-  // We only reach here if function has a bytecode body. Make sure it is
-  // loaded and collect information about covariant parameters.
-
-  if (!function.HasBytecode()) {
-    ReadCode(function, function.bytecode_offset());
-    ASSERT(function.HasBytecode());
-  }
-
-  // TODO(alexmarkov): simplify access to covariant / generic_covariant_impl
-  //  flags of parameters so we won't need to read them separately.
-  if (!parsed_function->HasCovariantParametersInfo()) {
-    const intptr_t num_params = function.NumParameters();
-    BitVector* covariant_parameters = new (Z) BitVector(Z, num_params);
-    BitVector* generic_covariant_impl_parameters =
-        new (Z) BitVector(Z, num_params);
-    ReadParameterCovariance(function, covariant_parameters,
-                            generic_covariant_impl_parameters);
-    parsed_function->SetCovariantParameters(covariant_parameters);
-    parsed_function->SetGenericCovariantImplParameters(
-        generic_covariant_impl_parameters);
-  }
-}
-
-void BytecodeReaderHelper::ParseForwarderFunction(
-    ParsedFunction* parsed_function,
-    const Function& function,
-    const Function& target) {
-  ASSERT(function.IsImplicitClosureFunction() ||
-         function.IsDynamicInvocationForwarder());
-
-  ASSERT(target.is_declared_in_bytecode());
-
-  if (function.IsDynamicInvocationForwarder() &&
-      target.IsImplicitSetterFunction()) {
-    BytecodeScopeBuilder(parsed_function).BuildScopes();
-    return;
-  }
-
-  if (!target.HasBytecode()) {
-    ReadCode(target, target.bytecode_offset());
-  }
-
-  BytecodeScopeBuilder(parsed_function).BuildScopes();
-
-  const auto& target_bytecode = Bytecode::Handle(Z, target.bytecode());
-  const auto& obj_pool = ObjectPool::Handle(Z, target_bytecode.object_pool());
-
-  AlternativeReadingScope alt(&reader_, target.bytecode_offset());
-
-  const intptr_t flags = reader_.ReadUInt();
-  const bool has_parameter_flags = (flags & Code::kHasParameterFlagsFlag) != 0;
-  const bool has_forwarding_stub_target =
-      (flags & Code::kHasForwardingStubTargetFlag) != 0;
-  const bool has_default_function_type_args =
-      (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-  const auto proc_attrs = kernel::ProcedureAttributesOf(target, Z);
-  // TODO(alexmarkov): fix building of flow graph for implicit closures so
-  // it would include missing checks and remove 'proc_attrs.has_tearoff_uses'
-  // from this condition.
-  const bool body_has_generic_covariant_impl_type_checks =
-      proc_attrs.has_non_this_uses || proc_attrs.has_tearoff_uses;
-
-  if (has_parameter_flags) {
-    const intptr_t num_params = reader_.ReadUInt();
-    const intptr_t num_implicit_params = function.NumImplicitParameters();
-    for (intptr_t i = 0; i < num_params; ++i) {
-      const intptr_t flags = reader_.ReadUInt();
-
-      bool is_covariant = (flags & Parameter::kIsCovariantFlag) != 0;
-      bool is_generic_covariant_impl =
-          (flags & Parameter::kIsGenericCovariantImplFlag) != 0;
-
-      LocalVariable* variable =
-          parsed_function->ParameterVariable(num_implicit_params + i);
-
-      if (is_covariant) {
-        variable->set_is_explicit_covariant_parameter();
-      }
-
-      const bool checked_in_method_body =
-          is_covariant || (is_generic_covariant_impl &&
-                           body_has_generic_covariant_impl_type_checks);
-
-      if (checked_in_method_body) {
-        variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
-      } else {
-        ASSERT(variable->type_check_mode() == LocalVariable::kDoTypeCheck);
-      }
-    }
-  }
-
-  if (has_forwarding_stub_target) {
-    const intptr_t cp_index = reader_.ReadUInt();
-    const auto& forwarding_stub_target =
-        Function::CheckedZoneHandle(Z, obj_pool.ObjectAt(cp_index));
-    parsed_function->MarkForwardingStub(&forwarding_stub_target);
-  }
-
-  if (has_default_function_type_args) {
-    ASSERT(function.IsGeneric());
-    const intptr_t cp_index = reader_.ReadUInt();
-    const auto& type_args =
-        TypeArguments::CheckedHandle(Z, obj_pool.ObjectAt(cp_index));
-    // In bytecode mode, all type parameters are created with a default
-    // argument of dynamic, so only need to update if not the all-dynamic TAV.
-    if (!type_args.IsNull()) {
-      auto& type_params = TypeArguments::Handle(Z, function.type_parameters());
-      ASSERT_EQUAL(type_params.Length(), type_args.Length());
-      auto& param = TypeParameter::Handle(Z);
-      auto& type = AbstractType::Handle(Z);
-      for (intptr_t i = 0; i < type_params.Length(); i++) {
-        param ^= type_params.TypeAt(i);
-        type = type_args.TypeAt(i);
-        param.set_default_argument(type);
-      }
-      function.UpdateCachedDefaultTypeArguments(thread_);
-    }
-  }
-
-  if (function.HasOptionalParameters()) {
-    const KBCInstr* raw_bytecode =
-        reinterpret_cast<const KBCInstr*>(target_bytecode.PayloadStart());
-    const KBCInstr* entry = raw_bytecode;
-    raw_bytecode = KernelBytecode::Next(raw_bytecode);
-    ASSERT(KernelBytecode::IsEntryOptionalOpcode(entry));
-    ASSERT(KernelBytecode::DecodeB(entry) ==
-           function.NumOptionalPositionalParameters());
-    ASSERT(KernelBytecode::DecodeC(entry) ==
-           function.NumOptionalNamedParameters());
-
-    const intptr_t num_opt_params = function.NumOptionalParameters();
-    ZoneGrowableArray<const Instance*>* default_values =
-        new (Z) ZoneGrowableArray<const Instance*>(Z, num_opt_params);
-
-    if (function.HasOptionalPositionalParameters()) {
-      for (intptr_t i = 0, n = function.NumOptionalPositionalParameters();
-           i < n; ++i) {
-        const KBCInstr* load = raw_bytecode;
-        raw_bytecode = KernelBytecode::Next(raw_bytecode);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load));
-        const auto& value = Instance::CheckedZoneHandle(
-            Z, obj_pool.ObjectAt(KernelBytecode::DecodeE(load)));
-        default_values->Add(&value);
-      }
-    } else {
-      const intptr_t num_fixed_params = function.num_fixed_parameters();
-      auto& param_name = String::Handle(Z);
-      default_values->EnsureLength(num_opt_params, nullptr);
-      for (intptr_t i = 0; i < num_opt_params; ++i) {
-        const KBCInstr* load_name = raw_bytecode;
-        const KBCInstr* load_value = KernelBytecode::Next(load_name);
-        raw_bytecode = KernelBytecode::Next(load_value);
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-        param_name ^= obj_pool.ObjectAt(KernelBytecode::DecodeE(load_name));
-        const auto& value = Instance::CheckedZoneHandle(
-            Z, obj_pool.ObjectAt(KernelBytecode::DecodeE(load_value)));
-
-        const intptr_t num_params = function.NumParameters();
-        intptr_t param_index = num_fixed_params;
-        for (; param_index < num_params; ++param_index) {
-          if (function.ParameterNameAt(param_index) == param_name.raw()) {
-            break;
-          }
-        }
-        ASSERT(param_index < num_params);
-        ASSERT(default_values->At(param_index - num_fixed_params) == nullptr);
-        (*default_values)[param_index - num_fixed_params] = &value;
-      }
-    }
-
-    parsed_function->set_default_parameter_values(default_values);
-  }
-}
-
-LibraryPtr BytecodeReaderHelper::ReadMain() {
-  return Library::RawCast(ReadObject());
-}
-
-intptr_t BytecodeComponentData::GetVersion() const {
-  return Smi::Value(Smi::RawCast(data_.At(kVersion)));
-}
-
-intptr_t BytecodeComponentData::GetStringsHeaderOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kStringsHeaderOffset)));
-}
-
-intptr_t BytecodeComponentData::GetStringsContentsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kStringsContentsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetObjectOffsetsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kObjectOffsetsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumObjects() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumObjects)));
-}
-
-intptr_t BytecodeComponentData::GetObjectsContentsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kObjectsContentsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetMainOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kMainOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumLibraries() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumLibraries)));
-}
-
-intptr_t BytecodeComponentData::GetLibraryIndexOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLibraryIndexOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLibrariesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLibrariesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumClasses() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumClasses)));
-}
-
-intptr_t BytecodeComponentData::GetClassesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kClassesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetMembersOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kMembersOffset)));
-}
-
-intptr_t BytecodeComponentData::GetNumCodes() const {
-  return Smi::Value(Smi::RawCast(data_.At(kNumCodes)));
-}
-
-intptr_t BytecodeComponentData::GetCodesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kCodesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetSourcePositionsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kSourcePositionsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetSourceFilesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kSourceFilesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLineStartsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLineStartsOffset)));
-}
-
-intptr_t BytecodeComponentData::GetLocalVariablesOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kLocalVariablesOffset)));
-}
-
-intptr_t BytecodeComponentData::GetAnnotationsOffset() const {
-  return Smi::Value(Smi::RawCast(data_.At(kAnnotationsOffset)));
-}
-
-void BytecodeComponentData::SetObject(intptr_t index, const Object& obj) const {
-  data_.SetAt(kNumFields + index, obj);
-}
-
-ObjectPtr BytecodeComponentData::GetObject(intptr_t index) const {
-  return data_.At(kNumFields + index);
-}
-
-ArrayPtr BytecodeComponentData::New(Zone* zone,
-                                    intptr_t version,
-                                    intptr_t num_objects,
-                                    intptr_t strings_header_offset,
-                                    intptr_t strings_contents_offset,
-                                    intptr_t object_offsets_offset,
-                                    intptr_t objects_contents_offset,
-                                    intptr_t main_offset,
-                                    intptr_t num_libraries,
-                                    intptr_t library_index_offset,
-                                    intptr_t libraries_offset,
-                                    intptr_t num_classes,
-                                    intptr_t classes_offset,
-                                    intptr_t members_offset,
-                                    intptr_t num_codes,
-                                    intptr_t codes_offset,
-                                    intptr_t source_positions_offset,
-                                    intptr_t source_files_offset,
-                                    intptr_t line_starts_offset,
-                                    intptr_t local_variables_offset,
-                                    intptr_t annotations_offset,
-                                    Heap::Space space) {
-  const Array& data =
-      Array::Handle(zone, Array::New(kNumFields + num_objects, space));
-  Smi& smi_handle = Smi::Handle(zone);
-
-  smi_handle = Smi::New(version);
-  data.SetAt(kVersion, smi_handle);
-
-  smi_handle = Smi::New(strings_header_offset);
-  data.SetAt(kStringsHeaderOffset, smi_handle);
-
-  smi_handle = Smi::New(strings_contents_offset);
-  data.SetAt(kStringsContentsOffset, smi_handle);
-
-  smi_handle = Smi::New(object_offsets_offset);
-  data.SetAt(kObjectOffsetsOffset, smi_handle);
-
-  smi_handle = Smi::New(num_objects);
-  data.SetAt(kNumObjects, smi_handle);
-
-  smi_handle = Smi::New(objects_contents_offset);
-  data.SetAt(kObjectsContentsOffset, smi_handle);
-
-  smi_handle = Smi::New(main_offset);
-  data.SetAt(kMainOffset, smi_handle);
-
-  smi_handle = Smi::New(num_libraries);
-  data.SetAt(kNumLibraries, smi_handle);
-
-  smi_handle = Smi::New(library_index_offset);
-  data.SetAt(kLibraryIndexOffset, smi_handle);
-
-  smi_handle = Smi::New(libraries_offset);
-  data.SetAt(kLibrariesOffset, smi_handle);
-
-  smi_handle = Smi::New(num_classes);
-  data.SetAt(kNumClasses, smi_handle);
-
-  smi_handle = Smi::New(classes_offset);
-  data.SetAt(kClassesOffset, smi_handle);
-
-  smi_handle = Smi::New(members_offset);
-  data.SetAt(kMembersOffset, smi_handle);
-
-  smi_handle = Smi::New(num_codes);
-  data.SetAt(kNumCodes, smi_handle);
-
-  smi_handle = Smi::New(codes_offset);
-  data.SetAt(kCodesOffset, smi_handle);
-
-  smi_handle = Smi::New(source_positions_offset);
-  data.SetAt(kSourcePositionsOffset, smi_handle);
-
-  smi_handle = Smi::New(source_files_offset);
-  data.SetAt(kSourceFilesOffset, smi_handle);
-
-  smi_handle = Smi::New(line_starts_offset);
-  data.SetAt(kLineStartsOffset, smi_handle);
-
-  smi_handle = Smi::New(local_variables_offset);
-  data.SetAt(kLocalVariablesOffset, smi_handle);
-
-  smi_handle = Smi::New(annotations_offset);
-  data.SetAt(kAnnotationsOffset, smi_handle);
-
-  return data.raw();
-}
-
-ErrorPtr BytecodeReader::ReadFunctionBytecode(Thread* thread,
-                                              const Function& function) {
-  ASSERT(!FLAG_precompiled_mode);
-  ASSERT(!function.HasBytecode());
-  ASSERT(thread->sticky_error() == Error::null());
-  ASSERT(Thread::Current()->IsMutatorThread());
-
-  VMTagScope tagScope(thread, VMTag::kLoadBytecodeTagId);
-
-#if defined(SUPPORT_TIMELINE)
-  TimelineBeginEndScope tbes(thread, Timeline::GetCompilerStream(),
-                             "BytecodeReader::ReadFunctionBytecode");
-  // This increases bytecode reading time by ~7%, so only keep it around for
-  // debugging.
-#if defined(DEBUG)
-  tbes.SetNumArguments(1);
-  tbes.CopyArgument(0, "Function", function.ToQualifiedCString());
-#endif  // defined(DEBUG)
-#endif  // !defined(SUPPORT_TIMELINE)
-
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    StackZone stack_zone(thread);
-    Zone* const zone = stack_zone.GetZone();
-    HANDLESCOPE(thread);
-
-    auto& bytecode = Bytecode::Handle(zone);
-
-    switch (function.kind()) {
-      case FunctionLayout::kImplicitGetter:
-        bytecode = Object::implicit_getter_bytecode().raw();
-        break;
-      case FunctionLayout::kImplicitSetter:
-        bytecode = Object::implicit_setter_bytecode().raw();
-        break;
-      case FunctionLayout::kImplicitStaticGetter:
-        if (!IsStaticFieldGetterGeneratedAsInitializer(function, zone)) {
-          bytecode = Object::implicit_static_getter_bytecode().raw();
-        }
-        break;
-      case FunctionLayout::kMethodExtractor:
-        bytecode = Object::method_extractor_bytecode().raw();
-        break;
-      case FunctionLayout::kInvokeFieldDispatcher:
-        if (Class::Handle(zone, function.Owner()).id() == kClosureCid) {
-          bytecode = Object::invoke_closure_bytecode().raw();
-        } else {
-          bytecode = Object::invoke_field_bytecode().raw();
-        }
-        break;
-      case FunctionLayout::kNoSuchMethodDispatcher:
-        bytecode = Object::nsm_dispatcher_bytecode().raw();
-        break;
-      case FunctionLayout::kDynamicInvocationForwarder: {
-        const Function& target =
-            Function::Handle(zone, function.ForwardingTarget());
-        if (!target.HasBytecode()) {
-          // The forwarder will use the target's bytecode to handle optional
-          // parameters.
-          const Error& error =
-              Error::Handle(zone, ReadFunctionBytecode(thread, target));
-          if (!error.IsNull()) {
-            return error.raw();
-          }
-        }
-        {
-          const Script& script = Script::Handle(zone, target.script());
-          TranslationHelper translation_helper(thread);
-          translation_helper.InitFromScript(script);
-
-          ActiveClass active_class;
-          BytecodeComponentData bytecode_component(
-              &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-          ASSERT(!bytecode_component.IsNull());
-          BytecodeReaderHelper bytecode_reader(
-              &translation_helper, &active_class, &bytecode_component);
-
-          const Array& checks = Array::Handle(
-              zone, bytecode_reader.CreateForwarderChecks(target));
-          function.SetForwardingChecks(checks);
-        }
-        bytecode = Object::dynamic_invocation_forwarder_bytecode().raw();
-      } break;
-      default:
-        break;
-    }
-
-    if (!bytecode.IsNull()) {
-      function.AttachBytecode(bytecode);
-    } else if (function.is_declared_in_bytecode()) {
-      const intptr_t code_offset = function.bytecode_offset();
-      if (code_offset != 0) {
-        CompilerState compiler_state(thread, FLAG_precompiled_mode);
-
-        const Script& script = Script::Handle(zone, function.script());
-        TranslationHelper translation_helper(thread);
-        translation_helper.InitFromScript(script);
-
-        ActiveClass active_class;
-
-        // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be
-        // used e.g. for type translation.
-        const Class& klass = Class::Handle(zone, function.Owner());
-        Function& outermost_function =
-            Function::Handle(zone, function.GetOutermostFunction());
-
-        ActiveClassScope active_class_scope(&active_class, &klass);
-        ActiveMemberScope active_member(&active_class, &outermost_function);
-
-        BytecodeComponentData bytecode_component(
-            &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-        ASSERT(!bytecode_component.IsNull());
-        BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                             &bytecode_component);
-
-        bytecode_reader.ReadCode(function, code_offset);
-      }
-    }
-    return Error::null();
-  } else {
-    return thread->StealStickyError();
-  }
-}
-
-ObjectPtr BytecodeReader::ReadAnnotation(const Field& annotation_field) {
-  ASSERT(annotation_field.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, annotation_field.Script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              annotation_field.bytecode_offset());
-
-  return bytecode_reader.ReadObject();
-}
-
-ArrayPtr BytecodeReader::ReadExtendedAnnotations(const Field& annotation_field,
-                                                 intptr_t count) {
-  ASSERT(annotation_field.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, annotation_field.Script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(),
-                              annotation_field.bytecode_offset());
-
-  bytecode_reader.ReadObject();  // Discard main annotation.
-
-  Array& result = Array::Handle(zone, Array::New(count));
-  Object& element = Object::Handle(zone);
-  for (intptr_t i = 0; i < count; i++) {
-    element = bytecode_reader.ReadObject();
-    result.SetAt(i, element);
-  }
-  return result.raw();
-}
-
-void BytecodeReader::ResetObjectTable(const KernelProgramInfo& info) {
-  Thread* thread = Thread::Current();
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromKernelProgramInfo(info);
-  ActiveClass active_class;
-  BytecodeComponentData bytecode_component(&Array::Handle(
-      thread->zone(), translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-  bytecode_reader.ResetObjects();
-}
-
-void BytecodeReader::LoadClassDeclaration(const Class& cls) {
-  TIMELINE_DURATION(Thread::Current(), Compiler,
-                    "BytecodeReader::LoadClassDeclaration");
-
-  ASSERT(cls.is_declared_in_bytecode());
-  ASSERT(!cls.is_declaration_loaded());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, cls.script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-  ActiveClassScope active_class_scope(&active_class, &cls);
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(), cls.bytecode_offset());
-
-  bytecode_reader.ReadClassDeclaration(cls);
-}
-
-void BytecodeReader::FinishClassLoading(const Class& cls) {
-  ASSERT(cls.is_declared_in_bytecode());
-
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(thread->IsMutatorThread());
-
-  const Script& script = Script::Handle(zone, cls.script());
-  TranslationHelper translation_helper(thread);
-  translation_helper.InitFromScript(script);
-
-  ActiveClass active_class;
-  ActiveClassScope active_class_scope(&active_class, &cls);
-
-  BytecodeComponentData bytecode_component(
-      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
-  ASSERT(!bytecode_component.IsNull());
-  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
-                                       &bytecode_component);
-
-  AlternativeReadingScope alt(&bytecode_reader.reader(), cls.bytecode_offset());
-
-  // If this is a dart:internal.ClassID class ignore field declarations
-  // contained in the Kernel file and instead inject our own const
-  // fields.
-  const bool discard_fields = cls.InjectCIDFields();
-
-  bytecode_reader.ReadMembers(cls, discard_fields);
-}
-
-ObjectPtr BytecodeReader::GetBytecodeAttribute(const Object& key,
-                                               const String& name) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const auto* object_store = thread->isolate()->object_store();
-  if (object_store->bytecode_attributes() == Object::null()) {
-    return Object::null();
-  }
-  BytecodeAttributesMap map(object_store->bytecode_attributes());
-  const auto& attrs = Array::CheckedHandle(zone, map.GetOrNull(key));
-  ASSERT(map.Release().raw() == object_store->bytecode_attributes());
-  if (attrs.IsNull()) {
-    return Object::null();
-  }
-  auto& obj = Object::Handle(zone);
-  for (intptr_t i = 0, n = attrs.Length(); i + 1 < n; i += 2) {
-    obj = attrs.At(i);
-    if (obj.raw() == name.raw()) {
-      return attrs.At(i + 1);
-    }
-  }
-  return Object::null();
-}
-
-InferredTypeMetadata InferredTypeBytecodeAttribute::GetInferredTypeAt(
-    Zone* zone,
-    const Array& attr,
-    intptr_t index) {
-  ASSERT(index + kNumElements <= attr.Length());
-  const auto& type = AbstractType::CheckedHandle(zone, attr.At(index + 1));
-  const intptr_t flags = Smi::Value(Smi::RawCast(attr.At(index + 2)));
-  if (!type.IsNull()) {
-    intptr_t cid = Type::Cast(type).type_class_id();
-    return InferredTypeMetadata(cid, flags);
-  } else {
-    return InferredTypeMetadata(kDynamicCid, flags);
-  }
-}
-
-#if !defined(PRODUCT)
-LocalVarDescriptorsPtr BytecodeReader::ComputeLocalVarDescriptors(
-    Zone* zone,
-    const Function& function,
-    const Bytecode& bytecode) {
-  ASSERT(function.is_declared_in_bytecode());
-  ASSERT(function.HasBytecode());
-  ASSERT(!bytecode.IsNull());
-  ASSERT(function.bytecode() == bytecode.raw());
-
-  LocalVarDescriptorsBuilder vars;
-
-  if (function.IsLocalFunction()) {
-    const auto& parent = Function::Handle(zone, function.parent_function());
-    ASSERT(parent.is_declared_in_bytecode() && parent.HasBytecode());
-    const auto& parent_bytecode = Bytecode::Handle(zone, parent.bytecode());
-    const auto& parent_vars = LocalVarDescriptors::Handle(
-        zone, parent_bytecode.GetLocalVarDescriptors());
-    for (intptr_t i = 0; i < parent_vars.Length(); ++i) {
-      LocalVarDescriptorsLayout::VarInfo var_info;
-      parent_vars.GetInfo(i, &var_info);
-      // Include parent's context variable if variable's scope
-      // intersects with the local function range.
-      // It is not enough to check if local function is declared within the
-      // scope of variable, because in case of async functions closure has
-      // the same range as original function.
-      if (var_info.kind() == LocalVarDescriptorsLayout::kContextVar &&
-          ((var_info.begin_pos <= function.token_pos() &&
-            function.token_pos() <= var_info.end_pos) ||
-           (function.token_pos() <= var_info.begin_pos &&
-            var_info.begin_pos <= function.end_token_pos()))) {
-        vars.Add(LocalVarDescriptorsBuilder::VarDesc{
-            &String::Handle(zone, parent_vars.GetName(i)), var_info});
-      }
-    }
-  }
-
-  if (bytecode.HasLocalVariablesInfo()) {
-    intptr_t scope_id = 0;
-    intptr_t context_level = -1;
-    BytecodeLocalVariablesIterator local_vars(zone, bytecode);
-    while (local_vars.MoveNext()) {
-      switch (local_vars.Kind()) {
-        case BytecodeLocalVariablesIterator::kScope: {
-          ++scope_id;
-          context_level = local_vars.ContextLevel();
-        } break;
-        case BytecodeLocalVariablesIterator::kVariableDeclaration: {
-          LocalVarDescriptorsBuilder::VarDesc desc;
-          desc.name = &String::Handle(zone, local_vars.Name());
-          if (local_vars.IsCaptured()) {
-            desc.info.set_kind(LocalVarDescriptorsLayout::kContextVar);
-            desc.info.scope_id = context_level;
-            desc.info.set_index(local_vars.Index());
-          } else {
-            desc.info.set_kind(LocalVarDescriptorsLayout::kStackVar);
-            desc.info.scope_id = scope_id;
-            if (local_vars.Index() < 0) {
-              // Parameter
-              ASSERT(local_vars.Index() < -kKBCParamEndSlotFromFp);
-              desc.info.set_index(-local_vars.Index() - kKBCParamEndSlotFromFp);
-            } else {
-              desc.info.set_index(-local_vars.Index());
-            }
-          }
-          desc.info.declaration_pos = local_vars.DeclarationTokenPos();
-          desc.info.begin_pos = local_vars.StartTokenPos();
-          desc.info.end_pos = local_vars.EndTokenPos();
-          vars.Add(desc);
-        } break;
-        case BytecodeLocalVariablesIterator::kContextVariable: {
-          ASSERT(local_vars.Index() >= 0);
-          const intptr_t context_variable_index = -local_vars.Index();
-          LocalVarDescriptorsBuilder::VarDesc desc;
-          desc.name = &Symbols::CurrentContextVar();
-          desc.info.set_kind(LocalVarDescriptorsLayout::kSavedCurrentContext);
-          desc.info.scope_id = 0;
-          desc.info.declaration_pos = TokenPosition::kMinSource;
-          desc.info.begin_pos = TokenPosition::kMinSource;
-          desc.info.end_pos = TokenPosition::kMinSource;
-          desc.info.set_index(context_variable_index);
-          vars.Add(desc);
-        } break;
-      }
-    }
-  }
-
-  return vars.Done();
-}
-#endif  // !defined(PRODUCT)
-
-bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
-                                               Zone* zone) {
-  ASSERT(function.kind() == FunctionLayout::kImplicitStaticGetter);
-
-  const auto& field = Field::Handle(zone, function.accessor_field());
-  return field.is_declared_in_bytecode() && field.is_const() &&
-         field.has_nontrivial_initializer();
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
deleted file mode 100644
index ee8444f..0000000
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ /dev/null
@@ -1,589 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/frontend/kernel_translation_helper.h"
-#include "vm/constants_kbc.h"
-#include "vm/object.h"
-
-namespace dart {
-namespace kernel {
-
-class BytecodeComponentData;
-
-// Helper class which provides access to bytecode metadata.
-class BytecodeMetadataHelper : public MetadataHelper {
- public:
-  static const char* tag() { return "vm.bytecode"; }
-
-  explicit BytecodeMetadataHelper(KernelReaderHelper* helper,
-                                  ActiveClass* active_class);
-
-  void ParseBytecodeFunction(ParsedFunction* parsed_function);
-
-  // Read all library declarations.
-  bool ReadLibraries();
-
-  // Read specific library declaration.
-  void ReadLibrary(const Library& library);
-
-  // Scan through libraries in the bytecode component and figure out if any of
-  // them will replace libraries which are already loaded.
-  // Return true if bytecode component is found.
-  bool FindModifiedLibrariesForHotReload(BitVector* modified_libs,
-                                         bool* is_empty_program,
-                                         intptr_t* p_num_classes,
-                                         intptr_t* p_num_procedures);
-
-  LibraryPtr GetMainLibrary();
-
-  ArrayPtr GetBytecodeComponent();
-  ArrayPtr ReadBytecodeComponent();
-
- private:
-  ActiveClass* const active_class_;
-
-  DISALLOW_COPY_AND_ASSIGN(BytecodeMetadataHelper);
-};
-
-// Helper class for reading bytecode.
-class BytecodeReaderHelper : public ValueObject {
- public:
-  explicit BytecodeReaderHelper(TranslationHelper* translation_helper,
-                                ActiveClass* active_class,
-                                BytecodeComponentData* bytecode_component);
-
-  Reader& reader() { return reader_; }
-
-  void ReadCode(const Function& function, intptr_t code_offset);
-
-  ArrayPtr CreateForwarderChecks(const Function& function);
-
-  void ReadMembers(const Class& cls, bool discard_fields);
-
-  void ReadFieldDeclarations(const Class& cls, bool discard_fields);
-  void ReadFunctionDeclarations(const Class& cls);
-  void ReadClassDeclaration(const Class& cls);
-  void ReadLibraryDeclaration(const Library& library, bool lookup_classes);
-  void ReadLibraryDeclarations(intptr_t num_libraries);
-  void FindAndReadSpecificLibrary(const Library& library,
-                                  intptr_t num_libraries);
-  void FindModifiedLibrariesForHotReload(BitVector* modified_libs,
-                                         intptr_t num_libraries);
-
-  void ParseBytecodeFunction(ParsedFunction* parsed_function,
-                             const Function& function);
-
-  LibraryPtr ReadMain();
-
-  ArrayPtr ReadBytecodeComponent(intptr_t md_offset);
-  void ResetObjects();
-
-  // Fills in [is_covariant] and [is_generic_covariant_impl] vectors
-  // according to covariance attributes of [function] parameters.
-  //
-  // [function] should be declared in bytecode.
-  // [is_covariant] and [is_generic_covariant_impl] should contain bitvectors
-  // of function.NumParameters() length.
-  void ReadParameterCovariance(const Function& function,
-                               BitVector* is_covariant,
-                               BitVector* is_generic_covariant_impl);
-
-  // Returns an flattened array of tuples {isFinal, defaultValue, metadata},
-  // or an Error.
-  ObjectPtr BuildParameterDescriptor(const Function& function);
-
-  // Read bytecode PackedObject.
-  ObjectPtr ReadObject();
-
- private:
-  // These constants should match corresponding constants in class ObjectHandle
-  // (pkg/vm/lib/bytecode/object_table.dart).
-  static const int kReferenceBit = 1 << 0;
-  static const int kIndexShift = 1;
-  static const int kKindShift = 1;
-  static const int kKindMask = 0x0f;
-  static const int kFlagBit0 = 1 << 5;
-  static const int kFlagBit1 = 1 << 6;
-  static const int kFlagBit2 = 1 << 7;
-  static const int kFlagBit3 = 1 << 8;
-  static const int kFlagBit4 = 1 << 9;
-  static const int kFlagBit5 = 1 << 10;
-  static const int kTagMask = (kFlagBit0 | kFlagBit1 | kFlagBit2 | kFlagBit3);
-  static const int kNullabilityMask = (kFlagBit4 | kFlagBit5);
-  static const int kFlagsMask = (kTagMask | kNullabilityMask);
-
-  // Code flags, must be in sync with Code constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct Code {
-    static const int kHasExceptionsTableFlag = 1 << 0;
-    static const int kHasSourcePositionsFlag = 1 << 1;
-    static const int kHasNullableFieldsFlag = 1 << 2;
-    static const int kHasClosuresFlag = 1 << 3;
-    static const int kHasParameterFlagsFlag = 1 << 4;
-    static const int kHasForwardingStubTargetFlag = 1 << 5;
-    static const int kHasDefaultFunctionTypeArgsFlag = 1 << 6;
-    static const int kHasLocalVariablesFlag = 1 << 7;
-  };
-
-  // Closure code flags, must be in sync with ClosureCode constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct ClosureCode {
-    static const int kHasExceptionsTableFlag = 1 << 0;
-    static const int kHasSourcePositionsFlag = 1 << 1;
-    static const int kHasLocalVariablesFlag = 1 << 2;
-  };
-
-  // Parameter flags, must be in sync with ParameterDeclaration constants in
-  // pkg/vm/lib/bytecode/declarations.dart.
-  struct Parameter {
-    static const int kIsCovariantFlag = 1 << 0;
-    static const int kIsGenericCovariantImplFlag = 1 << 1;
-    static const int kIsFinalFlag = 1 << 2;
-    static const int kIsRequiredFlag = 1 << 3;
-  };
-
-  class FunctionTypeScope : public ValueObject {
-   public:
-    explicit FunctionTypeScope(BytecodeReaderHelper* bytecode_reader)
-        : bytecode_reader_(bytecode_reader),
-          saved_type_parameters_(
-              bytecode_reader->function_type_type_parameters_) {}
-
-    ~FunctionTypeScope() {
-      bytecode_reader_->function_type_type_parameters_ = saved_type_parameters_;
-    }
-
-   private:
-    BytecodeReaderHelper* bytecode_reader_;
-    const TypeArguments* const saved_type_parameters_;
-  };
-
-  class FunctionScope : public ValueObject {
-   public:
-    FunctionScope(BytecodeReaderHelper* bytecode_reader,
-                  const Function& function,
-                  const String& name,
-                  const Class& cls)
-        : bytecode_reader_(bytecode_reader) {
-      ASSERT(bytecode_reader_->scoped_function_.IsNull());
-      ASSERT(bytecode_reader_->scoped_function_name_.IsNull());
-      ASSERT(bytecode_reader_->scoped_function_class_.IsNull());
-      ASSERT(name.IsSymbol());
-      bytecode_reader_->scoped_function_ = function.raw();
-      bytecode_reader_->scoped_function_name_ = name.raw();
-      bytecode_reader_->scoped_function_class_ = cls.raw();
-    }
-
-    ~FunctionScope() {
-      bytecode_reader_->scoped_function_ = Function::null();
-      bytecode_reader_->scoped_function_name_ = String::null();
-      bytecode_reader_->scoped_function_class_ = Class::null();
-    }
-
-   private:
-    BytecodeReaderHelper* bytecode_reader_;
-  };
-
-  void ReadClosureDeclaration(const Function& function, intptr_t closureIndex);
-  TypePtr ReadFunctionSignature(const Function& func,
-                                bool has_optional_positional_params,
-                                bool has_optional_named_params,
-                                bool has_type_params,
-                                bool has_positional_param_names,
-                                bool has_parameter_flags,
-                                Nullability nullability);
-  void ReadTypeParametersDeclaration(const Class& parameterized_class,
-                                     const Function& parameterized_function);
-
-  // Read portion of constant pool corresponding to one function/closure.
-  // Start with [start_index], and stop when reaching EndClosureFunctionScope.
-  // Return index of the last read constant pool entry.
-  intptr_t ReadConstantPool(const Function& function,
-                            const ObjectPool& pool,
-                            intptr_t start_index);
-
-  BytecodePtr ReadBytecode(const ObjectPool& pool);
-  void ReadExceptionsTable(const Bytecode& bytecode, bool has_exceptions_table);
-  void ReadSourcePositions(const Bytecode& bytecode, bool has_source_positions);
-  void ReadLocalVariables(const Bytecode& bytecode, bool has_local_variables);
-  TypedDataPtr NativeEntry(const Function& function,
-                           const String& external_name);
-  StringPtr ConstructorName(const Class& cls, const String& name);
-
-  ObjectPtr ReadObjectContents(uint32_t header);
-  ObjectPtr ReadConstObject(intptr_t tag);
-  ObjectPtr ReadType(intptr_t tag, Nullability nullability);
-  StringPtr ReadString(bool is_canonical = true);
-  ScriptPtr ReadSourceFile(const String& uri, intptr_t offset);
-  TypeArgumentsPtr ReadTypeArguments();
-  void ReadAttributes(const Object& key);
-  PatchClassPtr GetPatchClass(const Class& cls, const Script& script);
-  void ParseForwarderFunction(ParsedFunction* parsed_function,
-                              const Function& function,
-                              const Function& target);
-
-  bool IsExpressionEvaluationLibrary(const Library& library) const {
-    return expression_evaluation_library_ != nullptr &&
-           expression_evaluation_library_->raw() == library.raw();
-  }
-
-  // Similar to cls.EnsureClassDeclaration, but may be more efficient if
-  // class is from the current kernel binary.
-  void LoadReferencedClass(const Class& cls);
-
-  Reader reader_;
-  TranslationHelper& translation_helper_;
-  ActiveClass* const active_class_;
-  Thread* const thread_;
-  Zone* const zone_;
-  BytecodeComponentData* bytecode_component_;
-  Array* closures_ = nullptr;
-  const TypeArguments* function_type_type_parameters_ = nullptr;
-  GrowableObjectArray* pending_recursive_types_ = nullptr;
-  PatchClass* patch_class_ = nullptr;
-  Array* functions_ = nullptr;
-  intptr_t function_index_ = 0;
-  Function& scoped_function_;
-  String& scoped_function_name_;
-  Class& scoped_function_class_;
-  Library* expression_evaluation_library_ = nullptr;
-  bool loading_native_wrappers_library_ = false;
-  bool reading_type_arguments_of_recursive_type_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(BytecodeReaderHelper);
-};
-
-class BytecodeComponentData : ValueObject {
- public:
-  enum {
-    kVersion,
-    kStringsHeaderOffset,
-    kStringsContentsOffset,
-    kObjectOffsetsOffset,
-    kNumObjects,
-    kObjectsContentsOffset,
-    kMainOffset,
-    kNumLibraries,
-    kLibraryIndexOffset,
-    kLibrariesOffset,
-    kNumClasses,
-    kClassesOffset,
-    kMembersOffset,
-    kNumCodes,
-    kCodesOffset,
-    kSourcePositionsOffset,
-    kSourceFilesOffset,
-    kLineStartsOffset,
-    kLocalVariablesOffset,
-    kAnnotationsOffset,
-    kNumFields
-  };
-
-  explicit BytecodeComponentData(Array* data) : data_(*data) {}
-
-  void Init(const Array& data) { data_ = data.raw(); }
-
-  intptr_t GetVersion() const;
-  intptr_t GetStringsHeaderOffset() const;
-  intptr_t GetStringsContentsOffset() const;
-  intptr_t GetObjectOffsetsOffset() const;
-  intptr_t GetNumObjects() const;
-  intptr_t GetObjectsContentsOffset() const;
-  intptr_t GetMainOffset() const;
-  intptr_t GetNumLibraries() const;
-  intptr_t GetLibraryIndexOffset() const;
-  intptr_t GetLibrariesOffset() const;
-  intptr_t GetNumClasses() const;
-  intptr_t GetClassesOffset() const;
-  intptr_t GetMembersOffset() const;
-  intptr_t GetNumCodes() const;
-  intptr_t GetCodesOffset() const;
-  intptr_t GetSourcePositionsOffset() const;
-  intptr_t GetSourceFilesOffset() const;
-  intptr_t GetLineStartsOffset() const;
-  intptr_t GetLocalVariablesOffset() const;
-  intptr_t GetAnnotationsOffset() const;
-  void SetObject(intptr_t index, const Object& obj) const;
-  ObjectPtr GetObject(intptr_t index) const;
-
-  bool IsNull() const { return data_.IsNull(); }
-
-  static ArrayPtr New(Zone* zone,
-                      intptr_t version,
-                      intptr_t num_objects,
-                      intptr_t strings_header_offset,
-                      intptr_t strings_contents_offset,
-                      intptr_t object_offsets_offset,
-                      intptr_t objects_contents_offset,
-                      intptr_t main_offset,
-                      intptr_t num_libraries,
-                      intptr_t library_index_offset,
-                      intptr_t libraries_offset,
-                      intptr_t num_classes,
-                      intptr_t classes_offset,
-                      intptr_t members_offset,
-                      intptr_t num_codes,
-                      intptr_t codes_offset,
-                      intptr_t source_positions_offset,
-                      intptr_t source_files_offset,
-                      intptr_t line_starts_offset,
-                      intptr_t local_variables_offset,
-                      intptr_t annotations_offset,
-                      Heap::Space space);
-
- private:
-  Array& data_;
-};
-
-class BytecodeReader : public AllStatic {
- public:
-  // Reads bytecode for the given function and sets its bytecode field.
-  // Returns error (if any), or null.
-  static ErrorPtr ReadFunctionBytecode(Thread* thread,
-                                       const Function& function);
-
-  // Read annotations for the given annotation field.
-  static ObjectPtr ReadAnnotation(const Field& annotation_field);
-  // Read the |count| annotations following given annotation field.
-  static ArrayPtr ReadExtendedAnnotations(const Field& annotation_field,
-                                          intptr_t count);
-
-  static void ResetObjectTable(const KernelProgramInfo& info);
-
-  // Read declaration of the given library.
-  static void LoadLibraryDeclaration(const Library& library);
-
-  // Read declaration of the given class.
-  static void LoadClassDeclaration(const Class& cls);
-
-  // Read members of the given class.
-  static void FinishClassLoading(const Class& cls);
-
-  // Value of attribute [name] of Function/Field [key].
-  static ObjectPtr GetBytecodeAttribute(const Object& key, const String& name);
-
-#if !defined(PRODUCT)
-  // Compute local variable descriptors for [function] with [bytecode].
-  static LocalVarDescriptorsPtr ComputeLocalVarDescriptors(
-      Zone* zone,
-      const Function& function,
-      const Bytecode& bytecode);
-#endif
-};
-
-class InferredTypeBytecodeAttribute : public AllStatic {
- public:
-  // Number of array elements per entry in InferredType bytecode
-  // attribute (PC, type, flags).
-  static constexpr intptr_t kNumElements = 3;
-
-  // Field type is the first entry with PC = -1.
-  static constexpr intptr_t kFieldTypePC = -1;
-
-  // Returns PC at given index.
-  static intptr_t GetPCAt(const Array& attr, intptr_t index) {
-    return Smi::Value(Smi::RawCast(attr.At(index)));
-  }
-
-  // Returns InferredType metadata at given index.
-  static InferredTypeMetadata GetInferredTypeAt(Zone* zone,
-                                                const Array& attr,
-                                                intptr_t index);
-};
-
-class BytecodeSourcePositionsIterator : ValueObject {
- public:
-  // These constants should match corresponding constants in class
-  // SourcePositions (pkg/vm/lib/bytecode/source_positions.dart).
-  static const intptr_t kSyntheticCodeMarker = -1;
-  static const intptr_t kYieldPointMarker = -2;
-
-  BytecodeSourcePositionsIterator(Zone* zone, const Bytecode& bytecode)
-      : reader_(ExternalTypedData::Handle(zone, bytecode.GetBinary(zone))) {
-    if (bytecode.HasSourcePositions()) {
-      reader_.set_offset(bytecode.source_positions_binary_offset());
-      pairs_remaining_ = reader_.ReadUInt();
-    }
-  }
-
-  bool MoveNext() {
-    if (pairs_remaining_ == 0) {
-      return false;
-    }
-    ASSERT(pairs_remaining_ > 0);
-    --pairs_remaining_;
-    cur_bci_ += reader_.ReadUInt();
-    cur_token_pos_ += reader_.ReadSLEB128();
-    is_yield_point_ = false;
-    if (cur_token_pos_ == kYieldPointMarker) {
-      const bool result = MoveNext();
-      is_yield_point_ = true;
-      return result;
-    }
-    return true;
-  }
-
-  uword PcOffset() const { return cur_bci_; }
-
-  TokenPosition TokenPos() const {
-    return (cur_token_pos_ == kSyntheticCodeMarker)
-               ? TokenPosition::kNoSource
-               : TokenPosition(cur_token_pos_);
-  }
-
-  bool IsYieldPoint() const { return is_yield_point_; }
-
- private:
-  Reader reader_;
-  intptr_t pairs_remaining_ = 0;
-  intptr_t cur_bci_ = 0;
-  intptr_t cur_token_pos_ = 0;
-  bool is_yield_point_ = false;
-};
-
-class BytecodeLocalVariablesIterator : ValueObject {
- public:
-  // These constants should match corresponding constants in
-  // pkg/vm/lib/bytecode/local_variable_table.dart.
-  enum {
-    kInvalid,
-    kScope,
-    kVariableDeclaration,
-    kContextVariable,
-  };
-
-  static const intptr_t kKindMask = 0xF;
-  static const intptr_t kIsCapturedFlag = 1 << 4;
-
-  BytecodeLocalVariablesIterator(Zone* zone, const Bytecode& bytecode)
-      : reader_(ExternalTypedData::Handle(zone, bytecode.GetBinary(zone))),
-        object_pool_(ObjectPool::Handle(zone, bytecode.object_pool())) {
-    if (bytecode.HasLocalVariablesInfo()) {
-      reader_.set_offset(bytecode.local_variables_binary_offset());
-      entries_remaining_ = reader_.ReadUInt();
-    }
-  }
-
-  bool MoveNext() {
-    if (entries_remaining_ <= 0) {
-      // Finished looking at the last entry, now we're done.
-      entries_remaining_ = -1;
-      return false;
-    }
-    --entries_remaining_;
-    cur_kind_and_flags_ = reader_.ReadByte();
-    cur_start_pc_ += reader_.ReadSLEB128();
-    switch (Kind()) {
-      case kScope:
-        cur_end_pc_ = cur_start_pc_ + reader_.ReadUInt();
-        cur_index_ = reader_.ReadSLEB128();
-        cur_token_pos_ = reader_.ReadPosition();
-        cur_end_token_pos_ = reader_.ReadPosition();
-        break;
-      case kVariableDeclaration:
-        cur_index_ = reader_.ReadSLEB128();
-        cur_name_ = reader_.ReadUInt();
-        cur_type_ = reader_.ReadUInt();
-        cur_declaration_token_pos_ = reader_.ReadPosition();
-        cur_token_pos_ = reader_.ReadPosition();
-        break;
-      case kContextVariable:
-        cur_index_ = reader_.ReadSLEB128();
-        break;
-    }
-    return true;
-  }
-
-  // Returns true after iterator moved past the last entry and
-  // MoveNext() returned false.
-  bool IsDone() const { return entries_remaining_ < 0; }
-
-  intptr_t Kind() const { return cur_kind_and_flags_ & kKindMask; }
-  bool IsScope() const { return Kind() == kScope; }
-  bool IsVariableDeclaration() const { return Kind() == kVariableDeclaration; }
-  bool IsContextVariable() const { return Kind() == kContextVariable; }
-
-  intptr_t StartPC() const { return cur_start_pc_; }
-  intptr_t EndPC() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_end_pc_;
-  }
-  intptr_t ContextLevel() const {
-    ASSERT(IsScope());
-    return cur_index_;
-  }
-  TokenPosition StartTokenPos() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_token_pos_;
-  }
-  TokenPosition EndTokenPos() const {
-    ASSERT(IsScope() || IsVariableDeclaration());
-    return cur_end_token_pos_;
-  }
-  intptr_t Index() const {
-    ASSERT(IsVariableDeclaration() || IsContextVariable());
-    return cur_index_;
-  }
-  StringPtr Name() const {
-    ASSERT(IsVariableDeclaration());
-    return String::RawCast(object_pool_.ObjectAt(cur_name_));
-  }
-  AbstractTypePtr Type() const {
-    ASSERT(IsVariableDeclaration());
-    return AbstractType::RawCast(object_pool_.ObjectAt(cur_type_));
-  }
-  TokenPosition DeclarationTokenPos() const {
-    ASSERT(IsVariableDeclaration());
-    return cur_declaration_token_pos_;
-  }
-  bool IsCaptured() const {
-    ASSERT(IsVariableDeclaration());
-    return (cur_kind_and_flags_ & kIsCapturedFlag) != 0;
-  }
-
- private:
-  Reader reader_;
-  const ObjectPool& object_pool_;
-  intptr_t entries_remaining_ = 0;
-  intptr_t cur_kind_and_flags_ = 0;
-  intptr_t cur_start_pc_ = 0;
-  intptr_t cur_end_pc_ = 0;
-  intptr_t cur_index_ = -1;
-  intptr_t cur_name_ = -1;
-  intptr_t cur_type_ = -1;
-  TokenPosition cur_token_pos_ = TokenPosition::kNoSource;
-  TokenPosition cur_declaration_token_pos_ = TokenPosition::kNoSource;
-  TokenPosition cur_end_token_pos_ = TokenPosition::kNoSource;
-};
-
-class BytecodeAttributesMapTraits {
- public:
-  static const char* Name() { return "BytecodeAttributesMapTraits"; }
-  static bool ReportStats() { return false; }
-
-  static bool IsMatch(const Object& a, const Object& b) {
-    return a.raw() == b.raw();
-  }
-
-  static uword Hash(const Object& key) {
-    return String::HashRawSymbol(key.IsFunction() ? Function::Cast(key).name()
-                                                  : Field::Cast(key).name());
-  }
-};
-typedef UnorderedHashMap<BytecodeAttributesMapTraits> BytecodeAttributesMap;
-
-bool IsStaticFieldGetterGeneratedAsInitializer(const Function& function,
-                                               Zone* zone);
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc b/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
deleted file mode 100644
index c88a227..0000000
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// 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.
-
-#include "vm/compiler/frontend/bytecode_scope_builder.h"
-
-#include "vm/compiler/frontend/bytecode_reader.h"
-
-namespace dart {
-namespace kernel {
-
-#define Z (zone_)
-
-BytecodeScopeBuilder::BytecodeScopeBuilder(ParsedFunction* parsed_function)
-    : parsed_function_(parsed_function),
-      zone_(parsed_function->zone()),
-      scope_(nullptr) {}
-
-void BytecodeScopeBuilder::BuildScopes() {
-  if (parsed_function_->scope() != nullptr) {
-    return;  // Scopes are already built.
-  }
-
-  const Function& function = parsed_function_->function();
-
-  LocalScope* enclosing_scope = nullptr;
-  if (function.IsImplicitClosureFunction() && !function.is_static()) {
-    // Create artificial enclosing scope for the tear-off that contains
-    // captured receiver value. This ensure that AssertAssignable will correctly
-    // load instantiator type arguments if they are needed.
-    LocalVariable* receiver_variable =
-        MakeReceiverVariable(/* is_parameter = */ false);
-    receiver_variable->set_is_captured();
-    enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
-    enclosing_scope->set_context_level(0);
-    enclosing_scope->AddVariable(receiver_variable);
-    enclosing_scope->AddContextVariable(receiver_variable);
-  }
-  scope_ = new (Z) LocalScope(enclosing_scope, 0, 0);
-  scope_->set_begin_token_pos(function.token_pos());
-  scope_->set_end_token_pos(function.end_token_pos());
-
-  // Add function type arguments variable before current context variable.
-  if ((function.IsGeneric() || function.HasGenericParent())) {
-    LocalVariable* type_args_var = MakeVariable(
-        Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
-    scope_->AddVariable(type_args_var);
-    parsed_function_->set_function_type_arguments(type_args_var);
-  }
-
-  bool needs_expr_temp = false;
-  if (parsed_function_->has_arg_desc_var()) {
-    needs_expr_temp = true;
-    scope_->AddVariable(parsed_function_->arg_desc_var());
-  }
-
-  LocalVariable* context_var = parsed_function_->current_context_var();
-  context_var->set_is_forced_stack();
-  scope_->AddVariable(context_var);
-
-  parsed_function_->set_scope(scope_);
-
-  switch (function.kind()) {
-    case FunctionLayout::kImplicitClosureFunction: {
-      ASSERT(function.NumImplicitParameters() == 1);
-
-      const auto& parent = Function::Handle(Z, function.parent_function());
-      const auto& target =
-          Function::Handle(Z, function.ImplicitClosureTarget(Z));
-
-      // For BuildGraphOfNoSuchMethodForwarder, since closures no longer
-      // require arg_desc_var in all cases.
-      if (target.IsNull() ||
-          (parent.num_fixed_parameters() != target.num_fixed_parameters())) {
-        needs_expr_temp = true;
-      }
-
-      LocalVariable* closure_parameter = MakeVariable(
-          Symbols::ClosureParameter(), AbstractType::dynamic_type());
-      closure_parameter->set_is_forced_stack();
-      scope_->InsertParameterAt(0, closure_parameter);
-
-      // Type check all parameters by default.
-      // This may be overridden with parameter flags in
-      // BytecodeReaderHelper::ParseForwarderFunction.
-      AddParameters(function, LocalVariable::kDoTypeCheck);
-      break;
-    }
-
-    case FunctionLayout::kImplicitGetter:
-    case FunctionLayout::kImplicitSetter: {
-      const bool is_setter = function.IsImplicitSetterFunction();
-      const bool is_method = !function.IsStaticFunction();
-      const Field& field = Field::Handle(Z, function.accessor_field());
-      intptr_t pos = 0;
-      if (is_method) {
-        MakeReceiverVariable(/* is_parameter = */ true);
-        ++pos;
-      }
-      if (is_setter) {
-        LocalVariable* setter_value = MakeVariable(
-            Symbols::Value(),
-            AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
-        scope_->InsertParameterAt(pos++, setter_value);
-
-        if (is_method) {
-          if (field.is_covariant()) {
-            setter_value->set_is_explicit_covariant_parameter();
-          } else {
-            const bool needs_type_check =
-                field.is_generic_covariant_impl() &&
-                kernel::ProcedureAttributesOf(field, Z).has_non_this_uses;
-            if (!needs_type_check) {
-              setter_value->set_type_check_mode(
-                  LocalVariable::kTypeCheckedByCaller);
-            }
-          }
-        }
-      }
-      break;
-    }
-    case FunctionLayout::kImplicitStaticGetter: {
-      ASSERT(!IsStaticFieldGetterGeneratedAsInitializer(function, Z));
-      break;
-    }
-    case FunctionLayout::kDynamicInvocationForwarder: {
-      // Create [this] variable.
-      MakeReceiverVariable(/* is_parameter = */ true);
-
-      // Type check all parameters by default.
-      // This may be overridden with parameter flags in
-      // BytecodeReaderHelper::ParseForwarderFunction.
-      AddParameters(function, LocalVariable::kDoTypeCheck);
-      break;
-    }
-    case FunctionLayout::kMethodExtractor: {
-      // Add a receiver parameter.  Though it is captured, we emit code to
-      // explicitly copy it to a fixed offset in a freshly-allocated context
-      // instead of using the generic code for regular functions.
-      // Therefore, it isn't necessary to mark it as captured here.
-      MakeReceiverVariable(/* is_parameter = */ true);
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
-
-  if (needs_expr_temp) {
-    scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
-  }
-  if (parsed_function_->function().MayHaveUncheckedEntryPoint()) {
-    scope_->AddVariable(parsed_function_->EnsureEntryPointsTemp());
-  }
-  parsed_function_->AllocateVariables();
-}
-
-// TODO(alexmarkov): pass bitvectors of parameter covariance to set type
-// check mode before AllocateVariables.
-void BytecodeScopeBuilder::AddParameters(const Function& function,
-                                         LocalVariable::TypeCheckMode mode) {
-  for (intptr_t i = function.NumImplicitParameters(),
-                n = function.NumParameters();
-       i < n; ++i) {
-    // LocalVariable caches handles, so new handles are created for each
-    // parameter.
-    String& name = String::ZoneHandle(Z, function.ParameterNameAt(i));
-    AbstractType& type =
-        AbstractType::ZoneHandle(Z, function.ParameterTypeAt(i));
-
-    LocalVariable* variable = MakeVariable(name, type);
-    variable->set_type_check_mode(mode);
-    scope_->InsertParameterAt(i, variable);
-  }
-}
-
-LocalVariable* BytecodeScopeBuilder::MakeVariable(const String& name,
-                                                  const AbstractType& type) {
-  return new (Z) LocalVariable(TokenPosition::kNoSource,
-                               TokenPosition::kNoSource, name, type, nullptr);
-}
-
-LocalVariable* BytecodeScopeBuilder::MakeReceiverVariable(bool is_parameter) {
-  const auto& cls = Class::Handle(Z, parsed_function_->function().Owner());
-  const auto& type = Type::ZoneHandle(Z, cls.DeclarationType());
-  LocalVariable* receiver_variable = MakeVariable(Symbols::This(), type);
-  parsed_function_->set_receiver_var(receiver_variable);
-  if (is_parameter) {
-    scope_->InsertParameterAt(0, receiver_variable);
-  }
-  return receiver_variable;
-}
-
-}  // namespace kernel
-}  // namespace dart
diff --git a/runtime/vm/compiler/frontend/bytecode_scope_builder.h b/runtime/vm/compiler/frontend/bytecode_scope_builder.h
deleted file mode 100644
index 8f96b87..0000000
--- a/runtime/vm/compiler/frontend/bytecode_scope_builder.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2019, 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.
-
-#ifndef RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
-#define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/object.h"
-#include "vm/parser.h"  // For ParsedFunction.
-#include "vm/scopes.h"
-
-namespace dart {
-namespace kernel {
-
-// Builds scopes, populates parameters and local variables for
-// certain functions declared in bytecode.
-class BytecodeScopeBuilder : public ValueObject {
- public:
-  explicit BytecodeScopeBuilder(ParsedFunction* parsed_function);
-
-  void BuildScopes();
-
- private:
-  void AddParameters(const Function& function,
-                     LocalVariable::TypeCheckMode mode);
-  LocalVariable* MakeVariable(const String& name, const AbstractType& type);
-  LocalVariable* MakeReceiverVariable(bool is_parameter);
-
-  ParsedFunction* parsed_function_;
-  Zone* zone_;
-  LocalScope* scope_;
-};
-
-}  // namespace kernel
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_SCOPE_BUILDER_H_
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 2aa6ed5..2bb6f2b 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -212,7 +212,7 @@
     case kInstanceConstant: {
       const NameIndex index = reader.ReadCanonicalNameReference();
       const auto& klass = Class::Handle(Z, H.LookupClassByKernelClass(index));
-      if (!klass.is_declaration_loaded() && !klass.is_declared_in_bytecode()) {
+      if (!klass.is_declaration_loaded()) {
         FATAL1(
             "Trying to evaluate an instance constant whose references class "
             "%s is not loaded yet.",
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b118c2b..bcb3306 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -5,8 +5,6 @@
 #include "vm/compiler/frontend/kernel_binary_flowgraph.h"
 
 #include "vm/compiler/ffi/callback.h"
-#include "vm/compiler/frontend/bytecode_flow_graph_builder.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For dart::FlowGraphBuilder::SimpleInstanceOfType.
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
@@ -15,9 +13,6 @@
 #include "vm/stack_frame.h"
 
 namespace dart {
-
-DECLARE_FLAG(bool, enable_interpreter);
-
 namespace kernel {
 
 #define Z (zone_)
@@ -1055,55 +1050,6 @@
   ActiveMemberScope active_member(active_class(), &outermost_function);
   ActiveTypeParametersScope active_type_params(active_class(), function, Z);
 
-  if (function.is_declared_in_bytecode()) {
-    bytecode_metadata_helper_.ParseBytecodeFunction(parsed_function());
-
-    switch (function.kind()) {
-      case FunctionLayout::kImplicitClosureFunction:
-        return B->BuildGraphOfImplicitClosureFunction(function);
-      case FunctionLayout::kImplicitGetter:
-      case FunctionLayout::kImplicitSetter:
-        return B->BuildGraphOfFieldAccessor(function);
-      case FunctionLayout::kImplicitStaticGetter: {
-        if (IsStaticFieldGetterGeneratedAsInitializer(function, Z)) {
-          break;
-        }
-        return B->BuildGraphOfFieldAccessor(function);
-      }
-      case FunctionLayout::kDynamicInvocationForwarder:
-        return B->BuildGraphOfDynamicInvocationForwarder(function);
-      case FunctionLayout::kMethodExtractor:
-        return B->BuildGraphOfMethodExtractor(function);
-      case FunctionLayout::kNoSuchMethodDispatcher:
-        return B->BuildGraphOfNoSuchMethodDispatcher(function);
-      default:
-        break;
-    }
-
-    ASSERT(function.HasBytecode());
-
-    BytecodeFlowGraphBuilder bytecode_compiler(
-        flow_graph_builder_, parsed_function(),
-        &(flow_graph_builder_->ic_data_array_));
-
-    if (B->IsRecognizedMethodForFlowGraph(function)) {
-      bytecode_compiler.CreateParameterVariables();
-      return B->BuildGraphOfRecognizedMethod(function);
-    }
-
-    return bytecode_compiler.BuildGraph();
-  }
-
-  // Certain special functions could have a VM-internal bytecode
-  // attached to them.
-  ASSERT((!function.HasBytecode()) ||
-         (function.kind() == FunctionLayout::kImplicitGetter) ||
-         (function.kind() == FunctionLayout::kImplicitSetter) ||
-         (function.kind() == FunctionLayout::kImplicitStaticGetter) ||
-         (function.kind() == FunctionLayout::kMethodExtractor) ||
-         (function.kind() == FunctionLayout::kInvokeFieldDispatcher) ||
-         (function.kind() == FunctionLayout::kNoSuchMethodDispatcher));
-
   ParseKernelASTFunction();
 
   switch (function.kind()) {
@@ -3174,8 +3120,6 @@
                                   NULL));
 
   // Special case identical(x, y) call.
-  // Note: similar optimization is performed in bytecode flow graph builder -
-  // see BytecodeFlowGraphBuilder::BuildDirectCall().
   // TODO(27590) consider moving this into the inliner and force inline it
   // there.
   if (special_case_identical) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index ebaa6fb..ef94bf3 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -9,7 +9,6 @@
 #error "AOT runtime should not use compiler sources (including header files)"
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
@@ -41,7 +40,6 @@
                          &constant_reader_,
                          active_class_,
                          /* finalize= */ true),
-        bytecode_metadata_helper_(this, active_class_),
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this, &constant_reader_),
         procedure_attributes_metadata_helper_(this),
@@ -413,7 +411,6 @@
   ActiveClass* const active_class_;
   ConstantReader constant_reader_;
   TypeTranslator type_translator_;
-  BytecodeMetadataHelper bytecode_metadata_helper_;
   DirectCallMetadataHelper direct_call_metadata_helper_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
   ProcedureAttributesMetadataHelper procedure_attributes_metadata_helper_;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 4e9d36e..7bcb54a 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -743,15 +743,9 @@
          info.potential_natives() == GrowableObjectArray::null());
 #endif
 
-  auto& kernel_data = ExternalTypedData::Handle(Z);
-  intptr_t kernel_data_program_offset = 0;
-  if (!function.is_declared_in_bytecode()) {
-    kernel_data = function.KernelData();
-    kernel_data_program_offset = function.KernelDataProgramOffset();
-  }
+  auto& kernel_data = ExternalTypedData::Handle(Z, function.KernelData());
+  intptr_t kernel_data_program_offset = function.KernelDataProgramOffset();
 
-  // TODO(alexmarkov): refactor this - StreamingFlowGraphBuilder should not be
-  //  used for bytecode functions.
   StreamingFlowGraphBuilder streaming_flow_graph_builder(
       this, kernel_data, kernel_data_program_offset);
   return streaming_flow_graph_builder.BuildGraph();
@@ -837,11 +831,6 @@
     case MethodRecognizer::kFfiStorePointer:
     case MethodRecognizer::kFfiFromAddress:
     case MethodRecognizer::kFfiGetAddress:
-    // This list must be kept in sync with BytecodeReaderHelper::NativeEntry in
-    // runtime/vm/compiler/frontend/bytecode_reader.cc and implemented in the
-    // bytecode interpreter in runtime/vm/interpreter.cc. Alternatively, these
-    // methods must work in their original form (a Dart body or native entry) in
-    // the bytecode interpreter.
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 59d6362..05e62eb 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -578,9 +578,6 @@
       Class::Handle(Z, library.LookupClassAllowPrivate(class_name));
   CheckStaticLookup(klass);
   ASSERT(!klass.IsNull());
-  if (klass.is_declared_in_bytecode()) {
-    klass.EnsureDeclarationLoaded();
-  }
   name_index_handle_ = Smi::New(kernel_class);
   return info_.InsertClass(thread_, name_index_handle_, klass);
 }
@@ -2982,9 +2979,6 @@
 
   const Class& klass = Class::Handle(Z, H.LookupClassByKernelClass(klass_name));
   ASSERT(!klass.IsNull());
-  if (klass.is_declared_in_bytecode()) {
-    klass.EnsureDeclarationLoaded();
-  }
   if (simple) {
     if (finalize_ || klass.is_type_finalized()) {
       // Fast path for non-generic types: retrieve or populate the class's only
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index e3f6c54..4dfed5a 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -194,11 +194,6 @@
                    const char* format,
                    ...) PRINTF_ATTRIBUTE(5, 6);
 
-  ArrayPtr GetBytecodeComponent() const { return info_.bytecode_component(); }
-  void SetBytecodeComponent(const Array& bytecode_component) {
-    info_.set_bytecode_component(bytecode_component);
-  }
-
   void SetExpressionEvaluationFunction(const Function& function) {
     ASSERT(expression_evaluation_function_ == nullptr);
     expression_evaluation_function_ = &Function::Handle(zone_, function.raw());
@@ -1260,8 +1255,6 @@
   // kernel program.
   intptr_t data_program_offset_;
 
-  friend class BytecodeMetadataHelper;
-  friend class BytecodeReaderHelper;
   friend class ClassHelper;
   friend class CallSiteAttributesMetadataHelper;
   friend class ConstantReader;
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index c9a54fd..2cf2c29 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -20,7 +20,7 @@
 bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
     const Function& method) {
   // Dart 2 type system at non-dynamic call sites statically guarantees that
-  // argument values match declarated parameter types for all non-covariant
+  // argument values match declared parameter types for all non-covariant
   // and non-generic-covariant parameters. The same applies to type parameters
   // bounds for type parameters of generic functions.
   //
@@ -29,12 +29,7 @@
   //
   // Though for some kinds of methods (e.g. ffi trampolines called from native
   // code) we do have to perform type checks for all parameters.
-  //
-  // TODO(dartbug.com/40813): Remove the closure case when argument checks have
-  // been fully moved out of closures.
-  return !method.CanReceiveDynamicInvocation() &&
-         !(method.IsClosureFunction() &&
-           Function::ClosureBodiesContainNonCovariantTypeArgumentChecks());
+  return !method.CanReceiveDynamicInvocation();
 }
 
 // Returns true if the given method can skip type checks for all arguments
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 2657e52..e122c5f 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -22,7 +22,6 @@
 #include "vm/compiler/cha.h"
 #include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/compiler_state.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/jit_call_specializer.h"
@@ -84,7 +83,6 @@
             "Trace only optimizing compiler operations.");
 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler.");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, huge_method_cutoff_in_code_size);
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
 
@@ -215,25 +213,7 @@
   ASSERT(thread->IsMutatorThread());
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   Object& result = Object::Handle(zone);
-
-  if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
-    if (!function.HasBytecode()) {
-      result = kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
-      if (!result.IsNull()) {
-        Exceptions::PropagateError(Error::Cast(result));
-      }
-    }
-    if (function.HasBytecode() && (FLAG_compilation_counter_threshold != 0)) {
-      // If interpreter is enabled and there is bytecode, LazyCompile stub
-      // (which calls CompileFunction) should proceed to InterpretCall in order
-      // to enter interpreter. In such case, compilation is postponed and
-      // triggered by interpreter later via CompileInterpretedFunction.
-      return;
-    }
-    // Fall back to compilation.
-  } else {
-    ASSERT(!function.HasCode());
-  }
+  ASSERT(!function.HasCode());
 
   result = Compiler::CompileFunction(thread, function);
   if (result.IsError()) {
@@ -495,13 +475,6 @@
       Compiler::AbortBackgroundCompilation(
           DeoptId::kNone, "Optimizing Background compilation is being stopped");
     }
-  } else {
-    if (FLAG_enable_interpreter &&
-        !isolate()->background_compiler()->is_running()) {
-      // The background compiler is being stopped.
-      Compiler::AbortBackgroundCompilation(
-          DeoptId::kNone, "Background compilation is being stopped");
-    }
   }
 }
 
@@ -783,9 +756,8 @@
           function.set_is_background_optimizable(false);
 
           // Trigger another optimization soon on the main thread.
-          function.SetUsageCounter(optimized
-                                       ? FLAG_optimization_counter_threshold
-                                       : FLAG_compilation_counter_threshold);
+          function.SetUsageCounter(
+              optimized ? FLAG_optimization_counter_threshold : 0);
           return Error::null();
         } else if (error.IsLanguageError() &&
                    LanguageError::Cast(error).kind() == Report::kBailout) {
@@ -942,8 +914,6 @@
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
 #endif  // defined(SUPPORT_TIMELINE)
 
-  ASSERT(function.ShouldCompilerOptimize());
-
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
   return CompileFunctionHelper(pipeline, function, /* optimized = */ true,
@@ -978,21 +948,8 @@
 
     auto& var_descs = LocalVarDescriptors::Handle(zone);
 
-    if (function.is_declared_in_bytecode()) {
-      if (function.HasBytecode()) {
-        const auto& bytecode = Bytecode::Handle(zone, function.bytecode());
-        var_descs = bytecode.GetLocalVarDescriptors();
-        LocalVarDescriptorsBuilder builder;
-        builder.AddDeoptIdToContextLevelMappings(context_level_array);
-        builder.AddAll(zone, var_descs);
-        var_descs = builder.Done();
-      } else {
-        var_descs = Object::empty_var_descriptors().raw();
-      }
-    } else {
-      var_descs = parsed_function->scope()->GetVarDescriptors(
-          function, context_level_array);
-    }
+    var_descs = parsed_function->scope()->GetVarDescriptors(
+        function, context_level_array);
 
     ASSERT(!var_descs.IsNull());
     code.set_var_descriptors(var_descs);
@@ -1026,30 +983,6 @@
   return Error::null();
 }
 
-ErrorPtr Compiler::ReadAllBytecode(const Class& cls) {
-  Thread* thread = Thread::Current();
-  ASSERT(thread->IsMutatorThread());
-  Zone* zone = thread->zone();
-  Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
-  ASSERT(error.IsNull());
-  Array& functions = Array::Handle(zone, cls.current_functions());
-  Function& func = Function::Handle(zone);
-  // Compile all the regular functions.
-  for (int i = 0; i < functions.Length(); i++) {
-    func ^= functions.At(i);
-    ASSERT(!func.IsNull());
-    if (func.IsBytecodeAllowed(zone) && !func.HasBytecode() &&
-        !func.HasCode()) {
-      ErrorPtr error =
-          kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
-      if (error != Error::null()) {
-        return error;
-      }
-    }
-  }
-  return Error::null();
-}
-
 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) {
   if (FLAG_trace_compiler) {
     THR_Print("ABORT background compilation: %s\n", msg);
@@ -1209,13 +1142,9 @@
         }
       }
       while (!function.IsNull()) {
-        if (is_optimizing()) {
-          Compiler::CompileOptimizedFunction(thread, function,
-                                             Compiler::kNoOSRDeoptId);
-        } else {
-          ASSERT(FLAG_enable_interpreter);
-          Compiler::CompileFunction(thread, function);
-        }
+        ASSERT(is_optimizing());
+        Compiler::CompileOptimizedFunction(thread, function,
+                                           Compiler::kNoOSRDeoptId);
 
         QueueElement* qelem = NULL;
         {
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index 29029df..75d59521 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -84,8 +84,6 @@
   static ObjectPtr CompileFunction(Thread* thread, const Function& function);
 
   // Generates unoptimized code if not present, current code is unchanged.
-  // Bytecode is considered unoptimized code.
-  // TODO(regis): Revisit when deoptimizing mixed bytecode and jitted code.
   static ErrorPtr EnsureUnoptimizedCode(Thread* thread,
                                         const Function& function);
 
@@ -108,9 +106,6 @@
   // Returns Error::null() if there is no compilation error.
   static ErrorPtr CompileAllFunctions(const Class& cls);
 
-  // Eagerly read all bytecode.
-  static ErrorPtr ReadAllBytecode(const Class& cls);
-
   // Notify the compiler that background (optimized) compilation has failed
   // because the mutator thread changed the state (e.g., deoptimization,
   // deferred loading). The background compilation may retry to compile
@@ -129,36 +124,24 @@
 
   static void Start(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Start();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Start();
     }
   }
   static void Stop(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Stop();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Stop();
     }
   }
   static void Enable(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Enable();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Enable();
     }
   }
   static void Disable(Isolate* isolate) {
     ASSERT(Thread::Current()->IsMutatorThread());
-    if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-      isolate->background_compiler()->Disable();
-    }
     if (isolate->optimizing_background_compiler() != NULL) {
       isolate->optimizing_background_compiler()->Disable();
     }
@@ -169,10 +152,6 @@
       if (isolate->optimizing_background_compiler() != NULL) {
         return isolate->optimizing_background_compiler()->IsDisabled();
       }
-    } else {
-      if (FLAG_enable_interpreter && isolate->background_compiler() != NULL) {
-        return isolate->background_compiler()->IsDisabled();
-      }
     }
     return false;
   }
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index e83406a..223c76d 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -727,8 +727,8 @@
   return dart::Thread::ExecutionState::kThreadInVM;
 }
 
-uword Thread::vm_tag_compiled_id() {
-  return dart::VMTag::kDartCompiledTagId;
+uword Thread::vm_tag_dart_id() {
+  return dart::VMTag::kDartTagId;
 }
 
 uword Thread::exit_through_runtime_call() {
@@ -998,10 +998,6 @@
   return -kWordSize;
 }
 
-word Bytecode::NextFieldOffset() {
-  return -kWordSize;
-}
-
 word PcDescriptors::NextFieldOffset() {
   return -kWordSize;
 }
@@ -1026,10 +1022,6 @@
   return -kWordSize;
 }
 
-word ParameterTypeCheck::NextFieldOffset() {
-  return -kWordSize;
-}
-
 word UnlinkedCall::NextFieldOffset() {
   return -kWordSize;
 }
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index a7e9547..4f53eda 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -807,12 +807,6 @@
   static word NextFieldOffset();
 };
 
-class Bytecode : public AllStatic {
- public:
-  static word InstanceSize();
-  static word NextFieldOffset();
-};
-
 class PcDescriptors : public AllStatic {
  public:
   static word HeaderSize();
@@ -855,12 +849,6 @@
   static word NextFieldOffset();
 };
 
-class ParameterTypeCheck : public AllStatic {
- public:
-  static word InstanceSize();
-  static word NextFieldOffset();
-};
-
 class UnlinkedCall : public AllStatic {
  public:
   static word InstanceSize();
@@ -1037,7 +1025,7 @@
   static word slow_type_test_entry_point_offset();
   static word write_barrier_entry_point_offset();
   static word vm_tag_offset();
-  static uword vm_tag_compiled_id();
+  static uword vm_tag_dart_id();
 
   static word safepoint_state_offset();
   static uword safepoint_state_unacquired();
@@ -1067,8 +1055,6 @@
   static word slow_type_test_stub_offset();
   static word call_to_runtime_stub_offset();
   static word invoke_dart_code_stub_offset();
-  static word interpret_call_entry_point_offset();
-  static word invoke_dart_code_from_bytecode_stub_offset();
   static word late_initialization_error_shared_without_fpu_regs_stub_offset();
   static word late_initialization_error_shared_with_fpu_regs_stub_offset();
   static word null_error_shared_without_fpu_regs_stub_offset();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index e2196c5..6650cd6 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -19,7 +19,7 @@
 
 #if defined(TARGET_ARCH_ARM)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -133,9 +133,9 @@
 static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -217,159 +217,155 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 384;
+    Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    732;
+    696;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    736;
+    700;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 276;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 292;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 200;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 296;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 204;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 300;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 208;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 732;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 280;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 740;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    320;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
+    316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    324;
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    240;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    364;
+    356;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 360;
+    Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 260;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    752;
+    716;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 264;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 268;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 328;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 376;
+    Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 372;
+    Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 380;
+    Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    740;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    704;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    764;
+    728;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 244;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 248;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 256;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 312;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 316;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 220;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
+    Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 748;
+    Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    756;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 252;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 332;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -382,10 +378,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 272;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 724;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -435,12 +431,11 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
@@ -480,7 +475,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -499,12 +494,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -740,160 +733,156 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 752;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1472;
+    1400;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1480;
+    1408;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 536;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 568;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 384;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 576;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 392;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 584;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 400;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 544;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1488;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    624;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
+    616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    632;
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    464;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    712;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 704;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 504;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1512;
+    1440;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 512;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 520;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 640;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 736;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 728;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    720;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 744;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1488;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1416;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1536;
+    1464;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 472;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 480;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 496;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 608;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 616;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 424;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 688;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1424;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1504;
+    Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1520;
+    1448;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 488;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 648;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -906,11 +895,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 528;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1528;
+    1456;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -961,13 +950,12 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
-        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
@@ -994,7 +982,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -1007,7 +995,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -1026,12 +1014,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -1067,7 +1053,7 @@
 
 #if defined(TARGET_ARCH_IA32)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -1181,9 +1167,9 @@
 static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -1265,159 +1251,155 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 384;
+    Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    700;
+    664;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    704;
+    668;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 276;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 292;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 200;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 296;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 204;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 300;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 208;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 700;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 280;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 708;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    320;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
+    316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    324;
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    240;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    364;
+    356;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 360;
+    Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 260;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    720;
+    684;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 264;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 268;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 328;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 376;
+    Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 372;
+    Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 380;
+    Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    708;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    672;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    732;
+    696;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 244;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 248;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 256;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 312;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 316;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 220;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
+    Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 676;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 716;
+    Thread_saved_shadow_call_stack_offset = 680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    724;
+    688;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 252;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 332;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -1430,10 +1412,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 272;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 692;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -1485,7 +1467,6 @@
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
@@ -1525,7 +1506,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -1544,12 +1525,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -1785,160 +1764,156 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 752;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1552;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 536;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 568;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 384;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 576;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 392;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 584;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 400;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1616;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 544;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    624;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
+    616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    632;
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    464;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    712;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 704;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 504;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1584;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 512;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 520;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 640;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 736;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 728;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    720;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 744;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1560;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1488;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1608;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 472;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 480;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 496;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 608;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 616;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 424;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 688;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1576;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1592;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 488;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 648;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -1951,11 +1926,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 528;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1600;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2006,14 +1981,13 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
-        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
-        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
@@ -2040,7 +2014,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -2053,7 +2027,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -2072,12 +2046,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -2115,7 +2087,7 @@
 
 #if defined(TARGET_ARCH_ARM)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -2227,9 +2199,9 @@
 static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -2310,159 +2282,155 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 384;
+    Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    732;
+    696;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    736;
+    700;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 276;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 292;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 200;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 296;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 204;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 300;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 208;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 732;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 280;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 740;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    320;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
+    316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    324;
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    240;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    364;
+    356;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 360;
+    Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 260;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    752;
+    716;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 264;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 268;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 328;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 376;
+    Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 372;
+    Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 380;
+    Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    740;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    704;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    764;
+    728;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 244;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 248;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 256;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 312;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 316;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 220;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
+    Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 748;
+    Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    756;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 252;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 332;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -2475,10 +2443,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 272;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 724;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -2525,12 +2493,11 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
@@ -2570,7 +2537,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -2589,12 +2556,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -2827,160 +2792,156 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 752;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1472;
+    1400;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1480;
+    1408;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 536;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 568;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 384;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 576;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 392;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 584;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 400;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 544;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1488;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    624;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
+    616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    632;
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    464;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    712;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 704;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 504;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1512;
+    1440;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 512;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 520;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 640;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 736;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 728;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    720;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 744;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1488;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1416;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1536;
+    1464;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 472;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 480;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 496;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 608;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 616;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 424;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 688;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1424;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1504;
+    Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1520;
+    1448;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 488;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 648;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -2993,11 +2954,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 528;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1528;
+    1456;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -3045,13 +3006,12 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
-        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
@@ -3078,7 +3038,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -3091,7 +3051,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -3110,12 +3070,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -3151,7 +3109,7 @@
 
 #if defined(TARGET_ARCH_IA32)
 static constexpr dart::compiler::target::word Function_usage_counter_offset =
-    76;
+    84;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
@@ -3263,9 +3221,9 @@
 static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
-static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 72;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
-    68;
+    76;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
     28;
 static constexpr dart::compiler::target::word Function_parameter_types_offset =
@@ -3346,159 +3304,155 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 384;
+    Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    700;
+    664;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    704;
+    668;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 276;
+    Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 292;
+    Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 200;
+    Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 296;
+    Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 204;
+    Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 300;
+    Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 208;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
+    Thread_allocate_object_slow_stub_offset = 204;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 700;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 280;
+    Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
+    Thread_call_to_runtime_stub_offset = 144;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 708;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    320;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
+    316;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    324;
+    320;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    240;
+    236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    364;
+    356;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 360;
+    Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 260;
+    Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    720;
+    684;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 264;
+    Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 268;
+    Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 328;
+    Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 376;
+    Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 372;
+    Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    368;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 380;
+    Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    708;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    672;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    732;
+    696;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 244;
+    Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 248;
+    Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 256;
+    Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 312;
+    Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 316;
+    Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 220;
+    Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
+    Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 676;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 716;
+    Thread_saved_shadow_call_stack_offset = 680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    724;
+    688;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 252;
+    Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 332;
+    Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -3511,10 +3465,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 272;
+    Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 692;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -3563,7 +3517,6 @@
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
@@ -3603,7 +3556,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    64;
+    60;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 28;
 static constexpr dart::compiler::target::word Library_InstanceSize = 84;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 20;
@@ -3622,12 +3575,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 4;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 12;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    24;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -3860,160 +3811,156 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 752;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1552;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 536;
+    Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 568;
+    Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 384;
+    Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 576;
+    Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 392;
+    Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 584;
+    Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 400;
+    Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1616;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 544;
+    Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
+    Thread_call_to_runtime_stub_offset = 272;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    624;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
+    616;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 448;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    632;
+    624;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    464;
+    456;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    712;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 704;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 504;
+    Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1584;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 512;
+    Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 520;
+    Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 640;
+    Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 736;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 728;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    720;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 744;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1560;
-static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    1488;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1608;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 472;
+    Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 480;
+    Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 496;
+    Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 608;
+    Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 616;
+    Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 424;
+    Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 688;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1576;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1592;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 488;
+    Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 648;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -4026,11 +3973,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 528;
+    Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1600;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -4078,14 +4025,13 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
-        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
-        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
@@ -4112,7 +4058,7 @@
 static constexpr dart::compiler::target::word Field_InstanceSize = 104;
 static constexpr dart::compiler::target::word Float32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Float64x2_InstanceSize = 24;
-static constexpr dart::compiler::target::word Function_InstanceSize = 152;
+static constexpr dart::compiler::target::word Function_InstanceSize = 144;
 static constexpr dart::compiler::target::word FutureOr_InstanceSize = 16;
 static constexpr dart::compiler::target::word GrowableObjectArray_InstanceSize =
     32;
@@ -4125,7 +4071,7 @@
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
-    128;
+    120;
 static constexpr dart::compiler::target::word LanguageError_InstanceSize = 48;
 static constexpr dart::compiler::target::word Library_InstanceSize = 160;
 static constexpr dart::compiler::target::word LibraryPrefix_InstanceSize = 40;
@@ -4144,12 +4090,10 @@
 static constexpr dart::compiler::target::word Object_InstanceSize = 8;
 static constexpr dart::compiler::target::word ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word OneByteString_InstanceSize = 16;
-static constexpr dart::compiler::target::word ParameterTypeCheck_InstanceSize =
-    48;
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -4405,152 +4349,148 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 384;
+    AOT_Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 732;
+    AOT_Thread_active_exception_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 736;
+    AOT_Thread_active_stacktrace_offset = 700;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 276;
+    AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 292;
+    AOT_Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 200;
+    AOT_Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 204;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 300;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 208;
+    AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    768;
+    732;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 280;
+    AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 148;
+    AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    776;
+    740;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    320;
+    316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    236;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 324;
+    AOT_Thread_deoptimize_entry_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 240;
+    AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 364;
+    AOT_Thread_double_abs_address_offset = 356;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 360;
+    AOT_Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 260;
+    AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 752;
+    AOT_Thread_execution_state_offset = 716;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 264;
+    AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 268;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 376;
+    AOT_Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 372;
+    AOT_Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 368;
+    AOT_Thread_float_not_address_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 380;
+    AOT_Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 740;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    AOT_Thread_global_object_pool_offset = 704;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 764;
+    AOT_Thread_exit_through_ffi_offset = 728;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 312;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 316;
+    AOT_Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 220;
+    AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        152;
+        148;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
+    AOT_Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 748;
+    AOT_Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 756;
+    AOT_Thread_safepoint_state_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 252;
+    AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 332;
+    AOT_Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -4558,13 +4498,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -4578,11 +4518,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 272;
+    AOT_Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    760;
+    724;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -4645,12 +4585,11 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
@@ -4692,7 +4631,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 64;
+    AOT_KernelProgramInfo_InstanceSize = 60;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     28;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 80;
@@ -4717,12 +4656,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     12;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -4984,153 +4921,149 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 752;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1472;
+    AOT_Thread_active_exception_offset = 1400;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1480;
+    AOT_Thread_active_stacktrace_offset = 1408;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 536;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 568;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 384;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 400;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 544;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1560;
+    1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    624;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    456;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 632;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 464;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 712;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 704;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 504;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1512;
+    AOT_Thread_execution_state_offset = 1440;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 512;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 736;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 728;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 720;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 744;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1488;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1416;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1536;
+    AOT_Thread_exit_through_ffi_offset = 1464;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 616;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 424;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        288;
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 688;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1496;
+    1424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1504;
+    AOT_Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1520;
+    AOT_Thread_safepoint_state_offset = 1448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 488;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 648;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -5138,13 +5071,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -5158,11 +5091,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 528;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1528;
+    1456;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5225,13 +5158,12 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
-        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
@@ -5273,7 +5205,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -5298,12 +5230,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5568,153 +5498,149 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 752;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1544;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1552;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 536;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 568;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 384;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 400;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1616;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 544;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1632;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    624;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    456;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 632;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 464;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 712;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 704;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 504;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1584;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 512;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 736;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 728;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 720;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 744;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1560;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1608;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 616;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 424;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        288;
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 688;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1568;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1576;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1592;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 488;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 648;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -5722,13 +5648,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -5742,11 +5668,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 528;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1600;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5809,14 +5735,13 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
-        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
-        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
@@ -5858,7 +5783,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -5883,12 +5808,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -6147,152 +6070,148 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 384;
+    AOT_Thread_AllocateArray_entry_point_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 732;
+    AOT_Thread_active_exception_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 736;
+    AOT_Thread_active_stacktrace_offset = 700;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 276;
+    AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 188;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 292;
+    AOT_Thread_allocate_object_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 200;
+    AOT_Thread_allocate_object_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 204;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 300;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 208;
+    AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    768;
+    732;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 280;
+    AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 148;
+    AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    776;
+    740;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    320;
+    316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    236;
+    232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 324;
+    AOT_Thread_deoptimize_entry_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 240;
+    AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 364;
+    AOT_Thread_double_abs_address_offset = 356;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 360;
+    AOT_Thread_double_negate_address_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 260;
+    AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 752;
+    AOT_Thread_execution_state_offset = 716;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 264;
+    AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 268;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 324;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 376;
+    AOT_Thread_float_absolute_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 372;
+    AOT_Thread_float_negate_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 368;
+    AOT_Thread_float_not_address_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 380;
+    AOT_Thread_float_zerow_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 740;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 348;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
+    AOT_Thread_global_object_pool_offset = 704;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 764;
+    AOT_Thread_exit_through_ffi_offset = 728;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 312;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 316;
+    AOT_Thread_switchable_call_miss_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 220;
+    AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        152;
+        148;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 176;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 352;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
+    AOT_Thread_predefined_symbols_address_offset = 344;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 708;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 748;
+    AOT_Thread_saved_shadow_call_stack_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 756;
+    AOT_Thread_safepoint_state_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 252;
+    AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 332;
+    AOT_Thread_slow_type_test_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -6300,13 +6219,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 208;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -6320,11 +6239,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 272;
+    AOT_Thread_write_barrier_entry_point_offset = 268;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    760;
+    724;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6384,12 +6303,11 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
+        664, 668, 672, 676, 680, -1, 684, -1, 688, 692, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 8;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 44;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
@@ -6431,7 +6349,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 64;
+    AOT_KernelProgramInfo_InstanceSize = 60;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     28;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 80;
@@ -6456,12 +6374,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     12;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -6719,153 +6635,149 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 752;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1472;
+    AOT_Thread_active_exception_offset = 1400;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1480;
+    AOT_Thread_active_stacktrace_offset = 1408;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 536;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 568;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 384;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 400;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1544;
+    1472;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 544;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1560;
+    1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    624;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    456;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 632;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 464;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 712;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 704;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 504;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1512;
+    AOT_Thread_execution_state_offset = 1440;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 512;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 736;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 728;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 720;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 744;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1488;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1416;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1536;
+    AOT_Thread_exit_through_ffi_offset = 1464;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 616;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 424;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        288;
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 688;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1496;
+    1424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1504;
+    AOT_Thread_saved_shadow_call_stack_offset = 1432;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1520;
+    AOT_Thread_safepoint_state_offset = 1448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 488;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 648;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -6873,13 +6785,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -6893,11 +6805,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 528;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1528;
+    1456;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6957,13 +6869,12 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
-        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
+        1312, 1320, 1328, 1336, -1,   -1,   1344, 1352,
+        1360, 1368, 1376, -1,   1384, 1392, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
@@ -7005,7 +6916,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -7030,12 +6941,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -7296,153 +7205,149 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 752;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1544;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1552;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 536;
+    AOT_Thread_array_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 568;
+    AOT_Thread_allocate_object_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 384;
+    AOT_Thread_allocate_object_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 400;
+    AOT_Thread_allocate_object_slow_stub_offset = 392;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1616;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 544;
+    AOT_Thread_call_to_runtime_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_stub_offset = 280;
+    AOT_Thread_call_to_runtime_stub_offset = 272;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1632;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    624;
+    616;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    456;
+    448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 632;
+    AOT_Thread_deoptimize_entry_offset = 624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 464;
+    AOT_Thread_deoptimize_stub_offset = 456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 712;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 704;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 504;
+    AOT_Thread_enter_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1584;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 512;
+    AOT_Thread_exit_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 632;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 736;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 728;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 720;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 744;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1560;
-static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 680;
-static constexpr dart::compiler::target::word
-    AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1608;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 616;
+    AOT_Thread_switchable_call_miss_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 424;
+    AOT_Thread_switchable_call_miss_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
-        288;
+        280;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 688;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1568;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1576;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1592;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 488;
+    AOT_Thread_slow_type_test_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 648;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -7450,13 +7355,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 400;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -7470,11 +7375,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 528;
+    AOT_Thread_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1600;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7534,14 +7439,13 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
-        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
-        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
+        1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392,
+        1400, 1408, 1416, 1424, -1,   -1,   -1,   -1,   1432, 1440, -1,
+        -1,   1448, 1456, 1464, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Bool_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_Bytecode_InstanceSize = 80;
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
@@ -7583,7 +7487,7 @@
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_KernelProgramInfo_InstanceSize = 128;
+    AOT_KernelProgramInfo_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_LanguageError_InstanceSize =
     48;
 static constexpr dart::compiler::target::word AOT_Library_InstanceSize = 152;
@@ -7608,12 +7512,10 @@
 static constexpr dart::compiler::target::word AOT_ObjectPool_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_OneByteString_InstanceSize =
     16;
-static constexpr dart::compiler::target::word
-    AOT_ParameterTypeCheck_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 6039830..2aa714c 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -208,8 +208,6 @@
   FIELD(Thread, float_not_address_offset)                                      \
   FIELD(Thread, float_zerow_address_offset)                                    \
   FIELD(Thread, global_object_pool_offset)                                     \
-  FIELD(Thread, interpret_call_entry_point_offset)                             \
-  FIELD(Thread, invoke_dart_code_from_bytecode_stub_offset)                    \
   FIELD(Thread, invoke_dart_code_stub_offset)                                  \
   FIELD(Thread, exit_through_ffi_offset)                                       \
   FIELD(Thread, isolate_offset)                                                \
@@ -301,7 +299,6 @@
   SIZEOF(Array, InstanceSize, ArrayLayout)                                     \
   SIZEOF(Array, header_size, ArrayLayout)                                      \
   SIZEOF(Bool, InstanceSize, BoolLayout)                                       \
-  SIZEOF(Bytecode, InstanceSize, BytecodeLayout)                               \
   SIZEOF(Capability, InstanceSize, CapabilityLayout)                           \
   SIZEOF(Class, InstanceSize, ClassLayout)                                     \
   SIZEOF(Closure, InstanceSize, ClosureLayout)                                 \
@@ -347,7 +344,6 @@
   SIZEOF(Object, InstanceSize, ObjectLayout)                                   \
   SIZEOF(ObjectPool, InstanceSize, ObjectPoolLayout)                           \
   SIZEOF(OneByteString, InstanceSize, OneByteStringLayout)                     \
-  SIZEOF(ParameterTypeCheck, InstanceSize, ParameterTypeCheckLayout)           \
   SIZEOF(PatchClass, InstanceSize, PatchClassLayout)                           \
   SIZEOF(PcDescriptors, HeaderSize, PcDescriptorsLayout)                       \
   SIZEOF(Pointer, InstanceSize, PointerLayout)                                 \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 547cf92..4376d54 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -84,14 +84,8 @@
   if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
     __ LoadField(CODE_REG,
                  FieldAddress(kFunctionReg, target::Function::code_offset()));
-    if (FLAG_enable_interpreter) {
-      // InterpretCall stub needs arguments descriptor for all function calls.
-      __ LoadObject(ARGS_DESC_REG,
-                    CastHandle<Object>(OneArgArgumentsDescriptor()));
-    } else {
-      // Load a GC-safe value for the arguments descriptor (unused but tagged).
-      __ LoadImmediate(ARGS_DESC_REG, 0);
-    }
+    // Load a GC-safe value for the arguments descriptor (unused but tagged).
+    __ LoadImmediate(ARGS_DESC_REG, 0);
   }
   __ Call(FieldAddress(kFunctionReg, target::Function::entry_point_offset()));
   __ Drop(1);  // Drop argument.
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index fef56a0..141f378 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -96,7 +96,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -137,7 +137,7 @@
   __ blx(R9);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -540,7 +540,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -587,7 +587,7 @@
   __ blx(LR);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -1230,7 +1230,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R9, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -1307,160 +1307,6 @@
   __ Ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   LR : points to return address.
-//   R0 : raw code object of the Dart function to call.
-//   R1 : arguments raw descriptor array.
-//   R2 : address of first argument.
-//   R3 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ Push(LR);  // Marker for the profiler.
-  __ EnterFrame((1 << FP) | (1 << LR), 0);
-
-  // Push code object to PC marker slot.
-  __ ldr(IP,
-         Address(R3,
-                 target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-  __ Push(IP);
-
-  // Save new context and C++ ABI callee-saved registers.
-  __ PushList(kAbiPreservedCpuRegs);
-
-  const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
-  if (TargetCPUFeatures::vfp_supported()) {
-    ASSERT(2 * kAbiPreservedFpuRegCount < 16);
-    // Save FPU registers. 2 D registers per Q register.
-    __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    __ sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
-  }
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != R3) {
-    __ mov(THR, Operand(R3));
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ LoadFromOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
-  __ Push(R9);
-
-  // Save top resource and top exit frame info. Use R4-6 as temporary registers.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ LoadFromOffset(kWord, R4, THR, target::Thread::top_resource_offset());
-  __ Push(R4);
-  __ LoadImmediate(R8, 0);
-  __ StoreToOffset(kWord, R8, THR, target::Thread::top_resource_offset());
-
-  __ LoadFromOffset(kWord, R8, THR, target::Thread::exit_through_ffi_offset());
-  __ Push(R8);
-  __ LoadImmediate(R8, 0);
-  __ StoreToOffset(kWord, R8, THR, target::Thread::exit_through_ffi_offset());
-
-  __ LoadFromOffset(kWord, R9, THR,
-                    target::Thread::top_exit_frame_info_offset());
-  __ StoreToOffset(kWord, R8, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  // target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
-  // with the code below.
-#if defined(TARGET_OS_MACOS) || defined(TARGET_OS_MACOS_IOS)
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -27);
-#else
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -28);
-#endif
-  __ Push(R9);
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
-
-  // Load arguments descriptor array into R4, which is passed to Dart code.
-  __ mov(R4, Operand(R1));
-
-  // Load number of arguments into R9 and adjust count for type arguments.
-  __ ldr(R3,
-         FieldAddress(R4, target::ArgumentsDescriptor::type_args_len_offset()));
-  __ ldr(R9, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
-  __ cmp(R3, Operand(0));
-  __ AddImmediate(R9, R9, target::ToRawSmi(1),
-                  NE);  // Include the type arguments.
-  __ SmiUntag(R9);
-
-  // R2 points to first argument.
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ CompareImmediate(R9, 0);  // check if there are arguments.
-  __ b(&done_push_arguments, EQ);
-  __ LoadImmediate(R1, 0);
-  __ Bind(&push_arguments);
-  __ ldr(R3, Address(R2));
-  __ Push(R3);
-  __ AddImmediate(R2, target::kWordSize);
-  __ AddImmediate(R1, 1);
-  __ cmp(R1, Operand(R9));
-  __ b(&push_arguments, LT);
-  __ Bind(&done_push_arguments);
-
-  // Call the Dart code entrypoint.
-  __ LoadImmediate(PP, 0);  // GC safe value into PP.
-  __ mov(CODE_REG, Operand(R0));
-  __ ldr(R0, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ blx(R0);  // R4 is the arguments descriptor array.
-
-  // Get rid of arguments pushed on the stack.
-  __ AddImmediate(
-      SP, FP,
-      target::frame_layout.exit_link_slot_from_entry_fp * target::kWordSize);
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure. Uses R9 as a temporary register for this.
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR,
-                   target::Thread::top_exit_frame_info_offset());
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::exit_through_ffi_offset());
-  __ Pop(R9);
-  __ StoreToOffset(kWord, R9, THR, target::Thread::top_resource_offset());
-
-  // Restore the current VMTag from the stack.
-  __ Pop(R4);
-  __ StoreToOffset(kWord, R4, THR, target::Thread::vm_tag_offset());
-
-  // Restore C++ ABI callee-saved registers.
-  if (TargetCPUFeatures::vfp_supported()) {
-    // Restore FPU registers. 2 D registers per Q register.
-    __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    __ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore CPU registers.
-  __ PopList(kAbiPreservedCpuRegs);
-  __ set_constant_pool_allowed(false);
-
-  // Restore the frame pointer and return.
-  __ LeaveFrame((1 << FP) | (1 << LR));
-  __ Drop(1);
-  __ Ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2695,94 +2541,10 @@
   __ PopList((1 << R0) | (1 << R4));
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure R0, R4 and R9 are preserved.
   __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
   __ Branch(FieldAddress(R0, target::Function::entry_point_offset()));
 }
 
-// Stub for interpreting a function call.
-// R4: Arguments descriptor.
-// R0: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
-    __ b(&ok, EQ);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ LoadFieldFromOffset(kWord, R2, R4,
-                         target::ArgumentsDescriptor::count_offset());
-  __ SmiUntag(R2);
-  __ LoadFieldFromOffset(kWord, R1, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ cmp(R1, Operand(0));
-  __ AddImmediate(R2, R2, 1, NE);  // Include the type arguments.
-
-  // Compute argv.
-  __ mov(R3, Operand(R2, LSL, 2));
-  __ add(R3, FP, Operand(R3));
-  __ AddImmediate(R3,
-                  target::frame_layout.param_end_from_fp * target::kWordSize);
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ rsb(R2, R2, Operand(0));
-
-  // Align frame before entering C++ world. Fifth argument passed on the stack.
-  __ ReserveAlignedFrameSpace(1 * target::kWordSize);
-
-  // Pass arguments in registers.
-  // R0: Function.
-  __ mov(R1, Operand(R4));  // Arguments descriptor.
-  // R2: Negative argc.
-  // R3: Argv.
-  __ str(THR, Address(SP, 0));  // Fifth argument: Thread.
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ StoreToOffset(kWord, FP, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ LoadImmediate(R5, target::Thread::exit_through_runtime_call());
-  __ StoreToOffset(kWord, R5, THR, target::Thread::exit_through_ffi_offset());
-
-  // Mark that the thread is executing VM code.
-  __ LoadFromOffset(kWord, R5, THR,
-                    target::Thread::interpret_call_entry_point_offset());
-  __ StoreToOffset(kWord, R5, THR, target::Thread::vm_tag_offset());
-
-  __ blx(R5);
-
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
-
-  // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(kWord, R2, THR, target::Thread::exit_through_ffi_offset());
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ StoreToOffset(kWord, R2, THR,
-                   target::Thread::top_exit_frame_info_offset());
-
-  __ LeaveStubFrame();
-  __ Ret();
-}
-
 // R9: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -3318,7 +3080,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
   // Clear top exit frame.
   __ LoadImmediate(R2, 0);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 6548ef8..b749ad9 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -91,7 +91,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R8, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -154,7 +154,7 @@
 
   // Retval is next to 1st argument.
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -622,7 +622,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R6, VMTag::kDartCompiledTagId);
+    __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -685,7 +685,7 @@
   __ RestorePinnedRegisters();
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
@@ -1358,7 +1358,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R6, VMTag::kDartTagId);
   __ StoreToOffset(R6, THR, target::Thread::vm_tag_offset());
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -1444,157 +1444,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   LR : points to return address.
-//   R0 : raw code object of the Dart function to call.
-//   R1 : arguments raw descriptor array.
-//   R2 : address of first argument.
-//   R3 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  // Copy the C stack pointer (CSP/R31) into the stack pointer we'll actually
-  // use to access the stack (SP/R15) and set the C stack pointer to near the
-  // stack limit, loaded from the Thread held in R3, to prevent signal handlers
-  // from over-writing Dart frames.
-  __ mov(SP, CSP);
-  __ SetupCSPFromThread(R3);
-  __ Push(LR);  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  // Push code object to PC marker slot.
-  __ ldr(TMP,
-         Address(R3,
-                 target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-  __ Push(TMP);
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
-#elif defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  __ PushNativeCalleeSavedRegisters();
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != R3) {
-    __ mov(THR, R3);
-  }
-
-  // Refresh pinned registers values (inc. write barrier mask and null object).
-  __ RestorePinnedRegisters();
-
-  // Save the current VMTag on the stack.
-  __ LoadFromOffset(R4, THR, target::Thread::vm_tag_offset());
-  __ Push(R4);
-
-  // Save top resource and top exit frame info. Use R6 as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ LoadFromOffset(R6, THR, target::Thread::top_resource_offset());
-  __ StoreToOffset(ZR, THR, target::Thread::top_resource_offset());
-  __ Push(R6);
-
-  __ LoadFromOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-  __ Push(R6);
-  __ LoadImmediate(R6, 0);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-
-  __ LoadFromOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
-  __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
-  // target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
-  // with the code below.
-#if defined(TARGET_OS_FUCHSIA)
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -24);
-#else
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -23);
-#endif
-  __ Push(R6);
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(R6, THR, target::Thread::vm_tag_offset());
-
-  // Load arguments descriptor array into R4, which is passed to Dart code.
-  __ mov(R4, R1);
-
-  // Load number of arguments into R5 and adjust count for type arguments.
-  __ LoadFieldFromOffset(R5, R4, target::ArgumentsDescriptor::count_offset());
-  __ LoadFieldFromOffset(R3, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ AddImmediate(TMP, R5, 1);  // Include the type arguments.
-  __ cmp(R3, Operand(0));
-  __ csinc(R5, R5, TMP, EQ);  // R5 <- (R3 == 0) ? R5 : TMP + 1 (R5 : R5 + 2).
-  __ SmiUntag(R5);
-
-  // R2 points to first argument.
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ cmp(R5, Operand(0));
-  __ b(&done_push_arguments, EQ);  // check if there are arguments.
-  __ LoadImmediate(R1, 0);
-  __ Bind(&push_arguments);
-  __ ldr(R3, Address(R2));
-  __ Push(R3);
-  __ add(R1, R1, Operand(1));
-  __ add(R2, R2, Operand(target::kWordSize));
-  __ cmp(R1, Operand(R5));
-  __ b(&push_arguments, LT);
-  __ Bind(&done_push_arguments);
-
-  // We now load the pool pointer(PP) with a GC safe value as we are about to
-  // invoke dart code. We don't need a real object pool here.
-  // Smi zero does not work because ARM64 assumes PP to be untagged.
-  __ LoadObject(PP, NullObject());
-
-  // Call the Dart code entrypoint.
-  __ mov(CODE_REG, R0);
-  __ ldr(R0, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ blr(R0);  // R4 is the arguments descriptor array.
-
-  // Get rid of arguments pushed on the stack.
-  __ AddImmediate(
-      SP, FP,
-      target::frame_layout.exit_link_slot_from_entry_fp * target::kWordSize);
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure. Uses R6 as a temporary register for this.
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
-  __ Pop(R6);
-  __ StoreToOffset(R6, THR, target::Thread::top_resource_offset());
-
-  // Restore the current VMTag from the stack.
-  __ Pop(R4);
-  __ StoreToOffset(R4, THR, target::Thread::vm_tag_offset());
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ mov(R3, THR);
-#endif
-
-  __ PopNativeCalleeSavedRegisters();  // Clobbers THR
-
-#if defined(TARGET_OS_FUCHSIA)
-  __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
-#elif defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore the frame pointer and C stack pointer and return.
-  __ LeaveFrame();
-  __ Drop(1);
-  __ RestoreCSP();
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2858,106 +2707,11 @@
   __ Pop(R4);  // Restore arg desc.
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure R0, R4, and R5 are preserved.
   __ LoadFieldFromOffset(CODE_REG, R0, target::Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, target::Function::entry_point_offset());
   __ br(R2);
 }
 
-// Stub for interpreting a function call.
-// R4: Arguments descriptor.
-// R0: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ SetPrologueOffset();
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R8, THR, target::Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
-    __ b(&ok, EQ);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
-  __ SmiUntag(R2);
-  __ LoadFieldFromOffset(R1, R4,
-                         target::ArgumentsDescriptor::type_args_len_offset());
-  __ cmp(R1, Operand(0));
-  __ csinc(R2, R2, R2, EQ);  // R2 <- (R1 == 0) ? R2 : R2 + 1.
-
-  // Compute argv.
-  __ add(R3, ZR, Operand(R2, LSL, 3));
-  __ add(R3, FP, Operand(R3));
-  __ AddImmediate(R3,
-                  target::frame_layout.param_end_from_fp * target::kWordSize);
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ neg(R2, R2);
-
-  // Align frame before entering C++ world. No shadow stack space required.
-  __ ReserveAlignedFrameSpace(0 * target::kWordSize);
-
-  // Pass arguments in registers.
-  // R0: Function.
-  __ mov(R1, R4);  // Arguments descriptor.
-  // R2: Negative argc.
-  // R3: Argv.
-  __ mov(R4, THR);  // Thread.
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ StoreToOffset(FP, THR, target::Thread::top_exit_frame_info_offset());
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ LoadImmediate(R5, target::Thread::exit_through_runtime_call());
-  __ StoreToOffset(R5, THR, target::Thread::exit_through_ffi_offset());
-
-  // Mark that the thread is executing VM code.
-  __ LoadFromOffset(R5, THR,
-                    target::Thread::interpret_call_entry_point_offset());
-  __ StoreToOffset(R5, THR, target::Thread::vm_tag_offset());
-
-  // We are entering runtime code, so the C stack pointer must be restored from
-  // the stack limit to the top of the stack. We cache the stack limit address
-  // in a callee-saved register.
-  __ mov(R25, CSP);
-  __ mov(CSP, SP);
-
-  __ blr(R5);
-
-  // Restore SP and CSP.
-  __ mov(SP, CSP);
-  __ mov(CSP, R25);
-
-  // Refresh pinned registers values (inc. write barrier mask and null object).
-  __ RestorePinnedRegisters();
-
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
-  __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
-
-  // Mark that the thread has not exited generated Dart code.
-  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
-
-  __ LeaveStubFrame();
-  __ ret();
-}
-
 // R5: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -3484,7 +3238,7 @@
   // Refresh pinned registers values (inc. write barrier mask and null object).
   __ RestorePinnedRegisters();
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
+  __ LoadImmediate(R2, VMTag::kDartTagId);
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
   // Clear top exit frame.
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index e3eeed6..bc4c545 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -93,7 +93,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -126,7 +126,7 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -364,7 +364,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -400,7 +400,7 @@
   __ movl(Address(ESP, target::kWordSize), ECX);  // Function to call.
   __ call(wrapper_address);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -955,7 +955,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Load arguments descriptor array into EDX.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
@@ -1029,134 +1029,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   ESP : points to return address.
-//   ESP + 4 : target raw code
-//   ESP + 8 : arguments raw descriptor array.
-//   ESP + 12: address of first argument.
-//   ESP + 16 : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  const intptr_t kTargetCodeOffset = 3 * target::kWordSize;
-  const intptr_t kArgumentsDescOffset = 4 * target::kWordSize;
-  const intptr_t kArgumentsOffset = 5 * target::kWordSize;
-  const intptr_t kThreadOffset = 6 * target::kWordSize;
-
-  __ pushl(Address(ESP, 0));  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  // Push code object to PC marker slot.
-  __ movl(EAX, Address(EBP, kThreadOffset));
-  __ pushl(Address(EAX, target::Thread::invoke_dart_code_stub_offset()));
-
-  // Save C++ ABI callee-saved registers.
-  __ pushl(EBX);
-  __ pushl(ESI);
-  __ pushl(EDI);
-
-  // Set up THR, which caches the current thread in Dart code.
-  __ movl(THR, EAX);
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ movl(ECX, Assembler::VMTagAddress());
-  __ pushl(ECX);
-
-  // Save top resource and top exit frame info. Use EDX as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ movl(EDX, Address(THR, target::Thread::top_resource_offset()));
-  __ pushl(EDX);
-  __ movl(Address(THR, target::Thread::top_resource_offset()), Immediate(0));
-
-  __ movl(EAX, Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ pushl(EAX);
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // The constant target::frame_layout.exit_link_slot_from_entry_fp must be
-  // kept in sync with the code below.
-  ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -8);
-  __ movl(EDX, Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ pushl(EDX);
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Load arguments descriptor array into EDX.
-  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
-
-  // Load number of arguments into EBX and adjust count for type arguments.
-  __ movl(EBX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
-  __ cmpl(
-      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ addl(EBX, Immediate(target::ToRawSmi(1)));  // Include the type arguments.
-  __ Bind(&args_count_ok);
-  // Save number of arguments as Smi on stack, replacing ArgumentsDesc.
-  __ movl(Address(EBP, kArgumentsDescOffset), EBX);
-  __ SmiUntag(EBX);
-
-  // Set up arguments for the dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ testl(EBX, EBX);  // check if there are arguments.
-  __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
-  __ movl(EAX, Immediate(0));
-
-  // Compute address of 'arguments array' data area into EDI.
-  __ movl(EDI, Address(EBP, kArgumentsOffset));
-
-  __ Bind(&push_arguments);
-  __ movl(ECX, Address(EDI, EAX, TIMES_4, 0));
-  __ pushl(ECX);
-  __ incl(EAX);
-  __ cmpl(EAX, EBX);
-  __ j(LESS, &push_arguments, Assembler::kNearJump);
-  __ Bind(&done_push_arguments);
-
-  // Call the dart code entrypoint.
-  __ movl(EAX, Address(EBP, kTargetCodeOffset));
-  __ call(FieldAddress(EAX, target::Code::entry_point_offset()));
-
-  // Read the saved number of passed arguments as Smi.
-  __ movl(EDX, Address(EBP, kArgumentsDescOffset));
-  // Get rid of arguments pushed on the stack.
-  __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure.
-  __ popl(Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ popl(Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ popl(Address(THR, target::Thread::top_resource_offset()));
-
-  // Restore the current VMTag from the stack.
-  __ popl(Assembler::VMTagAddress());
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore C++ ABI callee-saved registers.
-  __ popl(EDI);
-  __ popl(ESI);
-  __ popl(EBX);
-
-  // Restore the frame pointer.
-  __ LeaveFrame();
-  __ popl(ECX);
-
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2231,85 +2103,9 @@
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure EAX, ECX, and EDX are preserved.
   __ jmp(FieldAddress(EAX, target::Function::entry_point_offset()));
 }
 
-// Stub for interpreting a function call.
-// EDX: Arguments descriptor.
-// EAX: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ movl(ECX, FieldAddress(EDX, target::ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(ECX);
-  __ cmpl(
-      FieldAddress(EDX, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ incl(ECX);
-  __ Bind(&args_count_ok);
-
-  // Compute argv.
-  __ leal(EBX,
-          Address(EBP, ECX, TIMES_4,
-                  target::frame_layout.param_end_from_fp * target::kWordSize));
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ negl(ECX);
-
-  __ pushl(THR);  // Arg 4: Thread.
-  __ pushl(EBX);  // Arg 3: Argv.
-  __ pushl(ECX);  // Arg 2: Negative argc.
-  __ pushl(EDX);  // Arg 1: Arguments descriptor
-  __ pushl(EAX);  // Arg 0: Function
-
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()), EBP);
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(target::Thread::exit_through_runtime_call()));
-
-  // Mark that the thread is executing VM code.
-  __ movl(EAX,
-          Address(THR, target::Thread::interpret_call_entry_point_offset()));
-  __ movl(Assembler::VMTagAddress(), EAX);
-
-  __ call(EAX);
-
-  __ Drop(5);
-
-  // Mark that the thread is executing Dart code.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Mark that the thread has not exited generated Dart code.
-  __ movl(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  __ LeaveFrame();
-  __ ret();
-}
-
 // ECX: Contains an ICData.
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
 #if defined(PRODUCT)
@@ -2658,7 +2454,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set tag.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
   // Clear top exit frame.
   __ movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
           Immediate(0));
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 7af1a07..26f8292 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -96,7 +96,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(RAX, Immediate(VMTag::kDartCompiledTagId));
+    __ movq(RAX, Immediate(VMTag::kDartTagId));
     __ cmpq(RAX, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -137,7 +137,7 @@
   __ CallCFunction(RBX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -575,7 +575,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
+    __ movq(R8, Immediate(VMTag::kDartTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -614,7 +614,7 @@
   __ CallCFunction(RAX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Mark that the thread has not exited generated Dart code.
   __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
@@ -1287,7 +1287,7 @@
 
   // Mark that the thread is executing Dart code. Do this after initializing the
   // exit link for the profiler.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
@@ -1367,172 +1367,6 @@
   __ ret();
 }
 
-// Called when invoking compiled Dart code from interpreted Dart code.
-// Input parameters:
-//   RSP : points to return address.
-//   RDI : target raw code
-//   RSI : arguments raw descriptor array.
-//   RDX : address of first argument.
-//   RCX : current thread.
-void StubCodeCompiler::GenerateInvokeDartCodeFromBytecodeStub(
-    Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ pushq(Address(RSP, 0));  // Marker for the profiler.
-  __ EnterFrame(0);
-
-  const Register kTargetCodeReg = CallingConventions::kArg1Reg;
-  const Register kArgDescReg = CallingConventions::kArg2Reg;
-  const Register kArg0Reg = CallingConventions::kArg3Reg;
-  const Register kThreadReg = CallingConventions::kArg4Reg;
-
-  // Push code object to PC marker slot.
-  __ pushq(
-      Address(kThreadReg,
-              target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
-
-  // At this point, the stack looks like:
-  // | stub code object
-  // | saved RBP                                         | <-- RBP
-  // | saved PC (return to interpreter's InvokeCompiled) |
-
-  const intptr_t kInitialOffset = 2;
-  // Save arguments descriptor array, later replaced by Smi argument count.
-  const intptr_t kArgumentsDescOffset = -(kInitialOffset)*target::kWordSize;
-  __ pushq(kArgDescReg);
-
-  // Save C++ ABI callee-saved registers.
-  __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                   CallingConventions::kCalleeSaveXmmRegisters);
-
-  // If any additional (or fewer) values are pushed, the offsets in
-  // target::frame_layout.exit_link_slot_from_entry_fp will need to be changed.
-
-  // Set up THR, which caches the current thread in Dart code.
-  if (THR != kThreadReg) {
-    __ movq(THR, kThreadReg);
-  }
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Save the current VMTag on the stack.
-  __ movq(RAX, Assembler::VMTagAddress());
-  __ pushq(RAX);
-
-  // Save top resource and top exit frame info. Use RAX as a temporary register.
-  // StackFrameIterator reads the top exit frame info saved in this frame.
-  __ movq(RAX, Address(THR, target::Thread::top_resource_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::top_resource_offset()), Immediate(0));
-
-  __ movq(RAX, Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  __ movq(RAX, Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ pushq(RAX);
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-// The constant target::frame_layout.exit_link_slot_from_entry_fp must be kept
-// in sync with the code below.
-#if defined(DEBUG)
-  {
-    Label ok;
-    __ leaq(RAX,
-            Address(RBP, target::frame_layout.exit_link_slot_from_entry_fp *
-                             target::kWordSize));
-    __ cmpq(RAX, RSP);
-    __ j(EQUAL, &ok);
-    __ Stop("target::frame_layout.exit_link_slot_from_entry_fp mismatch");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Mark that the thread is executing Dart code. Do this after initializing the
-  // exit link for the profiler.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Load arguments descriptor array into R10, which is passed to Dart code.
-  __ movq(R10, kArgDescReg);
-
-  // Push arguments. At this point we only need to preserve kTargetCodeReg.
-  ASSERT(kTargetCodeReg != RDX);
-
-  // Load number of arguments into RBX and adjust count for type arguments.
-  __ movq(RBX, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
-  __ cmpq(
-      FieldAddress(R10, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ addq(RBX, Immediate(target::ToRawSmi(1)));  // Include the type arguments.
-  __ Bind(&args_count_ok);
-  // Save number of arguments as Smi on stack, replacing saved ArgumentsDesc.
-  __ movq(Address(RBP, kArgumentsDescOffset), RBX);
-  __ SmiUntag(RBX);
-
-  // Compute address of first argument into RDX.
-  if (kArg0Reg != RDX) {  // Different registers on WIN64.
-    __ movq(RDX, kArg0Reg);
-  }
-
-  // Set up arguments for the Dart call.
-  Label push_arguments;
-  Label done_push_arguments;
-  __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
-  __ LoadImmediate(RAX, Immediate(0));
-  __ Bind(&push_arguments);
-  __ pushq(Address(RDX, RAX, TIMES_8, 0));
-  __ incq(RAX);
-  __ cmpq(RAX, RBX);
-  __ j(LESS, &push_arguments, Assembler::kNearJump);
-  __ Bind(&done_push_arguments);
-
-  // Call the Dart code entrypoint.
-  __ xorq(PP, PP);  // GC-safe value into PP.
-  __ movq(CODE_REG, kTargetCodeReg);
-  __ movq(kTargetCodeReg,
-          FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ call(kTargetCodeReg);  // R10 is the arguments descriptor array.
-
-  // Read the saved number of passed arguments as Smi.
-  __ movq(RDX, Address(RBP, kArgumentsDescOffset));
-
-  // Get rid of arguments pushed on the stack.
-  __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
-
-  // Restore the saved top exit frame info and top resource back into the
-  // Isolate structure.
-  __ popq(Address(THR, target::Thread::top_exit_frame_info_offset()));
-  __ popq(Address(THR, target::Thread::exit_through_ffi_offset()));
-  __ popq(Address(THR, target::Thread::top_resource_offset()));
-
-  // Restore the current VMTag from the stack.
-  __ popq(Assembler::VMTagAddress());
-
-#if defined(USING_SHADOW_CALL_STACK)
-#error Unimplemented
-#endif
-
-  // Restore C++ ABI callee-saved registers.
-  __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                  CallingConventions::kCalleeSaveXmmRegisters);
-  __ set_constant_pool_allowed(false);
-
-  // Restore the frame pointer.
-  __ LeaveFrame();
-  __ popq(RCX);
-
-  __ ret();
-}
-
 // Helper to generate space allocation of context stub.
 // This does not initialise the fields of the context.
 // Input:
@@ -2812,101 +2646,11 @@
   __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
 
-  // When using the interpreter, the function's code may now point to the
-  // InterpretCall stub. Make sure RAX, R10, and RBX are preserved.
   __ movq(CODE_REG, FieldAddress(RAX, target::Function::code_offset()));
   __ movq(RCX, FieldAddress(RAX, target::Function::entry_point_offset()));
   __ jmp(RCX);
 }
 
-// Stub for interpreting a function call.
-// R10: Arguments descriptor.
-// RAX: Function.
-void StubCodeCompiler::GenerateInterpretCallStub(Assembler* assembler) {
-  if (FLAG_precompiled_mode) {
-    __ Stop("Not using interpreter");
-    return;
-  }
-
-  __ EnterStubFrame();
-
-#if defined(DEBUG)
-  {
-    Label ok;
-    // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
-    __ cmpq(R8, Assembler::VMTagAddress());
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Not coming from Dart code.");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Adjust arguments count for type arguments vector.
-  __ movq(R11, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(R11);
-  __ cmpq(
-      FieldAddress(R10, target::ArgumentsDescriptor::type_args_len_offset()),
-      Immediate(0));
-  Label args_count_ok;
-  __ j(EQUAL, &args_count_ok, Assembler::kNearJump);
-  __ incq(R11);
-  __ Bind(&args_count_ok);
-
-  // Compute argv.
-  __ leaq(R12,
-          Address(RBP, R11, TIMES_8,
-                  target::frame_layout.param_end_from_fp * target::kWordSize));
-
-  // Indicate decreasing memory addresses of arguments with negative argc.
-  __ negq(R11);
-
-  // Reserve shadow space for args and align frame before entering C++ world.
-  __ subq(RSP, Immediate(5 * target::kWordSize));
-  if (OS::ActivationFrameAlignment() > 1) {
-    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
-  }
-
-  __ movq(CallingConventions::kArg1Reg, RAX);  // Function.
-  __ movq(CallingConventions::kArg2Reg, R10);  // Arguments descriptor.
-  __ movq(CallingConventions::kArg3Reg, R11);  // Negative argc.
-  __ movq(CallingConventions::kArg4Reg, R12);  // Argv.
-
-#if defined(TARGET_OS_WINDOWS)
-  __ movq(Address(RSP, 0 * target::kWordSize), THR);  // Thread.
-#else
-  __ movq(CallingConventions::kArg5Reg, THR);  // Thread.
-#endif
-  // Save exit frame information to enable stack walking as we are about
-  // to transition to Dart VM C++ code.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()), RBP);
-
-  // Mark that the thread exited generated code through a runtime call.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(target::Thread::exit_through_runtime_call()));
-
-  // Mark that the thread is executing VM code.
-  __ movq(RAX,
-          Address(THR, target::Thread::interpret_call_entry_point_offset()));
-  __ movq(Assembler::VMTagAddress(), RAX);
-
-  __ call(RAX);
-
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
-
-  // Mark that the thread has not exited generated Dart code.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
-
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
-
-  __ LeaveStubFrame();
-  __ ret();
-}
-
 // RBX: Contains an ICData.
 // TOS(0): return address (Dart code).
 void StubCodeCompiler::GenerateICCallBreakpointStub(Assembler* assembler) {
@@ -3422,7 +3166,7 @@
   __ Bind(&exit_through_non_ffi);
 
   // Set the tag.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
   // Clear top exit frame.
   __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
           Immediate(0));
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 219dc7c..1a5afc1 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -6,7 +6,6 @@
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/code_patcher.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/dart_api_impl.h"
 #include "vm/heap/safepoint.h"
 #include "vm/kernel_isolate.h"
@@ -126,30 +125,8 @@
   Function& func =
       Function::Handle(cls.LookupStaticFunction(function_foo_name));
   EXPECT(!func.HasCode());
-  if (!FLAG_enable_interpreter) {
-    CompilerTest::TestCompileFunction(func);
-    EXPECT(func.HasCode());
-    return;
-  }
-  // Bytecode loading must happen on the main thread. Ensure the bytecode is
-  // loaded before asking for an unoptimized compile on a background thread.
-  kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
-#if !defined(PRODUCT)
-  // Constant in product mode.
-  FLAG_background_compilation = true;
-#endif
-  Isolate* isolate = thread->isolate();
-  BackgroundCompiler::Start(isolate);
-  isolate->background_compiler()->Compile(func);
-  Monitor* m = new Monitor();
-  {
-    MonitorLocker ml(m);
-    while (!func.HasCode()) {
-      ml.WaitWithSafepointCheck(thread, 1);
-    }
-  }
-  delete m;
-  BackgroundCompiler::Stop(isolate);
+  CompilerTest::TestCompileFunction(func);
+  EXPECT(func.HasCode());
 }
 
 ISOLATE_UNIT_TEST_CASE(RegenerateAllocStubs) {
diff --git a/runtime/vm/constants_kbc.cc b/runtime/vm/constants_kbc.cc
deleted file mode 100644
index adbe0421..0000000
--- a/runtime/vm/constants_kbc.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2019, 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.
-
-#define RUNTIME_VM_CONSTANTS_H_  // To work around include guard.
-#include "vm/constants_kbc.h"
-
-namespace dart {
-
-static const intptr_t kInstructionSize0 = 1;
-static const intptr_t kInstructionSizeA = 2;
-static const intptr_t kInstructionSizeD = 2;
-static const intptr_t kInstructionSizeWideD = 5;
-static const intptr_t kInstructionSizeX = 2;
-static const intptr_t kInstructionSizeWideX = 5;
-static const intptr_t kInstructionSizeT = 2;
-static const intptr_t kInstructionSizeWideT = 4;
-static const intptr_t kInstructionSizeA_E = 3;
-static const intptr_t kInstructionSizeWideA_E = 6;
-static const intptr_t kInstructionSizeA_Y = 3;
-static const intptr_t kInstructionSizeWideA_Y = 6;
-static const intptr_t kInstructionSizeD_F = 3;
-static const intptr_t kInstructionSizeWideD_F = 6;
-static const intptr_t kInstructionSizeA_B_C = 4;
-
-const intptr_t KernelBytecode::kInstructionSize[] = {
-#define SIZE_ORDN(encoding) kInstructionSize##encoding
-#define SIZE_WIDE(encoding) kInstructionSizeWide##encoding
-#define SIZE_RESV(encoding) SIZE_ORDN(encoding)
-#define SIZE(name, encoding, kind, op1, op2, op3) SIZE_##kind(encoding),
-    KERNEL_BYTECODES_LIST(SIZE)
-#undef SIZE_ORDN
-#undef SIZE_WIDE
-#undef SIZE_RESV
-#undef SIZE
-};
-
-#define DECLARE_INSTRUCTIONS(name, fmt, kind, fmta, fmtb, fmtc)                \
-  static const KBCInstr k##name##Instructions[] = {                            \
-      KernelBytecode::k##name,                                                 \
-      KernelBytecode::kReturnTOS,                                              \
-  };
-INTERNAL_KERNEL_BYTECODES_LIST(DECLARE_INSTRUCTIONS)
-#undef DECLARE_INSTRUCTIONS
-
-void KernelBytecode::GetVMInternalBytecodeInstructions(
-    Opcode opcode,
-    const KBCInstr** instructions,
-    intptr_t* instructions_size) {
-  switch (opcode) {
-#define CASE(name, fmt, kind, fmta, fmtb, fmtc)                                \
-  case k##name:                                                                \
-    *instructions = k##name##Instructions;                                     \
-    *instructions_size = sizeof(k##name##Instructions);                        \
-    return;
-
-    INTERNAL_KERNEL_BYTECODES_LIST(CASE)
-#undef CASE
-
-    default:
-      UNREACHABLE();
-  }
-}
-
-static const KBCInstr kNativeCallToGrowableListReturnTrampoline[] = {
-    KernelBytecode::kDirectCall,
-    0,                                              // target (doesn't matter)
-    KernelBytecode::kNativeCallToGrowableListArgc,  // number of arguments
-    KernelBytecode::kReturnTOS,
-};
-
-const KBCInstr* KernelBytecode::GetNativeCallToGrowableListReturnTrampoline() {
-  return KernelBytecode::Next(&kNativeCallToGrowableListReturnTrampoline[0]);
-}
-
-}  // namespace dart
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
deleted file mode 100644
index cae8a97..0000000
--- a/runtime/vm/constants_kbc.h
+++ /dev/null
@@ -1,1076 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_CONSTANTS_KBC_H_
-#define RUNTIME_VM_CONSTANTS_KBC_H_
-
-#include "platform/assert.h"
-#include "platform/globals.h"
-#include "platform/utils.h"
-
-namespace dart {
-
-// clang-format off
-// List of KernelBytecode instructions.
-//
-// INTERPRETER STATE
-//
-//      current frame info (see stack_frame_kbc.h for layout)
-//        v-----^-----v
-//   ~----+----~ ~----+-------+-------+-~ ~-+-------+-------+-~
-//   ~    |    ~ ~    | FP[0] | FP[1] | ~ ~ | SP[-1]| SP[0] |
-//   ~----+----~ ~----+-------+-------+-~ ~-+-------+-------+-~
-//                    ^                             ^
-//                    FP                            SP
-//
-//
-// The state of execution is captured in few interpreter registers:
-//
-//   FP - base of the current frame
-//   SP - top of the stack (TOS) for the current frame
-//   PP - object pool for the currently execution function
-//
-// Frame info stored below FP additionally contains pointers to the currently
-// executing function and code.
-//
-// In the unoptimized code most of bytecodes take operands implicitly from
-// stack and store results again on the stack. Constant operands are usually
-// taken from the object pool by index.
-//
-// ENCODING
-//
-// Each instruction starts with opcode byte. Certain instructions have
-// wide encoding variant. In such case, the least significant bit of opcode is
-// not set for compact variant and set for wide variant.
-//
-// The following operand encodings are used:
-//
-//   0........8.......16.......24.......32.......40.......48
-//   +--------+
-//   | opcode |                              0: no operands
-//   +--------+
-//
-//   +--------+--------+
-//   | opcode |    A   |                     A: unsigned 8-bit operand
-//   +--------+--------+
-//
-//   +--------+--------+
-//   | opcode |   D    |                     D: unsigned 8/32-bit operand
-//   +--------+--------+
-//
-//   +--------+----------------------------------+
-//   | opcode |                D                 |            D (wide)
-//   +--------+----------------------------------+
-//
-//   +--------+--------+
-//   | opcode |   X    |                     X: signed 8/32-bit operand
-//   +--------+--------+
-//
-//   +--------+----------------------------------+
-//   | opcode |                X                 |            X (wide)
-//   +--------+----------------------------------+
-//
-//   +--------+--------+
-//   | opcode |    T   |                     T: signed 8/24-bit operand
-//   +--------+--------+
-//
-//   +--------+--------------------------+
-//   | opcode |            T             |   T (wide)
-//   +--------+--------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    A   |   E    |            A_E: unsigned 8-bit operand and
-//   +--------+--------+--------+                 unsigned 8/32-bit operand
-//
-//   +--------+--------+----------------------------------+
-//   | opcode |    A   |                 E                |   A_E (wide)
-//   +--------+--------+----------------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    A   |   Y    |            A_Y: unsigned 8-bit operand and
-//   +--------+--------+--------+                 signed 8/32-bit operand
-//
-//   +--------+--------+----------------------------------+
-//   | opcode |    A   |                 Y                |   A_Y (wide)
-//   +--------+--------+----------------------------------+
-//
-//   +--------+--------+--------+
-//   | opcode |    D   |   F    |            D_F: unsigned 8/32-bit operand and
-//   +--------+--------+--------+                 unsigned 8-bit operand
-//
-//   +--------+----------------------------------+--------+
-//   | opcode |                 D                |    F   |   D_F (wide)
-//   +--------+----------------------------------+--------+
-//
-//   +--------+--------+--------+--------+
-//   | opcode |    A   |    B   |    C   |   A_B_C: 3 unsigned 8-bit operands
-//   +--------+--------+--------+--------+
-//
-//
-// INSTRUCTIONS
-//
-//  - Trap
-//
-//    Unreachable instruction.
-//
-//  - Entry rD
-//
-//    Function prologue for the function
-//        rD - number of local slots to reserve;
-//
-//  - EntryFixed A, D
-//
-//    Function prologue for functions without optional arguments.
-//    Checks number of arguments.
-//        A - expected number of positional arguments;
-//        D - number of local slots to reserve;
-//
-//  - EntryOptional A, B, C
-//
-//    Function prologue for the function with optional or named arguments:
-//        A - expected number of positional arguments;
-//        B - number of optional arguments;
-//        C - number of named arguments;
-//
-//    Only one of B and C can be not 0.
-//
-//    If B is not 0 then EntryOptional bytecode is followed by B LoadConstant
-//    bytecodes specifying default values for optional arguments.
-//
-//    If C is not 0 then EntryOptional is followed by 2 * C LoadConstant
-//    bytecodes.
-//    Bytecode at 2 * i specifies name of the i-th named argument and at
-//    2 * i + 1 default value. rA part of the LoadConstant bytecode specifies
-//    the location of the parameter on the stack. Here named arguments are
-//    sorted alphabetically to enable linear matching similar to how function
-//    prologues are implemented on other architectures.
-//
-//    Note: Unlike Entry bytecode EntryOptional does not setup the frame for
-//    local variables this is done by a separate bytecode Frame, which should
-//    follow EntryOptional and its LoadConstant instructions.
-//
-//  - LoadConstant rA, D
-//
-//    Used in conjunction with EntryOptional instruction to describe names and
-//    default values of optional parameters.
-//
-//  - Frame D
-//
-//    Reserve and initialize with null space for D local variables.
-//
-//  - CheckFunctionTypeArgs A, D
-//
-//    Check for a passed-in type argument vector of length A and
-//    store it at FP[D].
-//
-//  - CheckStack A
-//
-//    Compare SP against isolate stack limit and call StackOverflow handler if
-//    necessary. Should be used in prologue (A = 0), or at the beginning of
-//    a loop with depth A.
-//
-//  - Allocate D
-//
-//    Allocate object of class PP[D] with no type arguments.
-//
-//  - AllocateT
-//
-//    Allocate object of class SP[0] with type arguments SP[-1].
-//
-//  - CreateArrayTOS
-//
-//    Allocate array of length SP[0] with type arguments SP[-1].
-//
-//  - AllocateContext A, D
-//
-//    Allocate Context object holding D context variables.
-//    A is a static ID of the context. Static ID of a context may be used to
-//    disambiguate accesses to different context objects.
-//    Context objects with the same ID should have the same number of
-//    context variables.
-//
-//  - CloneContext A, D
-//
-//    Clone Context object SP[0] holding D context variables.
-//    A is a static ID of the context. Cloned context has the same ID.
-//
-//  - LoadContextParent
-//
-//    Load parent from context SP[0].
-//
-//  - StoreContextParent
-//
-//    Store context SP[0] into `parent` field of context SP[-1].
-//
-//  - LoadContextVar A, D
-//
-//    Load value from context SP[0] at index D.
-//    A is a static ID of the context.
-//
-//  - StoreContextVar A, D
-//
-//    Store value SP[0] into context SP[-1] at index D.
-//    A is a static ID of the context.
-//
-//  - PushConstant D
-//
-//    Push value at index D from constant pool onto the stack.
-//
-//  - PushNull
-//
-//    Push `null` onto the stack.
-//
-//  - PushTrue
-//
-//    Push `true` onto the stack.
-//
-//  - PushFalse
-//
-//    Push `false` onto the stack.
-//
-//  - PushInt rX
-//
-//    Push int rX onto the stack.
-//
-//  - Drop1
-//
-//    Drop 1 value from the stack
-//
-//  - Push rX
-//
-//    Push FP[rX] to the stack.
-//
-//  - StoreLocal rX; PopLocal rX
-//
-//    Store top of the stack into FP[rX] and pop it if needed.
-//
-//  - LoadFieldTOS D
-//
-//    Push value at offset (in words) PP[D] from object SP[0].
-//
-//  - StoreFieldTOS D
-//
-//    Store value SP[0] into object SP[-1] at offset (in words) PP[D].
-//
-//  - StoreIndexedTOS
-//
-//    Store SP[0] into array SP[-2] at index SP[-1]. No typechecking is done.
-//    SP[-2] is assumed to be a RawArray, SP[-1] to be a smi.
-//
-//  - PushStatic D
-//
-//    Pushes value of the static field PP[D] on to the stack.
-//
-//  - StoreStaticTOS D
-//
-//    Stores TOS into the static field PP[D].
-//
-//  - Jump target
-//
-//    Jump to the given target. Target is specified as offset from the PC of the
-//    jump instruction.
-//
-//  - JumpIfNoAsserts target
-//
-//    Jump to the given target if assertions are not enabled.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - JumpIfNotZeroTypeArgs target
-//
-//    Jump to the given target if number of passed function type
-//    arguments is not zero.
-//    Target is specified as offset from the PC of the jump instruction.
-//
-//  - JumpIfEqStrict target; JumpIfNeStrict target
-//
-//    Jump to the given target if SP[-1] is the same (JumpIfEqStrict) /
-//    not the same (JumpIfNeStrict) object as SP[0].
-//
-//  - JumpIfTrue target; JumpIfFalse target
-//  - JumpIfNull target; JumpIfNotNull target
-//
-//    Jump to the given target if SP[0] is true/false/null/not null.
-//
-//  - IndirectStaticCall ArgC, D
-//
-//    Invoke the function given by the ICData in SP[0] with arguments
-//    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
-//    indicates whether the first argument is a type argument vector.
-//
-//  - DirectCall ArgC, D
-//
-//    Invoke the function PP[D] with arguments
-//    SP[-(ArgC-1)], ..., SP[0] and argument descriptor PP[D+1].
-//
-//  - InterfaceCall ArgC, D
-//
-//    Lookup and invoke method using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    Method has to be declared (explicitly or implicitly) in an interface
-//    implemented by a receiver, and passed arguments are valid for the
-//    interface method declaration.
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - UncheckedInterfaceCall ArgC, D
-//
-//    Same as InterfaceCall, but can omit type checks of generic-covariant
-//    parameters.
-//
-//  - DynamicCall ArgC, D
-//
-//    Lookup and invoke method using ICData in PP[D]
-//    with arguments SP[-(1+ArgC)], ..., SP[-1].
-//    The ICData indicates whether the first argument is a type argument vector.
-//
-//  - NativeCall D
-//
-//    Invoke native function described by array at pool[D].
-//    array[0] is wrapper, array[1] is function, array[2] is argc_tag.
-//
-//  - ReturnTOS
-//
-//    Return to the caller using a value from the top-of-stack as a result.
-//
-//    Note: return instruction knows how many arguments to remove from the
-//    stack because it can look at the call instruction at caller's PC and
-//    take argument count from it.
-//
-//  - AssertAssignable A, D
-//
-//    Assert that instance SP[-4] is assignable to variable named SP[0] of
-//    type SP[-1] with instantiator type arguments SP[-3] and function type
-//    arguments SP[-2] using SubtypeTestCache PP[D].
-//    If A is 1, then the instance may be a Smi.
-//
-//    Instance remains on stack. Other arguments are consumed.
-//
-//  - AssertBoolean A
-//
-//    Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0).
-//
-//  - AssertSubtype
-//
-//    Assert that one type is a subtype of another.  Throws a TypeError
-//    otherwise.  The stack has the following arguments on it:
-//
-//        SP[-4]  instantiator type args
-//        SP[-3]  function type args
-//        SP[-2]  sub_type
-//        SP[-1]  super_type
-//        SP[-0]  dst_name
-//
-//    All 5 arguments are consumed from the stack and no results is pushed.
-//
-//  - LoadTypeArgumentsField D
-//
-//    Load instantiator type arguments from an instance SP[0].
-//    PP[D] = offset (in words) of type arguments field corresponding
-//    to an instance's class.
-//
-//  - InstantiateType D
-//
-//    Instantiate type PP[D] with instantiator type arguments SP[-1] and
-//    function type arguments SP[0].
-//
-//  - InstantiateTypeArgumentsTOS A, D
-//
-//    Instantiate type arguments PP[D] with instantiator type arguments SP[-1]
-//    and function type arguments SP[0]. A != 0 indicates that resulting type
-//    arguments are all dynamic if both instantiator and function type
-//    arguments are all dynamic.
-//
-//  - Throw A
-//
-//    Throw (Rethrow if A != 0) exception. Exception object and stack object
-//    are taken from TOS.
-//
-//  - MoveSpecial A, rX
-//
-//    Copy value from special variable to FP[rX]. Currently only
-//    used to pass exception object (A = 0) and stack trace object (A = 1) to
-//    catch handler.
-//
-//  - SetFrame A
-//
-//    Reinitialize SP assuming that current frame has size A.
-//    Used to drop temporaries from the stack in the exception handler.
-//
-//  - BooleanNegateTOS
-//
-//    SP[0] = !SP[0]
-//
-//  - EqualsNull
-//
-//    SP[0] = (SP[0] == null) ? true : false
-//
-//  - NegateInt
-//
-//    Equivalent to invocation of unary int operator-.
-//    Receiver should have static type int.
-//    Check SP[0] for null; SP[0] = -SP[0].
-//
-//  - AddInt; SubInt; MulInt; TruncDivInt; ModInt; BitAndInt; BitOrInt;
-//    BitXorInt; ShlInt; ShrInt
-//
-//    Equivalent to invocation of binary int operator +, -, *, ~/, %, &, |,
-//    ^, << or >>. Receiver and argument should have static type int.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
-//
-//  - CompareIntEq; CompareIntGt; CompareIntLt; CompareIntGe; CompareIntLe
-//
-//    Equivalent to invocation of binary int operator ==, >, <, >= or <=.
-//    Receiver and argument should have static type int.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
-//
-//  - NegateDouble
-//
-//    Equivalent to invocation of unary double operator-.
-//    Receiver should have static type double.
-//    Check SP[0] for null; SP[0] = -SP[0].
-//
-//  - AddDouble; SubDouble; MulDouble; DivDouble
-//
-//    Equivalent to invocation of binary int operator +, -, *, /.
-//    Receiver and argument should have static type double.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0].
-//
-//  - CompareDoubleEq; CompareDoubleGt; CompareDoubleLt; CompareDoubleGe;
-//    CompareDoubleLe
-//
-//    Equivalent to invocation of binary double operator ==, >, <, >= or <=.
-//    Receiver and argument should have static type double.
-//    Check SP[-1] and SP[0] for null; push SP[-1] <op> SP[0] ? true : false.
-//
-//  - AllocateClosure D
-//
-//    Allocate closure object for closure function ConstantPool[D].
-//
-// BYTECODE LIST FORMAT
-//
-// KernelBytecode list below is specified using the following format:
-//
-//     V(BytecodeName, OperandForm, BytecodeKind, Op1, Op2, Op3)
-//
-// - OperandForm specifies operand encoding and should be one of 0, A, D, X, T,
-//   A_E, A_Y, D_F or A_B_C (see ENCODING section above).
-//
-// - BytecodeKind is one of WIDE, RESV (reserved), ORDN (ordinary)
-//
-// - Op1, Op2, Op3 specify operand meaning. Possible values:
-//
-//     ___ ignored / non-existent operand
-//     num immediate operand
-//     lit constant literal from object pool
-//     reg register (unsigned FP relative local)
-//     xeg x-register (signed FP relative local)
-//     tgt jump target relative to the PC of the current instruction
-//
-// TODO(vegorov) jump targets should be encoded relative to PC of the next
-//               instruction because PC is incremented immediately after fetch
-//               and before decoding.
-//
-#define PUBLIC_KERNEL_BYTECODES_LIST(V)                                        \
-  V(UnusedOpcode000,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode001,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode002,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode003,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode004,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode005,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode006,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode007,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode008,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode009,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode010,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode011,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode012,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode013,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode014,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode015,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode016,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode017,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode018,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode019,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode020,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode021,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode022,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode023,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode024,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode025,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode026,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode027,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode028,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode029,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode030,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode031,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode032,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode033,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode034,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode035,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode036,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode037,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode038,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode039,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode040,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode041,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode042,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode043,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode044,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode045,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode046,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode047,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode048,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode049,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode050,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode051,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode052,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode053,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode054,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode055,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode056,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode057,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode058,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode059,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode060,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode061,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode062,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode063,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode064,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode065,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode066,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode067,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode068,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode069,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode070,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode071,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode072,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode073,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode074,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode075,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode076,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode077,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode078,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode079,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode080,                       0, RESV, ___, ___, ___)             \
-  V(UnusedOpcode081,                       0, RESV, ___, ___, ___)             \
-  V(JumpIfInitialized,                     T, ORDN, tgt, ___, ___)             \
-  V(JumpIfInitialized_Wide,                T, WIDE, tgt, ___, ___)             \
-  V(PushUninitializedSentinel,             0, ORDN, ___, ___, ___)             \
-  V(Trap,                                  0, ORDN, ___, ___, ___)             \
-  V(Entry,                                 D, ORDN, num, ___, ___)             \
-  V(Entry_Wide,                            D, WIDE, num, ___, ___)             \
-  V(EntryFixed,                          A_E, ORDN, num, num, ___)             \
-  V(EntryFixed_Wide,                     A_E, WIDE, num, num, ___)             \
-  V(EntryOptional,                     A_B_C, ORDN, num, num, num)             \
-  V(Unused00,                              0, RESV, ___, ___, ___)             \
-  V(LoadConstant,                        A_E, ORDN, reg, lit, ___)             \
-  V(LoadConstant_Wide,                   A_E, WIDE, reg, lit, ___)             \
-  V(Frame,                                 D, ORDN, num, ___, ___)             \
-  V(Frame_Wide,                            D, WIDE, num, ___, ___)             \
-  V(CheckFunctionTypeArgs,               A_E, ORDN, num, reg, ___)             \
-  V(CheckFunctionTypeArgs_Wide,          A_E, WIDE, num, reg, ___)             \
-  V(CheckStack,                            A, ORDN, num, ___, ___)             \
-  V(DebugCheck,                            0, ORDN, ___, ___, ___)             \
-  V(JumpIfUnchecked,                       T, ORDN, tgt, ___, ___)             \
-  V(JumpIfUnchecked_Wide,                  T, WIDE, tgt, ___, ___)             \
-  V(Allocate,                              D, ORDN, lit, ___, ___)             \
-  V(Allocate_Wide,                         D, WIDE, lit, ___, ___)             \
-  V(AllocateT,                             0, ORDN, ___, ___, ___)             \
-  V(CreateArrayTOS,                        0, ORDN, ___, ___, ___)             \
-  V(AllocateClosure,                       D, ORDN, lit, ___, ___)             \
-  V(AllocateClosure_Wide,                  D, WIDE, lit, ___, ___)             \
-  V(AllocateContext,                     A_E, ORDN, num, num, ___)             \
-  V(AllocateContext_Wide,                A_E, WIDE, num, num, ___)             \
-  V(CloneContext,                        A_E, ORDN, num, num, ___)             \
-  V(CloneContext_Wide,                   A_E, WIDE, num, num, ___)             \
-  V(LoadContextParent,                     0, ORDN, ___, ___, ___)             \
-  V(StoreContextParent,                    0, ORDN, ___, ___, ___)             \
-  V(LoadContextVar,                      A_E, ORDN, num, num, ___)             \
-  V(LoadContextVar_Wide,                 A_E, WIDE, num, num, ___)             \
-  V(Unused04,                              0, RESV, ___, ___, ___)             \
-  V(Unused05,                              0, RESV, ___, ___, ___)             \
-  V(StoreContextVar,                     A_E, ORDN, num, num, ___)             \
-  V(StoreContextVar_Wide,                A_E, WIDE, num, num, ___)             \
-  V(PushConstant,                          D, ORDN, lit, ___, ___)             \
-  V(PushConstant_Wide,                     D, WIDE, lit, ___, ___)             \
-  V(Unused06,                              0, RESV, ___, ___, ___)             \
-  V(Unused07,                              0, RESV, ___, ___, ___)             \
-  V(PushTrue,                              0, ORDN, ___, ___, ___)             \
-  V(PushFalse,                             0, ORDN, ___, ___, ___)             \
-  V(PushInt,                               X, ORDN, num, ___, ___)             \
-  V(PushInt_Wide,                          X, WIDE, num, ___, ___)             \
-  V(Unused08,                              0, RESV, ___, ___, ___)             \
-  V(Unused09,                              0, RESV, ___, ___, ___)             \
-  V(Unused10,                              0, RESV, ___, ___, ___)             \
-  V(Unused11,                              0, RESV, ___, ___, ___)             \
-  V(PushNull,                              0, ORDN, ___, ___, ___)             \
-  V(Drop1,                                 0, ORDN, ___, ___, ___)             \
-  V(Push,                                  X, ORDN, xeg, ___, ___)             \
-  V(Push_Wide,                             X, WIDE, xeg, ___, ___)             \
-  V(Unused12,                              0, RESV, ___, ___, ___)             \
-  V(Unused13,                              0, RESV, ___, ___, ___)             \
-  V(Unused14,                              0, RESV, ___, ___, ___)             \
-  V(Unused15,                              0, RESV, ___, ___, ___)             \
-  V(Unused16,                              0, RESV, ___, ___, ___)             \
-  V(Unused17,                              0, RESV, ___, ___, ___)             \
-  V(PopLocal,                              X, ORDN, xeg, ___, ___)             \
-  V(PopLocal_Wide,                         X, WIDE, xeg, ___, ___)             \
-  V(LoadStatic,                            D, ORDN, lit, ___, ___)             \
-  V(LoadStatic_Wide,                       D, WIDE, lit, ___, ___)             \
-  V(StoreLocal,                            X, ORDN, xeg, ___, ___)             \
-  V(StoreLocal_Wide,                       X, WIDE, xeg, ___, ___)             \
-  V(LoadFieldTOS,                          D, ORDN, lit, ___, ___)             \
-  V(LoadFieldTOS_Wide,                     D, WIDE, lit, ___, ___)             \
-  V(StoreFieldTOS,                         D, ORDN, lit, ___, ___)             \
-  V(StoreFieldTOS_Wide,                    D, WIDE, lit, ___, ___)             \
-  V(StoreIndexedTOS,                       0, ORDN, ___, ___, ___)             \
-  V(Unused20,                              0, RESV, ___, ___, ___)             \
-  V(InitLateField,                         D, ORDN, lit, ___, ___)             \
-  V(InitLateField_Wide,                    D, WIDE, lit, ___, ___)             \
-  V(StoreStaticTOS,                        D, ORDN, lit, ___, ___)             \
-  V(StoreStaticTOS_Wide,                   D, WIDE, lit, ___, ___)             \
-  V(Jump,                                  T, ORDN, tgt, ___, ___)             \
-  V(Jump_Wide,                             T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNoAsserts,                       T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNoAsserts_Wide,                  T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNotZeroTypeArgs,                 T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNotZeroTypeArgs_Wide,            T, WIDE, tgt, ___, ___)             \
-  V(JumpIfEqStrict,                        T, ORDN, tgt, ___, ___)             \
-  V(JumpIfEqStrict_Wide,                   T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNeStrict,                        T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNeStrict_Wide,                   T, WIDE, tgt, ___, ___)             \
-  V(JumpIfTrue,                            T, ORDN, tgt, ___, ___)             \
-  V(JumpIfTrue_Wide,                       T, WIDE, tgt, ___, ___)             \
-  V(JumpIfFalse,                           T, ORDN, tgt, ___, ___)             \
-  V(JumpIfFalse_Wide,                      T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNull,                            T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNull_Wide,                       T, WIDE, tgt, ___, ___)             \
-  V(JumpIfNotNull,                         T, ORDN, tgt, ___, ___)             \
-  V(JumpIfNotNull_Wide,                    T, WIDE, tgt, ___, ___)             \
-  V(DirectCall,                          D_F, ORDN, num, num, ___)             \
-  V(DirectCall_Wide,                     D_F, WIDE, num, num, ___)             \
-  V(UncheckedDirectCall,                 D_F, ORDN, num, num, ___)             \
-  V(UncheckedDirectCall_Wide,            D_F, WIDE, num, num, ___)             \
-  V(InterfaceCall,                       D_F, ORDN, num, num, ___)             \
-  V(InterfaceCall_Wide,                  D_F, WIDE, num, num, ___)             \
-  V(Unused23,                              0, RESV, ___, ___, ___)             \
-  V(Unused24,                              0, RESV, ___, ___, ___)             \
-  V(InstantiatedInterfaceCall,           D_F, ORDN, num, num, ___)             \
-  V(InstantiatedInterfaceCall_Wide,      D_F, WIDE, num, num, ___)             \
-  V(UncheckedClosureCall,                D_F, ORDN, num, num, ___)             \
-  V(UncheckedClosureCall_Wide,           D_F, WIDE, num, num, ___)             \
-  V(UncheckedInterfaceCall,              D_F, ORDN, num, num, ___)             \
-  V(UncheckedInterfaceCall_Wide,         D_F, WIDE, num, num, ___)             \
-  V(DynamicCall,                         D_F, ORDN, num, num, ___)             \
-  V(DynamicCall_Wide,                    D_F, WIDE, num, num, ___)             \
-  V(NativeCall,                            D, ORDN, lit, ___, ___)             \
-  V(NativeCall_Wide,                       D, WIDE, lit, ___, ___)             \
-  V(ReturnTOS,                             0, ORDN, ___, ___, ___)             \
-  V(Unused29,                              0, RESV, ___, ___, ___)             \
-  V(AssertAssignable,                    A_E, ORDN, num, lit, ___)             \
-  V(AssertAssignable_Wide,               A_E, WIDE, num, lit, ___)             \
-  V(Unused30,                              0, RESV, ___, ___, ___)             \
-  V(Unused31,                              0, RESV, ___, ___, ___)             \
-  V(AssertBoolean,                         A, ORDN, num, ___, ___)             \
-  V(AssertSubtype,                         0, ORDN, ___, ___, ___)             \
-  V(LoadTypeArgumentsField,                D, ORDN, lit, ___, ___)             \
-  V(LoadTypeArgumentsField_Wide,           D, WIDE, lit, ___, ___)             \
-  V(InstantiateType,                       D, ORDN, lit, ___, ___)             \
-  V(InstantiateType_Wide,                  D, WIDE, lit, ___, ___)             \
-  V(InstantiateTypeArgumentsTOS,         A_E, ORDN, num, lit, ___)             \
-  V(InstantiateTypeArgumentsTOS_Wide,    A_E, WIDE, num, lit, ___)             \
-  V(Unused32,                              0, RESV, ___, ___, ___)             \
-  V(Unused33,                              0, RESV, ___, ___, ___)             \
-  V(Unused34,                              0, RESV, ___, ___, ___)             \
-  V(Unused35,                              0, RESV, ___, ___, ___)             \
-  V(Throw,                                 A, ORDN, num, ___, ___)             \
-  V(SetFrame,                              A, ORDN, num, ___, num)             \
-  V(MoveSpecial,                         A_Y, ORDN, num, xeg, ___)             \
-  V(MoveSpecial_Wide,                    A_Y, WIDE, num, xeg, ___)             \
-  V(BooleanNegateTOS,                      0, ORDN, ___, ___, ___)             \
-  V(EqualsNull,                            0, ORDN, ___, ___, ___)             \
-  V(NullCheck,                             D, ORDN, lit, ___, ___)             \
-  V(NullCheck_Wide,                        D, WIDE, lit, ___, ___)             \
-  V(NegateInt,                             0, ORDN, ___, ___, ___)             \
-  V(AddInt,                                0, ORDN, ___, ___, ___)             \
-  V(SubInt,                                0, ORDN, ___, ___, ___)             \
-  V(MulInt,                                0, ORDN, ___, ___, ___)             \
-  V(TruncDivInt,                           0, ORDN, ___, ___, ___)             \
-  V(ModInt,                                0, ORDN, ___, ___, ___)             \
-  V(BitAndInt,                             0, ORDN, ___, ___, ___)             \
-  V(BitOrInt,                              0, ORDN, ___, ___, ___)             \
-  V(BitXorInt,                             0, ORDN, ___, ___, ___)             \
-  V(ShlInt,                                0, ORDN, ___, ___, ___)             \
-  V(ShrInt,                                0, ORDN, ___, ___, ___)             \
-  V(CompareIntEq,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntGt,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntLt,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntGe,                          0, ORDN, ___, ___, ___)             \
-  V(CompareIntLe,                          0, ORDN, ___, ___, ___)             \
-  V(NegateDouble,                          0, ORDN, ___, ___, ___)             \
-  V(AddDouble,                             0, ORDN, ___, ___, ___)             \
-  V(SubDouble,                             0, ORDN, ___, ___, ___)             \
-  V(MulDouble,                             0, ORDN, ___, ___, ___)             \
-  V(DivDouble,                             0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleEq,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleGt,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleLt,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleGe,                       0, ORDN, ___, ___, ___)             \
-  V(CompareDoubleLe,                       0, ORDN, ___, ___, ___)             \
-
-  // These bytecodes are only generated within the VM. Reassigning their
-  // opcodes is not a breaking change.
-#define INTERNAL_KERNEL_BYTECODES_LIST(V)                                      \
-  V(VMInternal_ImplicitGetter,             0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitSetter,             0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitStaticGetter,       0, ORDN, ___, ___, ___)             \
-  V(VMInternal_MethodExtractor,            0, ORDN, ___, ___, ___)             \
-  V(VMInternal_InvokeClosure,              0, ORDN, ___, ___, ___)             \
-  V(VMInternal_InvokeField,                0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ForwardDynamicInvocation,   0, ORDN, ___, ___, ___)             \
-  V(VMInternal_NoSuchMethodDispatcher,     0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitStaticClosure,      0, ORDN, ___, ___, ___)             \
-  V(VMInternal_ImplicitInstanceClosure,    0, ORDN, ___, ___, ___)             \
-
-#define KERNEL_BYTECODES_LIST(V)                                               \
-  PUBLIC_KERNEL_BYTECODES_LIST(V)                                              \
-  INTERNAL_KERNEL_BYTECODES_LIST(V)
-
-// clang-format on
-
-typedef uint8_t KBCInstr;
-
-class KernelBytecode {
- public:
-  // Magic value of bytecode files.
-  static const intptr_t kMagicValue = 0x44424332;  // 'DBC2'
-  // Minimum bytecode format version supported by VM.
-  static const intptr_t kMinSupportedBytecodeFormatVersion = 28;
-  // Maximum bytecode format version supported by VM.
-  // The range of supported versions should include version produced by bytecode
-  // generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
-  static const intptr_t kMaxSupportedBytecodeFormatVersion = 28;
-
-  enum Opcode {
-#define DECLARE_BYTECODE(name, encoding, kind, op1, op2, op3) k##name,
-    KERNEL_BYTECODES_LIST(DECLARE_BYTECODE)
-#undef DECLARE_BYTECODE
-  };
-
-  static const char* NameOf(Opcode op) {
-    const char* names[] = {
-#define NAME(name, encoding, kind, op1, op2, op3) #name,
-        KERNEL_BYTECODES_LIST(NAME)
-#undef NAME
-    };
-    return names[op];
-  }
-
-  static const intptr_t kInstructionSize[];
-
-  enum SpecialIndex {
-    kExceptionSpecialIndex,
-    kStackTraceSpecialIndex,
-    kSpecialIndexCount
-  };
-
- private:
-  static const intptr_t kWideModifier = 1;
-
-  // Should be used only on instructions with wide variants.
-  DART_FORCE_INLINE static bool IsWide(const KBCInstr* instr) {
-    return ((DecodeOpcode(instr) & kWideModifier) != 0);
-  }
-
- public:
-  DART_FORCE_INLINE static uint8_t DecodeA(const KBCInstr* bc) { return bc[1]; }
-
-  DART_FORCE_INLINE static uint8_t DecodeB(const KBCInstr* bc) { return bc[2]; }
-
-  DART_FORCE_INLINE static uint8_t DecodeC(const KBCInstr* bc) { return bc[3]; }
-
-  DART_FORCE_INLINE static uint32_t DecodeD(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<uint32_t>(bc[1]) |
-             (static_cast<uint32_t>(bc[2]) << 8) |
-             (static_cast<uint32_t>(bc[3]) << 16) |
-             (static_cast<uint32_t>(bc[4]) << 24);
-    } else {
-      return bc[1];
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeX(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>(static_cast<uint32_t>(bc[1]) |
-                                  (static_cast<uint32_t>(bc[2]) << 8) |
-                                  (static_cast<uint32_t>(bc[3]) << 16) |
-                                  (static_cast<uint32_t>(bc[4]) << 24));
-    } else {
-      return static_cast<int8_t>(bc[1]);
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeT(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>((static_cast<uint32_t>(bc[1]) << 8) |
-                                  (static_cast<uint32_t>(bc[2]) << 16) |
-                                  (static_cast<uint32_t>(bc[3]) << 24)) >>
-             8;
-    } else {
-      return static_cast<int8_t>(bc[1]);
-    }
-  }
-
-  DART_FORCE_INLINE static uint32_t DecodeE(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<uint32_t>(bc[2]) |
-             (static_cast<uint32_t>(bc[3]) << 8) |
-             (static_cast<uint32_t>(bc[4]) << 16) |
-             (static_cast<uint32_t>(bc[5]) << 24);
-    } else {
-      return bc[2];
-    }
-  }
-
-  DART_FORCE_INLINE static int32_t DecodeY(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return static_cast<int32_t>(static_cast<uint32_t>(bc[2]) |
-                                  (static_cast<uint32_t>(bc[3]) << 8) |
-                                  (static_cast<uint32_t>(bc[4]) << 16) |
-                                  (static_cast<uint32_t>(bc[5]) << 24));
-    } else {
-      return static_cast<int8_t>(bc[2]);
-    }
-  }
-
-  DART_FORCE_INLINE static uint8_t DecodeF(const KBCInstr* bc) {
-    if (IsWide(bc)) {
-      return bc[5];
-    } else {
-      return bc[2];
-    }
-  }
-
-  DART_FORCE_INLINE static Opcode DecodeOpcode(const KBCInstr* bc) {
-    return static_cast<Opcode>(bc[0]);
-  }
-
-  DART_FORCE_INLINE static const KBCInstr* Next(const KBCInstr* bc) {
-    return bc + kInstructionSize[DecodeOpcode(bc)];
-  }
-
-  DART_FORCE_INLINE static uword Next(uword pc) {
-    return pc + kInstructionSize[DecodeOpcode(
-                    reinterpret_cast<const KBCInstr*>(pc))];
-  }
-
-  DART_FORCE_INLINE static bool IsJumpOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kJump:
-      case KernelBytecode::kJump_Wide:
-      case KernelBytecode::kJumpIfNoAsserts:
-      case KernelBytecode::kJumpIfNoAsserts_Wide:
-      case KernelBytecode::kJumpIfNotZeroTypeArgs:
-      case KernelBytecode::kJumpIfNotZeroTypeArgs_Wide:
-      case KernelBytecode::kJumpIfEqStrict:
-      case KernelBytecode::kJumpIfEqStrict_Wide:
-      case KernelBytecode::kJumpIfNeStrict:
-      case KernelBytecode::kJumpIfNeStrict_Wide:
-      case KernelBytecode::kJumpIfTrue:
-      case KernelBytecode::kJumpIfTrue_Wide:
-      case KernelBytecode::kJumpIfFalse:
-      case KernelBytecode::kJumpIfFalse_Wide:
-      case KernelBytecode::kJumpIfNull:
-      case KernelBytecode::kJumpIfNull_Wide:
-      case KernelBytecode::kJumpIfNotNull:
-      case KernelBytecode::kJumpIfNotNull_Wide:
-      case KernelBytecode::kJumpIfUnchecked:
-      case KernelBytecode::kJumpIfUnchecked_Wide:
-      case KernelBytecode::kJumpIfInitialized:
-      case KernelBytecode::kJumpIfInitialized_Wide:
-        return true;
-
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsJumpIfUncheckedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kJumpIfUnchecked:
-      case KernelBytecode::kJumpIfUnchecked_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsLoadConstantOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kLoadConstant:
-      case KernelBytecode::kLoadConstant_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsCheckStackOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kCheckStack;
-  }
-
-  DART_FORCE_INLINE static bool IsCheckFunctionTypeArgs(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kCheckFunctionTypeArgs:
-      case KernelBytecode::kCheckFunctionTypeArgs_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kEntry:
-      case KernelBytecode::kEntry_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryFixedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kEntryFixed:
-      case KernelBytecode::kEntryFixed_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsEntryOptionalOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kEntryOptional;
-  }
-
-  DART_FORCE_INLINE static bool IsFrameOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kFrame:
-      case KernelBytecode::kFrame_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsSetFrameOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kSetFrame;
-  }
-
-  DART_FORCE_INLINE static bool IsNativeCallOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kNativeCall:
-      case KernelBytecode::kNativeCall_Wide:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  DART_FORCE_INLINE static bool IsDebugCheckOpcode(const KBCInstr* instr) {
-    return DecodeOpcode(instr) == KernelBytecode::kDebugCheck;
-  }
-
-  // The interpreter, the bytecode generator, the bytecode compiler, and this
-  // function must agree on this list of opcodes.
-  // For each instruction with listed opcode:
-  // - The interpreter checks for a debug break.
-  // - The bytecode generator emits a source position.
-  // - The bytecode compiler may emit a DebugStepCheck call.
-  DART_FORCE_INLINE static bool IsDebugCheckedOpcode(const KBCInstr* instr) {
-    switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kDebugCheck:
-      case KernelBytecode::kDirectCall:
-      case KernelBytecode::kDirectCall_Wide:
-      case KernelBytecode::kUncheckedDirectCall:
-      case KernelBytecode::kUncheckedDirectCall_Wide:
-      case KernelBytecode::kInterfaceCall:
-      case KernelBytecode::kInterfaceCall_Wide:
-      case KernelBytecode::kInstantiatedInterfaceCall:
-      case KernelBytecode::kInstantiatedInterfaceCall_Wide:
-      case KernelBytecode::kUncheckedClosureCall:
-      case KernelBytecode::kUncheckedClosureCall_Wide:
-      case KernelBytecode::kUncheckedInterfaceCall:
-      case KernelBytecode::kUncheckedInterfaceCall_Wide:
-      case KernelBytecode::kDynamicCall:
-      case KernelBytecode::kDynamicCall_Wide:
-      case KernelBytecode::kReturnTOS:
-      case KernelBytecode::kEqualsNull:
-      case KernelBytecode::kNegateInt:
-      case KernelBytecode::kNegateDouble:
-      case KernelBytecode::kAddInt:
-      case KernelBytecode::kSubInt:
-      case KernelBytecode::kMulInt:
-      case KernelBytecode::kTruncDivInt:
-      case KernelBytecode::kModInt:
-      case KernelBytecode::kBitAndInt:
-      case KernelBytecode::kBitOrInt:
-      case KernelBytecode::kBitXorInt:
-      case KernelBytecode::kShlInt:
-      case KernelBytecode::kShrInt:
-      case KernelBytecode::kCompareIntEq:
-      case KernelBytecode::kCompareIntGt:
-      case KernelBytecode::kCompareIntLt:
-      case KernelBytecode::kCompareIntGe:
-      case KernelBytecode::kCompareIntLe:
-      case KernelBytecode::kAddDouble:
-      case KernelBytecode::kSubDouble:
-      case KernelBytecode::kMulDouble:
-      case KernelBytecode::kDivDouble:
-      case KernelBytecode::kCompareDoubleEq:
-      case KernelBytecode::kCompareDoubleGt:
-      case KernelBytecode::kCompareDoubleLt:
-      case KernelBytecode::kCompareDoubleGe:
-      case KernelBytecode::kCompareDoubleLe:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  static const uint8_t kNativeCallToGrowableListArgc = 2;
-
-  // Returns a fake return address which points after the 2-argument
-  // bytecode call, followed by ReturnTOS instructions.
-  static const KBCInstr* GetNativeCallToGrowableListReturnTrampoline();
-
-  DART_FORCE_INLINE static uint8_t DecodeArgc(const KBCInstr* ret_addr) {
-    // All call instructions have DF encoding, with argc being the last byte
-    // regardless of whether the wide variant is used or not.
-    return ret_addr[-1];
-  }
-
-  // Converts bytecode PC into an offset.
-  // For return addresses used in PcDescriptors, PC is also augmented by 1.
-  // TODO(regis): Eliminate this correction.
-  static intptr_t BytecodePcToOffset(uint32_t pc, bool is_return_address) {
-    return pc + (is_return_address ? 1 : 0);
-  }
-
-  static uint32_t OffsetToBytecodePc(intptr_t offset, bool is_return_address) {
-    return offset - (is_return_address ? 1 : 0);
-  }
-
-  static void GetVMInternalBytecodeInstructions(Opcode opcode,
-                                                const KBCInstr** instructions,
-                                                intptr_t* instructions_size);
-
- private:
-  DISALLOW_ALLOCATION();
-  DISALLOW_IMPLICIT_CONSTRUCTORS(KernelBytecode);
-};
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_CONSTANTS_KBC_H_
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 89f06a9..a17966f 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -9,7 +9,6 @@
 #include "vm/debugger.h"
 #include "vm/dispatch_table.h"
 #include "vm/heap/safepoint.h"
-#include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
 #include "vm/runtime_entry.h"
@@ -19,13 +18,11 @@
 #include "vm/zone_text_buffer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/jit/compiler.h"
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, precompiled_mode);
 
 // A cache of VM heap allocated arguments descriptors.
@@ -53,7 +50,6 @@
     thread->SetStackLimit(Simulator::Current()->overflow_stack_limit());
 #else
     thread->SetStackLimit(OSThread::Current()->overflow_stack_limit());
-    // TODO(regis): For now, the interpreter is using its own stack limit.
 #endif
 
 #if defined(USING_SAFE_STACK)
@@ -135,27 +131,6 @@
   ScopedIsolateStackLimits stack_limit(thread, current_sp);
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (!function.HasCode()) {
-    if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
-      if (!function.HasBytecode()) {
-        ErrorPtr error =
-            kernel::BytecodeReader::ReadFunctionBytecode(thread, function);
-        if (error != Error::null()) {
-          return error;
-        }
-      }
-
-      // If we have bytecode but no native code then invoke the interpreter.
-      if (function.HasBytecode() && (FLAG_compilation_counter_threshold != 0)) {
-        ASSERT(thread->no_callback_scope_depth() == 0);
-        SuspendLongJumpScope suspend_long_jump_scope(thread);
-        TransitionToGenerated transition(thread);
-        return Interpreter::Current()->Call(function, arguments_descriptor,
-                                            arguments, thread);
-      }
-
-      // Fall back to compilation.
-    }
-
     const Object& result =
         Object::Handle(zone, Compiler::CompileFunction(thread, function));
     if (result.IsError()) {
@@ -750,31 +725,6 @@
   return result.raw();
 }
 
-ObjectPtr DartLibraryCalls::LookupOpenPorts() {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  Function& function = Function::Handle(
-      zone, thread->isolate()->object_store()->lookup_open_ports());
-  const int kTypeArgsLen = 0;
-  const int kNumArguments = 0;
-  if (function.IsNull()) {
-    Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
-    ASSERT(!isolate_lib.IsNull());
-    const String& class_name = String::Handle(
-        zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
-    const String& function_name = String::Handle(
-        zone, isolate_lib.PrivateName(Symbols::_lookupOpenPorts()));
-    function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
-                                       kTypeArgsLen, kNumArguments,
-                                       Object::empty_array());
-    ASSERT(!function.IsNull());
-    thread->isolate()->object_store()->set_lookup_open_ports(function);
-  }
-  const Object& result = Object::Handle(
-      zone, DartEntry::InvokeFunction(function, Object::empty_array()));
-  return result.raw();
-}
-
 ObjectPtr DartLibraryCalls::HandleMessage(const Object& handler,
                                           const Instance& message) {
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 1527c11..2ebdbe8 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -174,8 +174,6 @@
   friend class SnapshotWriter;
   friend class Serializer;
   friend class Deserializer;
-  friend class Interpreter;
-  friend class InterpreterHelpers;
   friend class Simulator;
   friend class SimulatorHelpers;
   DISALLOW_COPY_AND_ASSIGN(ArgumentsDescriptor);
@@ -284,9 +282,6 @@
   // Returns the handler if one has been registered for this port id.
   static ObjectPtr LookupHandler(Dart_Port port_id);
 
-  // Returns a list of open ReceivePorts.
-  static ObjectPtr LookupOpenPorts();
-
   // Returns null on success, a RawError on failure.
   static ObjectPtr HandleMessage(const Object& handler,
                                  const Instance& dart_message);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index feb43ae..dfd6e56 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -10,12 +10,10 @@
 #include "vm/code_patcher.h"
 #include "vm/compiler/api/deopt_id.h"
 #include "vm/compiler/assembler/disassembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
 #include "vm/flags.h"
 #include "vm/globals.h"
-#include "vm/interpreter.h"
 #include "vm/isolate_reload.h"
 #include "vm/json_stream.h"
 #include "vm/kernel.h"
@@ -40,7 +38,6 @@
 #include "vm/visitor.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/deopt_instructions.h"
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -53,7 +50,6 @@
 DEFINE_FLAG(bool, trace_rewind, false, "Trace frame rewind");
 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, trace_deoptimization);
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
@@ -74,7 +70,6 @@
       requested_line_number_(requested_line_number),
       requested_column_number_(requested_column_number),
       function_(Function::null()),
-      bytecode_token_pos_(TokenPosition::kNoSource),
       code_token_pos_(TokenPosition::kNoSource) {
   ASSERT(!script.IsNull());
   ASSERT(token_pos_.IsReal());
@@ -93,7 +88,6 @@
       requested_line_number_(requested_line_number),
       requested_column_number_(requested_column_number),
       function_(Function::null()),
-      bytecode_token_pos_(TokenPosition::kNoSource),
       code_token_pos_(TokenPosition::kNoSource) {
   ASSERT(requested_line_number_ >= 0);
 }
@@ -111,8 +105,7 @@
   return breakpoints() != NULL;
 }
 
-void BreakpointLocation::SetResolved(bool in_bytecode,
-                                     const Function& func,
+void BreakpointLocation::SetResolved(const Function& func,
                                      TokenPosition token_pos) {
   ASSERT(!IsLatent());
   ASSERT(func.script() == script_);
@@ -122,14 +115,9 @@
   function_ = func.raw();
   token_pos_ = token_pos;
   end_token_pos_ = token_pos;
-  if (in_bytecode) {
-    bytecode_token_pos_ = token_pos;
-  } else {
-    code_token_pos_ = token_pos;
-  }
+  code_token_pos_ = token_pos;
 }
 
-// Returned resolved pos is either in code or in bytecode.
 void BreakpointLocation::GetCodeLocation(Script* script,
                                          TokenPosition* pos) const {
   if (IsLatent()) {
@@ -182,7 +170,6 @@
 
 void CodeBreakpoint::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&code_));
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&bytecode_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&saved_value_));
 }
 
@@ -198,7 +185,6 @@
       sp_(sp),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle(code.raw())),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle(code.function())),
       live_frame_((kind == kRegular) || (kind == kAsyncActivation)),
       token_pos_initialized_(false),
@@ -218,46 +204,12 @@
   ASSERT(!function_.IsNull());
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-ActivationFrame::ActivationFrame(uword pc,
-                                 uword fp,
-                                 uword sp,
-                                 const Bytecode& bytecode,
-                                 ActivationFrame::Kind kind)
-    : pc_(pc),
-      fp_(fp),
-      sp_(sp),
-      ctx_(Context::ZoneHandle()),
-      code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle(bytecode.raw())),
-      function_(Function::ZoneHandle(bytecode.function())),
-      live_frame_((kind == kRegular) || (kind == kAsyncActivation)),
-      token_pos_initialized_(false),
-      token_pos_(TokenPosition::kNoSource),
-      try_index_(-1),
-      deopt_id_(DeoptId::kNone),
-      line_number_(-1),
-      column_number_(-1),
-      context_level_(-1),
-      deopt_frame_(Array::ZoneHandle()),
-      deopt_frame_offset_(0),
-      kind_(kind),
-      vars_initialized_(false),
-      var_descriptors_(LocalVarDescriptors::ZoneHandle()),
-      desc_indices_(8),
-      pc_desc_(PcDescriptors::ZoneHandle()) {
-  // The frame of a bytecode stub has a null function. It may be encountered
-  // when single stepping.
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 ActivationFrame::ActivationFrame(Kind kind)
     : pc_(0),
       fp_(0),
       sp_(0),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle()),
       live_frame_(kind == kRegular),
       token_pos_initialized_(false),
@@ -281,7 +233,6 @@
       sp_(0),
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle()),
-      bytecode_(Bytecode::ZoneHandle()),
       function_(Function::ZoneHandle()),
       live_frame_(false),
       token_pos_initialized_(false),
@@ -300,17 +251,10 @@
       pc_desc_(PcDescriptors::ZoneHandle()) {
   // Extract the function and the code from the asynchronous activation.
   function_ = async_activation.function();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!function_.HasCode() && function_.HasBytecode()) {
-    bytecode_ = function_.bytecode();
-  }
-#endif
-  if (bytecode_.IsNull()) {
-    // Force-optimize functions should not be debuggable.
-    ASSERT(!function_.ForceOptimize());
-    function_.EnsureHasCompiledUnoptimizedCode();
-    code_ = function_.unoptimized_code();
-  }
+  // Force-optimize functions should not be debuggable.
+  ASSERT(!function_.ForceOptimize());
+  function_.EnsureHasCompiledUnoptimizedCode();
+  code_ = function_.unoptimized_code();
   ctx_ = async_activation.context();
   ASSERT(fp_ == 0);
   ASSERT(!ctx_.IsNull());
@@ -481,7 +425,7 @@
 }
 
 bool Debugger::HasBreakpoint(const Function& func, Zone* zone) {
-  if (!func.HasCode() && !func.HasBytecode()) {
+  if (!func.HasCode()) {
     // If the function is not compiled yet, just check whether there
     // is a user-defined breakpoint that falls into the token
     // range of the function. This may be a false positive: the breakpoint
@@ -553,58 +497,10 @@
   }
 }
 
-// If the current top Dart frame is interpreted, returns the fp of the caller
-// in compiled code that invoked the interpreter, or 0 if not found.
-// If the current top Dart frame is compiled, returns the fp of the caller in
-// interpreted bytecode that invoked compiled code, or ULONG_MAX if not found.
-// Returning compiled code fp 0 (or bytecode fp ULONG_MAX) as fp value insures
-// that the fp will compare as a callee of any valid frame pointer of the same
-// mode (compiled code or bytecode).
-static uword CrossCallerFp() {
-  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
-                              Thread::Current(),
-                              StackFrameIterator::kNoCrossThreadIteration);
-  StackFrame* frame;
-  do {
-    frame = iterator.NextFrame();
-    RELEASE_ASSERT(frame != nullptr);
-  } while (!frame->IsDartFrame());
-  const bool top_is_interpreted = frame->is_interpreted();
-  do {
-    frame = iterator.NextFrame();
-    if (frame == nullptr) {
-      return top_is_interpreted ? 0 : ULONG_MAX;
-    }
-    if (!frame->IsDartFrame()) {
-      continue;
-    }
-  } while (top_is_interpreted == frame->is_interpreted());
-  return frame->fp();
-}
-
-ActivationFrame::Relation ActivationFrame::CompareTo(
-    uword other_fp,
-    bool other_is_interpreted) const {
+ActivationFrame::Relation ActivationFrame::CompareTo(uword other_fp) const {
   if (fp() == other_fp) {
-    ASSERT(IsInterpreted() == other_is_interpreted);
     return kSelf;
   }
-  if (IsInterpreted()) {
-    if (!other_is_interpreted) {
-      // Instead of fp(), use the fp of the compiled frame that called into the
-      // interpreter (CrossCallerFp).
-      // Note that if CrossCallerFp == other_fp, it must compare as a caller.
-      return IsCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee : kCaller;
-    }
-    return IsBytecodeCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
-  }
-  if (other_is_interpreted) {
-    // Instead of fp(), use the fp of the interpreted frame that called into
-    // compiled code (CrossCallerFp).
-    // Note that if CrossCallerFp == other_fp, it must compare as a caller.
-    return IsBytecodeCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee
-                                                              : kCaller;
-  }
   return IsCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
 }
 
@@ -627,23 +523,17 @@
 }
 
 void ActivationFrame::GetPcDescriptors() {
-  ASSERT(!IsInterpreted());  // We need to set try_index_ simultaneously.
   if (pc_desc_.IsNull()) {
     pc_desc_ = code().pc_descriptors();
     ASSERT(!pc_desc_.IsNull());
   }
 }
 
-// If not token_pos_initialized_, compute token_pos_, try_index_ and,
-// if not IsInterpreted(), also compute deopt_id_.
+// If not token_pos_initialized_, compute token_pos_, try_index_ and
+// deopt_id_.
 TokenPosition ActivationFrame::TokenPos() {
   if (!token_pos_initialized_) {
     token_pos_initialized_ = true;
-    if (IsInterpreted()) {
-      token_pos_ = bytecode().GetTokenIndexOfPC(pc_);
-      try_index_ = bytecode().GetTryIndexAtPc(pc_);
-      return token_pos_;
-    }
     token_pos_ = TokenPosition::kNoSource;
     GetPcDescriptors();
     PcDescriptors::Iterator iter(pc_desc_, PcDescriptorsLayout::kAnyKind);
@@ -668,7 +558,6 @@
 }
 
 intptr_t ActivationFrame::DeoptId() {
-  ASSERT(!IsInterpreted());
   if (!token_pos_initialized_) {
     TokenPos();  // Side effect: computes token_pos_initialized_, try_index_.
   }
@@ -701,11 +590,6 @@
 
 void ActivationFrame::GetVarDescriptors() {
   if (var_descriptors_.IsNull()) {
-    if (IsInterpreted()) {
-      var_descriptors_ = bytecode().GetLocalVarDescriptors();
-      ASSERT(!var_descriptors_.IsNull());
-      return;
-    }
     Code& unoptimized_code = Code::Handle(function().unoptimized_code());
     if (unoptimized_code.IsNull()) {
       Thread* thread = Thread::Current();
@@ -724,8 +608,8 @@
 }
 
 bool ActivationFrame::IsDebuggable() const {
-  // When stepping in bytecode stub, function is null.
-  return !function().IsNull() && Debugger::IsDebuggable(function());
+  ASSERT(!function().IsNull());
+  return Debugger::IsDebuggable(function());
 }
 
 void ActivationFrame::PrintDescriptorsError(const char* message) {
@@ -735,14 +619,7 @@
   OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_);
   OS::PrintErr("context_level_ %" Px "\n", context_level_);
   OS::PrintErr("token_pos_ %s\n", token_pos_.ToCString());
-  if (function().is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    KernelBytecodeDisassembler::Disassemble(function());
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  }
-  if (!IsInterpreted()) {
+  {
     DisassembleToStdout formatter;
     code().Disassemble(&formatter);
     PcDescriptors::Handle(code().pc_descriptors()).Print();
@@ -763,63 +640,30 @@
   ASSERT(live_frame_);
   const Context& ctx = GetSavedCurrentContext();
   if (context_level_ < 0 && !ctx.IsNull()) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      Thread* thread = Thread::Current();
-      Zone* zone = thread->zone();
-      const auto& bytecode = Bytecode::Handle(zone, function_.bytecode());
-      if (!bytecode.HasLocalVariablesInfo()) {
-        PrintDescriptorsError("Missing local variables info");
-      }
-      intptr_t pc_offset = pc_ - bytecode.PayloadStart();
-      // Look for innermost scope, i.e. with the highest context level.
-      // Since scopes are ordered by StartPC(), the last scope which includes
-      // pc_offset will be the innermost one.
-      kernel::BytecodeLocalVariablesIterator local_vars(zone, bytecode);
-      while (local_vars.MoveNext()) {
-        if (local_vars.Kind() ==
-            kernel::BytecodeLocalVariablesIterator::kScope) {
-          if (local_vars.StartPC() > pc_offset) {
-            break;
-          }
-          if (pc_offset <= local_vars.EndPC()) {
-            ASSERT(context_level_ <= local_vars.ContextLevel());
-            context_level_ = local_vars.ContextLevel();
-          }
-        }
-      }
-      if (context_level_ < 0) {
-        PrintDescriptorsError("Missing context level in local variables info");
-      }
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      ASSERT(!code_.is_optimized());
-      GetVarDescriptors();
-      intptr_t deopt_id = DeoptId();
-      if (deopt_id == DeoptId::kNone) {
-        PrintDescriptorsError("Missing deopt id");
-      }
-      intptr_t var_desc_len = var_descriptors_.Length();
-      bool found = false;
-      for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
-        LocalVarDescriptorsLayout::VarInfo var_info;
-        var_descriptors_.GetInfo(cur_idx, &var_info);
-        const int8_t kind = var_info.kind();
-        if ((kind == LocalVarDescriptorsLayout::kContextLevel) &&
-            (deopt_id >= var_info.begin_pos.value()) &&
-            (deopt_id <= var_info.end_pos.value())) {
-          context_level_ = var_info.index();
-          found = true;
-          break;
-        }
-      }
-      if (!found) {
-        PrintDescriptorsError("Missing context level in var descriptors");
-      }
-      ASSERT(context_level_ >= 0);
+    ASSERT(!code_.is_optimized());
+    GetVarDescriptors();
+    intptr_t deopt_id = DeoptId();
+    if (deopt_id == DeoptId::kNone) {
+      PrintDescriptorsError("Missing deopt id");
     }
+    intptr_t var_desc_len = var_descriptors_.Length();
+    bool found = false;
+    for (intptr_t cur_idx = 0; cur_idx < var_desc_len; cur_idx++) {
+      LocalVarDescriptorsLayout::VarInfo var_info;
+      var_descriptors_.GetInfo(cur_idx, &var_info);
+      const int8_t kind = var_info.kind();
+      if ((kind == LocalVarDescriptorsLayout::kContextLevel) &&
+          (deopt_id >= var_info.begin_pos.value()) &&
+          (deopt_id <= var_info.end_pos.value())) {
+        context_level_ = var_info.index();
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      PrintDescriptorsError("Missing context level in var descriptors");
+    }
+    ASSERT(context_level_ >= 0);
   }
   return context_level_;
 }
@@ -845,13 +689,9 @@
         return GetStackVar(variable_index);
       } else {
         ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
-        // Variable descriptors constructed from bytecode have all variables of
-        // enclosing functions, even shadowed by the current function.
-        // Pick the variable with the highest context level.
-        if (var_info.scope_id > var_ctxt_level) {
-          var_ctxt_level = var_info.scope_id;
-          ctxt_slot = variable_index.value();
-        }
+        var_ctxt_level = var_info.scope_id;
+        ctxt_slot = variable_index.value();
+        break;
       }
     }
   }
@@ -860,10 +700,7 @@
       ASSERT(!ctx_.IsNull());
       // Compiled code uses relative context levels, i.e. the frame context
       // level is always 0 on entry.
-      // Bytecode uses absolute context levels, i.e. the frame context level
-      // on entry must be calculated.
-      const intptr_t frame_ctx_level =
-          function().is_declared_in_bytecode() ? ctx_.GetLevel() : 0;
+      const intptr_t frame_ctx_level = 0;
       return GetRelativeContextVar(var_ctxt_level, ctxt_slot, frame_ctx_level);
     }
     return GetContextVar(var_ctxt_level, ctxt_slot);
@@ -883,8 +720,7 @@
     // Look up caller's closure on the stack.
     ObjectPtr* last_caller_obj = reinterpret_cast<ObjectPtr*>(GetCallerSp());
     Closure& closure = Closure::Handle();
-    closure = StackTraceUtils::FindClosureInFrame(last_caller_obj, function_,
-                                                  IsInterpreted());
+    closure = StackTraceUtils::FindClosureInFrame(last_caller_obj, function_);
 
     if (!closure.IsNull() && caller_closure_finder->IsRunningAsync(closure)) {
       closure = caller_closure_finder->FindCaller(closure);
@@ -913,11 +749,7 @@
   AbstractType& type = Type::Handle();
   const bool is_async =
       function().IsAsyncClosure() || function().IsAsyncGenClosure();
-  if (IsInterpreted()) {
-    handlers = bytecode().exception_handlers();
-  } else {
-    handlers = code().exception_handlers();
-  }
+  handlers = code().exception_handlers();
   ASSERT(!handlers.IsNull());
   intptr_t num_handlers_checked = 0;
   while (try_index != kInvalidTryIndex) {
@@ -960,13 +792,9 @@
     if (var_descriptors_.GetName(i) == Symbols::AwaitJumpVar().raw()) {
       ASSERT(kind == LocalVarDescriptorsLayout::kContextVar);
       ASSERT(!ctx_.IsNull());
-      // Variable descriptors constructed from bytecode have all variables of
-      // enclosing functions, even shadowed by the current function.
-      // Pick the :await_jump_var variable with the highest context level.
-      if (var_info.scope_id > var_ctxt_level) {
-        var_ctxt_level = var_info.scope_id;
-        ctxt_slot = var_info.index();
-      }
+      var_ctxt_level = var_info.scope_id;
+      ctxt_slot = var_info.index();
+      break;
     }
   }
   if (var_ctxt_level >= 0) {
@@ -986,39 +814,6 @@
   // This should only be called on frames that aren't active on the stack.
   ASSERT(fp() == 0);
 
-  if (function_.is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    const auto& bytecode = Bytecode::Handle(zone, function_.bytecode());
-    if (!bytecode.HasSourcePositions()) {
-      return;
-    }
-    const intptr_t await_jump_var = GetAwaitJumpVariable();
-    if (await_jump_var < 0) {
-      return;
-    }
-    // Yield points are counted from 1 (0 is reserved for normal entry).
-    intptr_t yield_point_index = 1;
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      if (iter.IsYieldPoint()) {
-        if (yield_point_index == await_jump_var) {
-          token_pos_ = iter.TokenPos();
-          token_pos_initialized_ = true;
-          const uword return_address =
-              KernelBytecode::Next(bytecode.PayloadStart() + iter.PcOffset());
-          try_index_ = bytecode.GetTryIndexAtPc(return_address);
-          return;
-        }
-        ++yield_point_index;
-      }
-    }
-    return;
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  }
-
-  ASSERT(!IsInterpreted());
   const intptr_t await_jump_var = GetAwaitJumpVariable();
   if (await_jump_var < 0) {
     return;
@@ -1039,10 +834,7 @@
 }
 
 bool ActivationFrame::IsAsyncMachinery() const {
-  if (function_.IsNull()) {
-    ASSERT(IsInterpreted());  // This frame is a bytecode stub frame.
-    return false;
-  }
+  ASSERT(!function_.IsNull());
   Isolate* isolate = Isolate::Current();
   if (function_.raw() == isolate->object_store()->complete_on_async_return()) {
     // We are completing an async function's completer.
@@ -1201,17 +993,6 @@
   intptr_t num_parameters = function().num_fixed_parameters();
   ASSERT(0 <= index && index < num_parameters);
 
-  if (IsInterpreted()) {
-    if (function().NumOptionalParameters() > 0) {
-      // Note that we do not access optional but only fixed parameters, hence
-      // we do not need to replicate the logic of IndexFor() in bytecode reader.
-      return GetVariableValue(fp() + index * kWordSize);
-    } else {
-      return GetVariableValue(
-          fp() - (kKBCParamEndSlotFromFp + num_parameters - index) * kWordSize);
-    }
-  }
-
   if (function().NumOptionalParameters() > 0) {
     // If the function has optional parameters, the first positional parameter
     // can be in a number of places in the caller's frame depending on how many
@@ -1232,13 +1013,6 @@
 }
 
 ObjectPtr ActivationFrame::GetStackVar(VariableIndex variable_index) {
-  if (IsInterpreted()) {
-    intptr_t slot_index = -variable_index.value();
-    if (slot_index < 0) {
-      slot_index -= kKBCParamEndSlotFromFp;  // Accessing a parameter.
-    }
-    return GetVariableValue(fp() + slot_index * kWordSize);
-  }
   const intptr_t slot_index =
       runtime_frame_layout.FrameSlotForVariableIndex(variable_index.value());
   if (deopt_frame_.IsNull()) {
@@ -1540,7 +1314,7 @@
   const char* func_name = function().ToFullyQualifiedCString();
   if (live_frame_) {
     return Thread::Current()->zone()->PrintToString(
-        "[ Frame pc(0x%" Px " %s offset:0x%" Px ") fp(0x%" Px ") sp(0x%" Px
+        "[ Frame pc(0x%" Px " code offset:0x%" Px ") fp(0x%" Px ") sp(0x%" Px
         ")\n"
         "\tfunction = %s\n"
         "\turl = %s\n"
@@ -1548,20 +1322,16 @@
         "\n"
         "\tcontext = %s\n"
         "\tcontext level = %" Pd " ]\n",
-        pc(), IsInterpreted() ? "bytecode" : "code",
-        pc() - (IsInterpreted() ? bytecode().PayloadStart()
-                                : code().PayloadStart()),
-        fp(), sp(), func_name, url.ToCString(), line, ctx_.ToCString(),
-        ContextLevel());
+        pc(), pc() - code().PayloadStart(), fp(), sp(), func_name,
+        url.ToCString(), line, ctx_.ToCString(), ContextLevel());
   } else {
     return Thread::Current()->zone()->PrintToString(
-        "[ Frame %s function = %s\n"
+        "[ Frame code function = %s\n"
         "\turl = %s\n"
         "\tline = %" Pd
         "\n"
         "\tcontext = %s]\n",
-        IsInterpreted() ? "bytecode" : "code", func_name, url.ToCString(), line,
-        ctx_.ToCString());
+        func_name, url.ToCString(), line, ctx_.ToCString());
   }
 }
 
@@ -1584,11 +1354,7 @@
   const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function());
-  if (IsInterpreted()) {
-    jsobj->AddProperty("code", bytecode());
-  } else {
-    jsobj->AddProperty("code", code());
-  }
+  jsobj->AddProperty("code", code());
   {
     JSONArray jsvars(jsobj, "vars");
     const int num_vars = NumLocalVariables();
@@ -1624,11 +1390,7 @@
   const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function());
-  if (IsInterpreted()) {
-    jsobj->AddProperty("code", bytecode());
-  } else {
-    jsobj->AddProperty("code", code());
-  }
+  jsobj->AddProperty("code", code());
 }
 
 void ActivationFrame::PrintToJSONObjectAsyncSuspensionMarker(
@@ -1658,14 +1420,6 @@
                                  ActivationFrame::kAsyncCausal));
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-void DebuggerStackTrace::AddAsyncCausalFrame(uword pc,
-                                             const Bytecode& bytecode) {
-  trace_.Add(
-      new ActivationFrame(pc, 0, 0, bytecode, ActivationFrame::kAsyncCausal));
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 const uint8_t kSafepointKind = PcDescriptorsLayout::kIcCall |
                                PcDescriptorsLayout::kUnoptStaticCall |
                                PcDescriptorsLayout::kRuntimeCall;
@@ -1675,7 +1429,6 @@
                                uword pc,
                                PcDescriptorsLayout::Kind kind)
     : code_(code.raw()),
-      bytecode_(Bytecode::null()),
       token_pos_(token_pos),
       pc_(pc),
       line_number_(-1),
@@ -1690,32 +1443,12 @@
   ASSERT((breakpoint_kind_ & kSafepointKind) != 0);
 }
 
-CodeBreakpoint::CodeBreakpoint(const Bytecode& bytecode,
-                               TokenPosition token_pos,
-                               uword pc)
-    : code_(Code::null()),
-      bytecode_(bytecode.raw()),
-      token_pos_(token_pos),
-      pc_(pc),
-      line_number_(-1),
-      is_enabled_(false),
-      bpt_location_(NULL),
-      next_(NULL),
-      breakpoint_kind_(PcDescriptorsLayout::kAnyKind),
-      saved_value_(Code::null()) {
-  ASSERT(!bytecode.IsNull());
-  ASSERT(FLAG_enable_interpreter);
-  ASSERT(token_pos_.IsReal());
-  ASSERT(pc_ != 0);
-}
-
 CodeBreakpoint::~CodeBreakpoint() {
   // Make sure we don't leave patched code behind.
   ASSERT(!IsEnabled());
 // Poison the data so we catch use after free errors.
 #ifdef DEBUG
   code_ = Code::null();
-  bytecode_ = Bytecode::null();
   pc_ = 0ul;
   bpt_location_ = NULL;
   next_ = NULL;
@@ -1724,12 +1457,7 @@
 }
 
 FunctionPtr CodeBreakpoint::function() const {
-  if (IsInterpreted()) {
-    ASSERT(Bytecode::Handle(bytecode_).function() != Function::null());
-    return Bytecode::Handle(bytecode_).function();
-  } else {
-    return Code::Handle(code_).function();
-  }
+  return Code::Handle(code_).function();
 }
 
 ScriptPtr CodeBreakpoint::SourceCode() {
@@ -1753,30 +1481,14 @@
 
 void CodeBreakpoint::Enable() {
   if (!is_enabled_) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      SetBytecodeBreakpoint();
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      PatchCode();
-    }
+    PatchCode();
   }
   ASSERT(is_enabled_);
 }
 
 void CodeBreakpoint::Disable() {
   if (is_enabled_) {
-    if (IsInterpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      UnsetBytecodeBreakpoint();
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      RestoreCode();
-    }
+    RestoreCode();
   }
   ASSERT(!is_enabled_);
 }
@@ -1796,11 +1508,9 @@
       async_causal_stack_trace_(NULL),
       awaiter_stack_trace_(NULL),
       stepping_fp_(0),
-      interpreted_stepping_(false),
       last_stepping_fp_(0),
       last_stepping_pos_(TokenPosition::kNoSource),
       async_stepping_fp_(0),
-      interpreted_async_stepping_(false),
       top_frame_awaiter_(Object::null()),
       skip_next_step_(false),
       needs_breakpoint_cleanup_(false),
@@ -1994,14 +1704,6 @@
 
 void Debugger::NotifySingleStepping(bool value) const {
   isolate_->set_single_step(value);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // Do not call Interpreter::Current(), which may allocate an interpreter.
-  Interpreter* interpreter = Thread::Current()->interpreter();
-  if (interpreter != nullptr) {
-    // Do not reset is_debugging to false if bytecode debug breaks are enabled.
-    interpreter->set_is_debugging(value || HasEnabledBytecodeBreakpoints());
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
@@ -2024,22 +1726,6 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
-                                            uword pc,
-                                            StackFrame* frame,
-                                            const Bytecode& bytecode,
-                                            ActivationFrame::Kind kind) {
-  ASSERT(bytecode.ContainsInstructionAt(pc));
-  ActivationFrame* activation =
-      new ActivationFrame(pc, frame->fp(), frame->sp(), bytecode, kind);
-  if (FLAG_trace_debugger_stacktrace) {
-    const Context& ctx = activation->GetSavedCurrentContext();
-    OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
-    OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber());
-  }
-  return activation;
-}
-
 ArrayPtr Debugger::DeoptimizeToArray(Thread* thread,
                                      StackFrame* frame,
                                      const Code& code) {
@@ -2072,9 +1758,6 @@
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Code& inlined_code = Code::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
 
@@ -2086,22 +1769,9 @@
                    frame->ToCString());
     }
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        if (bytecode.function() == Function::null()) {
-          continue;  // Skip bytecode stub frame.
-        }
-        stack_trace->AddActivation(
-            CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                         &inlined_code, &deopt_frame);
-      }
+      code = frame->LookupDartCode();
+      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                       &inlined_code, &deopt_frame);
     }
   }
   return stack_trace;
@@ -2164,9 +1834,6 @@
 
   Object& code_obj = Object::Handle(zone);
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Smi& offset = Smi::Handle();
   Code& inlined_code = Code::Handle(zone);
   Array& deopt_frame = Array::Handle(zone);
@@ -2200,22 +1867,9 @@
   while (synchronous_stack_trace_length > 0) {
     ASSERT(frame != NULL);
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        if (bytecode.function() == Function::null()) {
-          continue;  // Skip bytecode stub frame.
-        }
-        stack_trace->AddActivation(
-            CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                         &inlined_code, &deopt_frame);
-      }
+      code = frame->LookupDartCode();
+      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                       &inlined_code, &deopt_frame);
       synchronous_stack_trace_length--;
     }
     frame = iterator.NextFrame();
@@ -2241,14 +1895,6 @@
         i++;
       } else {
         offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        if (code_obj.IsBytecode()) {
-          bytecode ^= code_obj.raw();
-          uword pc = bytecode.PayloadStart() + offset.Value();
-          stack_trace->AddAsyncCausalFrame(pc, bytecode);
-          continue;
-        }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
         code ^= code_obj.raw();
         uword pc = code.PayloadStart() + offset.Value();
         if (code.is_optimized()) {
@@ -2281,27 +1927,14 @@
   Code& inlined_code = Code::Handle(zone);
   Smi& offset = Smi::Handle();
   Array& deopt_frame = Array::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   constexpr intptr_t kDefaultStackAllocation = 8;
   auto stack_trace = new DebuggerStackTrace(kDefaultStackAllocation);
 
   std::function<void(StackFrame*)> on_sync_frame = [&](StackFrame* frame) {
-    if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      bytecode = frame->LookupDartBytecode();
-      stack_trace->AddActivation(
-          CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      code = frame->LookupDartCode();
-      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                       &inlined_code, &deopt_frame);
-    }
+    code = frame->LookupDartCode();
+    AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                     &inlined_code, &deopt_frame);
   };
 
   const auto& code_array = GrowableObjectArray::ZoneHandle(
@@ -2353,7 +1986,6 @@
 
   Object& code_object = Object::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   Function& function = Function::Handle(zone);
   Code& inlined_code = Code::Handle(zone);
@@ -2377,15 +2009,84 @@
                    frame->ToCString());
     }
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-        bytecode = frame->LookupDartBytecode();
-        function = bytecode.function();
-        if (function.IsNull()) {
-          continue;  // Skip bytecode stub frame.
+      code = frame->LookupDartCode();
+      if (code.is_optimized()) {
+        if (code.is_force_optimized()) {
+          if (FLAG_trace_debugger_stacktrace) {
+            function = code.function();
+            ASSERT(!function.IsNull());
+            OS::PrintErr(
+                "CollectAwaiterReturnStackTrace: "
+                "skipping force-optimized function: %s\n",
+                function.ToFullyQualifiedCString());
+          }
+          // Skip frame of force-optimized (and non-debuggable) function.
+          continue;
         }
+        deopt_frame = DeoptimizeToArray(thread, frame, code);
+        bool found_async_awaiter = false;
+        bool abort_attempt_to_navigate_through_sync_async = false;
+        for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
+             it.Advance()) {
+          inlined_code = it.code();
+          function = it.function();
+
+          if (skip_sync_async_frames_count > 0) {
+            function_name ^= function.QualifiedScrubbedName();
+            if (!StackTraceUtils::CheckAndSkipAsync(
+                    &skip_sync_async_frames_count, function_name)) {
+              // Unexpected function in sync async call
+              skip_sync_async_frames_count = -1;
+              abort_attempt_to_navigate_through_sync_async = true;
+              break;
+            }
+          }
+
+          if (FLAG_trace_debugger_stacktrace) {
+            ASSERT(!function.IsNull());
+            OS::PrintErr(
+                "CollectAwaiterReturnStackTrace: "
+                "visiting inlined function: %s\n ",
+                function.ToFullyQualifiedCString());
+          }
+          intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
+          if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
+            ActivationFrame* activation = CollectDartFrame(
+                isolate, it.pc(), frame, inlined_code, deopt_frame,
+                deopt_frame_offset, ActivationFrame::kAsyncActivation);
+            ASSERT(activation != NULL);
+            stack_trace->AddActivation(activation);
+            stack_has_async_function = true;
+            // Grab the awaiter.
+            async_activation ^=
+                activation->GetAsyncAwaiter(&caller_closure_finder);
+            found_async_awaiter = true;
+            // async function might have been called synchronously, in which
+            // case we need to keep going down the stack.
+            // To determine how we are called we peek few more frames further
+            // expecting to see Closure_call followed by
+            // AsyncAwaitCompleter_start.
+            // If we are able to see those functions we continue going down
+            // thestack, if we are not, we break out of the loop as we are
+            // not interested in exploring rest of the stack - there is only
+            // dart-internal code left.
+            skip_sync_async_frames_count = 2;
+          } else {
+            stack_trace->AddActivation(
+                CollectDartFrame(isolate, it.pc(), frame, inlined_code,
+                                 deopt_frame, deopt_frame_offset));
+          }
+        }
+        // Break out of outer loop.
+        if (found_async_awaiter ||
+            abort_attempt_to_navigate_through_sync_async) {
+          break;
+        }
+      } else {
+        function = code.function();
 
         if (skip_sync_async_frames_count > 0) {
-          function_name = function.QualifiedScrubbedName();
+          function_name ^= function.QualifiedScrubbedName();
           if (!StackTraceUtils::CheckAndSkipAsync(&skip_sync_async_frames_count,
                                                   function_name)) {
             // Unexpected function in synchronous call of async function.
@@ -2394,9 +2095,9 @@
         }
 
         if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-          ActivationFrame* activation =
-              CollectDartFrame(isolate, frame->pc(), frame, bytecode,
-                               ActivationFrame::kAsyncActivation);
+          ActivationFrame* activation = CollectDartFrame(
+              isolate, frame->pc(), frame, code, Object::null_array(), 0,
+              ActivationFrame::kAsyncActivation);
           ASSERT(activation != NULL);
           stack_trace->AddActivation(activation);
           stack_has_async_function = true;
@@ -2404,117 +2105,12 @@
           async_activation ^=
               activation->GetAsyncAwaiter(&caller_closure_finder);
           async_stack_trace ^= activation->GetCausalStack();
-          // Interpreted bytecode does not invoke _ClosureCall().
-          // Skip _AsyncAwaitCompleterStart() only.
-          skip_sync_async_frames_count = 1;
+          // see comment regarding skipping frames of async functions called
+          // synchronously above.
+          skip_sync_async_frames_count = 2;
         } else {
-          stack_trace->AddActivation(
-              CollectDartFrame(isolate, frame->pc(), frame, bytecode));
-        }
-      } else {
-        code = frame->LookupDartCode();
-        if (code.is_optimized()) {
-          if (code.is_force_optimized()) {
-            if (FLAG_trace_debugger_stacktrace) {
-              function = code.function();
-              ASSERT(!function.IsNull());
-              OS::PrintErr(
-                  "CollectAwaiterReturnStackTrace: "
-                  "skipping force-optimized function: %s\n",
-                  function.ToFullyQualifiedCString());
-            }
-            // Skip frame of force-optimized (and non-debuggable) function.
-            continue;
-          }
-          deopt_frame = DeoptimizeToArray(thread, frame, code);
-          bool found_async_awaiter = false;
-          bool abort_attempt_to_navigate_through_sync_async = false;
-          for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
-               it.Advance()) {
-            inlined_code = it.code();
-            function = it.function();
-
-            if (skip_sync_async_frames_count > 0) {
-              function_name ^= function.QualifiedScrubbedName();
-              if (!StackTraceUtils::CheckAndSkipAsync(
-                      &skip_sync_async_frames_count, function_name)) {
-                // Unexpected function in sync async call
-                skip_sync_async_frames_count = -1;
-                abort_attempt_to_navigate_through_sync_async = true;
-                break;
-              }
-            }
-
-            if (FLAG_trace_debugger_stacktrace) {
-              ASSERT(!function.IsNull());
-              OS::PrintErr(
-                  "CollectAwaiterReturnStackTrace: "
-                  "visiting inlined function: %s\n ",
-                  function.ToFullyQualifiedCString());
-            }
-            intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
-            if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-              ActivationFrame* activation = CollectDartFrame(
-                  isolate, it.pc(), frame, inlined_code, deopt_frame,
-                  deopt_frame_offset, ActivationFrame::kAsyncActivation);
-              ASSERT(activation != NULL);
-              stack_trace->AddActivation(activation);
-              stack_has_async_function = true;
-              // Grab the awaiter.
-              async_activation ^=
-                  activation->GetAsyncAwaiter(&caller_closure_finder);
-              found_async_awaiter = true;
-              // async function might have been called synchronously, in which
-              // case we need to keep going down the stack.
-              // To determine how we are called we peek few more frames further
-              // expecting to see Closure_call followed by
-              // AsyncAwaitCompleter_start.
-              // If we are able to see those functions we continue going down
-              // thestack, if we are not, we break out of the loop as we are
-              // not interested in exploring rest of the stack - there is only
-              // dart-internal code left.
-              skip_sync_async_frames_count = 2;
-            } else {
-              stack_trace->AddActivation(
-                  CollectDartFrame(isolate, it.pc(), frame, inlined_code,
-                                   deopt_frame, deopt_frame_offset));
-            }
-          }
-          // Break out of outer loop.
-          if (found_async_awaiter ||
-              abort_attempt_to_navigate_through_sync_async) {
-            break;
-          }
-        } else {
-          function = code.function();
-
-          if (skip_sync_async_frames_count > 0) {
-            function_name ^= function.QualifiedScrubbedName();
-            if (!StackTraceUtils::CheckAndSkipAsync(
-                    &skip_sync_async_frames_count, function_name)) {
-              // Unexpected function in synchronous call of async function.
-              break;
-            }
-          }
-
-          if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
-            ActivationFrame* activation = CollectDartFrame(
-                isolate, frame->pc(), frame, code, Object::null_array(), 0,
-                ActivationFrame::kAsyncActivation);
-            ASSERT(activation != NULL);
-            stack_trace->AddActivation(activation);
-            stack_has_async_function = true;
-            // Grab the awaiter.
-            async_activation ^=
-                activation->GetAsyncAwaiter(&caller_closure_finder);
-            async_stack_trace ^= activation->GetCausalStack();
-            // see comment regarding skipping frames of async functions called
-            // synchronously above.
-            skip_sync_async_frames_count = 2;
-          } else {
-            stack_trace->AddActivation(CollectDartFrame(
-                isolate, frame->pc(), frame, code, Object::null_array(), 0));
-          }
+          stack_trace->AddActivation(CollectDartFrame(
+              isolate, frame->pc(), frame, code, Object::null_array(), 0));
         }
       }
     }
@@ -2573,35 +2169,22 @@
       } else {
         code_object = async_stack_trace.CodeAtFrame(i);
         offset = Smi::RawCast(async_stack_trace.PcOffsetAtFrame(i));
-        if (code_object.IsBytecode()) {
-          bytecode ^= code_object.raw();
-          if (FLAG_trace_debugger_stacktrace) {
-            OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame %" Pd
-                         " in async causal stack trace:\n\t%s\n",
-                         i,
-                         Function::Handle(bytecode.function())
-                             .ToFullyQualifiedCString());
+        code ^= code_object.raw();
+        if (FLAG_trace_debugger_stacktrace) {
+          OS::PrintErr(
+              "CollectAwaiterReturnStackTrace: visiting frame %" Pd
+              " in async causal stack trace:\n\t%s\n",
+              i, Function::Handle(code.function()).ToFullyQualifiedCString());
+        }
+        uword pc = code.PayloadStart() + offset.Value();
+        if (code.is_optimized()) {
+          for (InlinedFunctionsIterator it(code, pc); !it.Done();
+               it.Advance()) {
+            inlined_code = it.code();
+            stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
           }
-          uword pc = bytecode.PayloadStart() + offset.Value();
-          stack_trace->AddAsyncCausalFrame(pc, bytecode);
         } else {
-          code ^= code_object.raw();
-          if (FLAG_trace_debugger_stacktrace) {
-            OS::PrintErr(
-                "CollectAwaiterReturnStackTrace: visiting frame %" Pd
-                " in async causal stack trace:\n\t%s\n",
-                i, Function::Handle(code.function()).ToFullyQualifiedCString());
-          }
-          uword pc = code.PayloadStart() + offset.Value();
-          if (code.is_optimized()) {
-            for (InlinedFunctionsIterator it(code, pc); !it.Done();
-                 it.Advance()) {
-              inlined_code = it.code();
-              stack_trace->AddAsyncCausalFrame(it.pc(), inlined_code);
-            }
-          } else {
-            stack_trace->AddAsyncCausalFrame(pc, code);
-          }
+          stack_trace->AddAsyncCausalFrame(pc, code);
         }
       }
     }
@@ -2624,19 +2207,6 @@
     if (!frame->IsDartFrame()) {
       continue;
     }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    if (frame->is_interpreted()) {
-      Bytecode& bytecode = Bytecode::Handle(frame->LookupDartBytecode());
-      // Note that we do not skip bytecode stub frame (with a null function),
-      // so that we can ignore a single stepping breakpoint in such a frame.
-      // A bytecode stub contains a VM internal bytecode followed by a
-      // ReturnTOS bytecode. The single step on the ReturnTOS bytecode
-      // needs to be skipped.
-      ActivationFrame* activation =
-          new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), bytecode);
-      return activation;
-    }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
     Code& code = Code::Handle(frame->LookupDartCode());
     ActivationFrame* activation = new ActivationFrame(
         frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0);
@@ -2675,9 +2245,6 @@
   Function& function = Function::Handle();
   Object& code_object = Object::Handle();
   Code& code = Code::Handle();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   const uword fp = 0;
   const uword sp = 0;
@@ -2692,51 +2259,33 @@
     // fewer frames that the pre-allocated trace (such as memory exhaustion with
     // a shallow stack).
     if (!code_object.IsNull()) {
-      if (code_object.IsBytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode ^= code_object.raw();
-        function = bytecode.function();
-        // Skip bytecode stub frames and frames with invisible function.
-        if (!function.IsNull() && function.is_visible()) {
-          ASSERT(function.raw() == bytecode.function());
-          uword pc =
-              bytecode.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
-          ActivationFrame* activation =
-              new ActivationFrame(pc, fp, sp, bytecode);
-          stack_trace->AddActivation(activation);
-        }
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code ^= code_object.raw();
-        ASSERT(code.IsFunctionCode());
-        function = code.function();
-        if (function.is_visible()) {
-          ASSERT(function.raw() == code.function());
-          uword pc =
-              code.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
-          if (code.is_optimized() && ex_trace.expand_inlined()) {
-            // Traverse inlined frames.
-            for (InlinedFunctionsIterator it(code, pc); !it.Done();
-                 it.Advance()) {
-              function = it.function();
-              code = it.code();
-              ASSERT(function.raw() == code.function());
-              uword pc = it.pc();
-              ASSERT(pc != 0);
-              ASSERT(code.PayloadStart() <= pc);
-              ASSERT(pc < (code.PayloadStart() + code.Size()));
+      code ^= code_object.raw();
+      ASSERT(code.IsFunctionCode());
+      function = code.function();
+      if (function.is_visible()) {
+        ASSERT(function.raw() == code.function());
+        uword pc =
+            code.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
+        if (code.is_optimized() && ex_trace.expand_inlined()) {
+          // Traverse inlined frames.
+          for (InlinedFunctionsIterator it(code, pc); !it.Done();
+               it.Advance()) {
+            function = it.function();
+            code = it.code();
+            ASSERT(function.raw() == code.function());
+            uword pc = it.pc();
+            ASSERT(pc != 0);
+            ASSERT(code.PayloadStart() <= pc);
+            ASSERT(pc < (code.PayloadStart() + code.Size()));
 
-              ActivationFrame* activation = new ActivationFrame(
-                  pc, fp, sp, code, deopt_frame, deopt_frame_offset);
-              stack_trace->AddActivation(activation);
-            }
-          } else {
             ActivationFrame* activation = new ActivationFrame(
                 pc, fp, sp, code, deopt_frame, deopt_frame_offset);
             stack_trace->AddActivation(activation);
           }
+        } else {
+          ActivationFrame* activation = new ActivationFrame(
+              pc, fp, sp, code, deopt_frame, deopt_frame_offset);
+          stack_trace->AddActivation(activation);
         }
       }
     }
@@ -2915,8 +2464,7 @@
 // algorithm, which would be simpler.  I believe that it only needs
 // two passes to support the recursive try-the-whole-function case.
 // Rewrite this later, once there are more tests in place.
-TokenPosition Debugger::ResolveBreakpointPos(bool in_bytecode,
-                                             const Function& func,
+TokenPosition Debugger::ResolveBreakpointPos(const Function& func,
                                              TokenPosition requested_token_pos,
                                              TokenPosition last_token_pos,
                                              intptr_t requested_column,
@@ -2933,24 +2481,11 @@
   Zone* zone = Thread::Current()->zone();
   Script& script = Script::Handle(zone, func.script());
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   PcDescriptors& desc = PcDescriptors::Handle(zone);
-  if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    ASSERT(func.HasBytecode());
-    bytecode = func.bytecode();
-    ASSERT(!bytecode.IsNull());
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  } else {
-    ASSERT(func.HasCode());
-    code = func.unoptimized_code();
-    ASSERT(!code.IsNull());
-    desc = code.pc_descriptors();
-  }
+  ASSERT(func.HasCode());
+  code = func.unoptimized_code();
+  ASSERT(!code.IsNull());
+  desc = code.pc_descriptors();
 
   // First pass: find the safe point which is closest to the beginning
   // of the given token range.
@@ -2961,96 +2496,29 @@
   // if column number is provided.
   TokenPosition best_token_pos = TokenPosition::kNoSource;
 
-  if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    uword pc_offset = kUwordMax;
-    TokenPosition pos = TokenPosition::kNoSource;
-    // Ignore all possible breakpoint positions until the first DebugCheck
-    // opcode of the function.
-    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-    if (debug_check_pc != 0) {
-      const uword debug_check_pc_offset =
-          debug_check_pc - bytecode.PayloadStart();
-      while (iter.MoveNext()) {
-        if (pc_offset != kUwordMax) {
-          // Check that there is at least one 'debug checked' opcode in the last
-          // source position range.
-          uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(
-              pc_offset, iter.PcOffset());
-          pc_offset = kUwordMax;
-          if (pc != 0) {
-            TokenPosition next_closest_token_position =
-                TokenPosition::kMaxSource;
-            if (requested_column >= 0) {
-              kernel::BytecodeSourcePositionsIterator iter2(zone, bytecode);
-              TokenPosition next_closest_token_position =
-                  TokenPosition::kMaxSource;
-              while (iter2.MoveNext()) {
-                const TokenPosition next = iter2.TokenPos();
-                if (next.IsReal() && next < next_closest_token_position &&
-                    next > pos) {
-                  next_closest_token_position = next;
-                }
-              }
-            }
-            RefineBreakpointPos(
-                script, pos, next_closest_token_position, requested_token_pos,
-                last_token_pos, requested_column, exact_token_pos,
-                &best_fit_pos, &best_column, &best_line, &best_token_pos);
-          }
-        }
-        pos = iter.TokenPos();
-        if ((!pos.IsReal()) || (pos < requested_token_pos) ||
-            (pos > last_token_pos)) {
-          // Token is not in the target range.
-          continue;
-        }
-        pc_offset = iter.PcOffset();
-        if (pc_offset < debug_check_pc_offset) {
-          // No breakpoints in prologue.
-          pc_offset = debug_check_pc_offset;
-        }
-      }
-      if (pc_offset != kUwordMax) {
-        uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                               bytecode.Size());
-        if (pc != 0) {
-          RefineBreakpointPos(script, pos, TokenPosition::kMaxSource,
-                              requested_token_pos, last_token_pos,
-                              requested_column, exact_token_pos, &best_fit_pos,
-                              &best_column, &best_line, &best_token_pos);
+  PcDescriptors::Iterator iter(desc, kSafepointKind);
+  while (iter.MoveNext()) {
+    const TokenPosition pos = iter.TokenPos();
+    if ((!pos.IsReal()) || (pos < requested_token_pos) ||
+        (pos > last_token_pos)) {
+      // Token is not in the target range.
+      continue;
+    }
+    TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
+    if (requested_column >= 0) {
+      // Find next closest safepoint
+      PcDescriptors::Iterator iter2(desc, kSafepointKind);
+      while (iter2.MoveNext()) {
+        const TokenPosition next = iter2.TokenPos();
+        if (next < next_closest_token_position && next > pos) {
+          next_closest_token_position = next;
         }
       }
     }
-#else
-    UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  } else {
-    PcDescriptors::Iterator iter(desc, kSafepointKind);
-    while (iter.MoveNext()) {
-      const TokenPosition pos = iter.TokenPos();
-      if ((!pos.IsReal()) || (pos < requested_token_pos) ||
-          (pos > last_token_pos)) {
-        // Token is not in the target range.
-        continue;
-      }
-      TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
-      if (requested_column >= 0) {
-        // Find next closest safepoint
-        PcDescriptors::Iterator iter2(desc, kSafepointKind);
-        while (iter2.MoveNext()) {
-          const TokenPosition next = iter2.TokenPos();
-          if (next < next_closest_token_position && next > pos) {
-            next_closest_token_position = next;
-          }
-        }
-      }
-      RefineBreakpointPos(script, pos, next_closest_token_position,
-                          requested_token_pos, last_token_pos, requested_column,
-                          exact_token_pos, &best_fit_pos, &best_column,
-                          &best_line, &best_token_pos);
-    }
+    RefineBreakpointPos(script, pos, next_closest_token_position,
+                        requested_token_pos, last_token_pos, requested_column,
+                        exact_token_pos, &best_fit_pos, &best_column,
+                        &best_line, &best_token_pos);
   }
 
   // Second pass (if we found a safe point in the first pass).  Find
@@ -3072,51 +2540,24 @@
     }
 
     uword lowest_pc_offset = kUwordMax;
-    if (in_bytecode) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-      while (iter.MoveNext()) {
-        const TokenPosition pos = iter.TokenPos();
-        if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
-          // Token is not on same line as best fit.
+    PcDescriptors::Iterator iter(desc, kSafepointKind);
+    while (iter.MoveNext()) {
+      const TokenPosition pos = iter.TokenPos();
+      if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
+        // Token is not on same line as best fit.
+        continue;
+      }
+
+      if (requested_column >= 0) {
+        if (pos != best_token_pos) {
           continue;
         }
-
-        if (requested_column >= 0) {
-          if (pos != best_token_pos) {
-            continue;
-          }
-        }
-
-        // Prefer the lowest pc offset.
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          best_fit_pos = pos;
-        }
       }
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      PcDescriptors::Iterator iter(desc, kSafepointKind);
-      while (iter.MoveNext()) {
-        const TokenPosition pos = iter.TokenPos();
-        if (!pos.IsReal() || (pos < begin_pos) || (pos > end_of_line_pos)) {
-          // Token is not on same line as best fit.
-          continue;
-        }
 
-        if (requested_column >= 0) {
-          if (pos != best_token_pos) {
-            continue;
-          }
-        }
-
-        // Prefer the lowest pc offset.
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          best_fit_pos = pos;
-        }
+      // Prefer the lowest pc offset.
+      if (iter.PcOffset() < lowest_pc_offset) {
+        lowest_pc_offset = iter.PcOffset();
+        best_fit_pos = pos;
       }
     }
     return best_fit_pos;
@@ -3127,9 +2568,8 @@
   // Since we have moved to the next line of the function, we no
   // longer are requesting a specific column number.
   if (last_token_pos < func.end_token_pos()) {
-    return ResolveBreakpointPos(in_bytecode, func, last_token_pos,
-                                func.end_token_pos(), -1 /* no column */,
-                                TokenPosition::kNoSource);
+    return ResolveBreakpointPos(func, last_token_pos, func.end_token_pos(),
+                                -1 /* no column */, TokenPosition::kNoSource);
   }
   return TokenPosition::kNoSource;
 }
@@ -3139,105 +2579,41 @@
   ASSERT(loc->token_pos_.IsReal());
   ASSERT((loc != NULL) && loc->IsResolved());
   ASSERT(!func.HasOptimizedCode());
-  ASSERT(func.HasCode() || func.HasBytecode());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (func.HasBytecode() && FLAG_enable_interpreter) {
-    Bytecode& bytecode = Bytecode::Handle(func.bytecode());
-    ASSERT(!bytecode.IsNull());
-    uword pc = 0;
-    if (bytecode.HasSourcePositions()) {
-      kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                                   bytecode);
-      // Ignore all possible breakpoint positions until the first DebugCheck
-      // opcode of the function.
-      const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-      if (debug_check_pc != 0) {
-        const uword debug_check_pc_offset =
-            debug_check_pc - bytecode.PayloadStart();
-        uword pc_offset = kUwordMax;
-        while (iter.MoveNext()) {
-          if (pc_offset != kUwordMax) {
-            pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                             iter.PcOffset());
-            pc_offset = kUwordMax;
-            if (pc != 0) {
-              // TODO(regis): We may want to find all PCs for a token position,
-              // e.g. in the case of duplicated bytecode in finally clauses.
-              break;
-            }
-            // This range does not contain a 'debug checked' opcode or the
-            // first DebugCheck opcode of the function is not reached yet.
-          }
-          if (iter.TokenPos() == loc->token_pos_) {
-            pc_offset = iter.PcOffset();
-            if (pc_offset < debug_check_pc_offset) {
-              // No breakpoints in prologue.
-              pc_offset = debug_check_pc_offset;
-            }
-          }
-        }
-        if (pc_offset != kUwordMax) {
-          pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
-                                                           bytecode.Size());
-        }
-      }
-    }
-    if (pc != 0) {
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(pc);
-      if (code_bpt == NULL) {
-        // No code breakpoint for this code exists; create one.
-        code_bpt = new CodeBreakpoint(bytecode, loc->token_pos_, pc);
-        if (FLAG_verbose_debug) {
-          OS::PrintErr("Setting bytecode breakpoint at pos %s pc %#" Px
-                       " offset %#" Px "\n",
-                       loc->token_pos_.ToCString(), pc,
-                       pc - bytecode.PayloadStart());
-        }
-        RegisterCodeBreakpoint(code_bpt);
-      }
-      code_bpt->set_bpt_location(loc);
-      if (loc->AnyEnabled()) {
-        code_bpt->Enable();
+  ASSERT(func.HasCode());
+  Code& code = Code::Handle(func.unoptimized_code());
+  ASSERT(!code.IsNull());
+  PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
+  uword lowest_pc_offset = kUwordMax;
+  PcDescriptorsLayout::Kind lowest_kind = PcDescriptorsLayout::kAnyKind;
+  // Find the safe point with the lowest compiled code address
+  // that maps to the token position of the source breakpoint.
+  PcDescriptors::Iterator iter(desc, kSafepointKind);
+  while (iter.MoveNext()) {
+    if (iter.TokenPos() == loc->token_pos_) {
+      if (iter.PcOffset() < lowest_pc_offset) {
+        lowest_pc_offset = iter.PcOffset();
+        lowest_kind = iter.Kind();
       }
     }
   }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  if (func.HasCode()) {
-    Code& code = Code::Handle(func.unoptimized_code());
-    ASSERT(!code.IsNull());
-    PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
-    uword lowest_pc_offset = kUwordMax;
-    PcDescriptorsLayout::Kind lowest_kind = PcDescriptorsLayout::kAnyKind;
-    // Find the safe point with the lowest compiled code address
-    // that maps to the token position of the source breakpoint.
-    PcDescriptors::Iterator iter(desc, kSafepointKind);
-    while (iter.MoveNext()) {
-      if (iter.TokenPos() == loc->token_pos_) {
-        if (iter.PcOffset() < lowest_pc_offset) {
-          lowest_pc_offset = iter.PcOffset();
-          lowest_kind = iter.Kind();
-        }
+  if (lowest_pc_offset != kUwordMax) {
+    uword lowest_pc = code.PayloadStart() + lowest_pc_offset;
+    CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
+    if (code_bpt == NULL) {
+      // No code breakpoint for this code exists; create one.
+      code_bpt =
+          new CodeBreakpoint(code, loc->token_pos_, lowest_pc, lowest_kind);
+      if (FLAG_verbose_debug) {
+        OS::PrintErr("Setting code breakpoint at pos %s pc %#" Px
+                     " offset %#" Px "\n",
+                     loc->token_pos_.ToCString(), lowest_pc,
+                     lowest_pc - code.PayloadStart());
       }
+      RegisterCodeBreakpoint(code_bpt);
     }
-    if (lowest_pc_offset != kUwordMax) {
-      uword lowest_pc = code.PayloadStart() + lowest_pc_offset;
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_pc);
-      if (code_bpt == NULL) {
-        // No code breakpoint for this code exists; create one.
-        code_bpt =
-            new CodeBreakpoint(code, loc->token_pos_, lowest_pc, lowest_kind);
-        if (FLAG_verbose_debug) {
-          OS::PrintErr("Setting code breakpoint at pos %s pc %#" Px
-                       " offset %#" Px "\n",
-                       loc->token_pos_.ToCString(), lowest_pc,
-                       lowest_pc - code.PayloadStart());
-        }
-        RegisterCodeBreakpoint(code_bpt);
-      }
-      code_bpt->set_bpt_location(loc);
-      if (loc->AnyEnabled()) {
-        code_bpt->Enable();
-      }
+    code_bpt->set_bpt_location(loc);
+    if (loc->AnyEnabled()) {
+      code_bpt->Enable();
     }
   }
 }
@@ -3246,7 +2622,6 @@
     const Script& script,
     TokenPosition start_pos,
     TokenPosition end_pos,
-    GrowableObjectArray* bytecode_function_list,
     GrowableObjectArray* code_function_list) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -3264,9 +2639,6 @@
         (function.end_token_pos() == end_pos) &&
         (function.script() == script.raw())) {
       if (function.is_debuggable()) {
-        if (FLAG_enable_interpreter && function.HasBytecode()) {
-          bytecode_function_list->Add(function);
-        }
         if (function.HasCode()) {
           code_function_list->Add(function);
         }
@@ -3274,9 +2646,6 @@
       if (function.HasImplicitClosureFunction()) {
         function = function.ImplicitClosureFunction();
         if (function.is_debuggable()) {
-          if (FLAG_enable_interpreter && function.HasBytecode()) {
-            bytecode_function_list->Add(function);
-          }
           if (function.HasCode()) {
             code_function_list->Add(function);
           }
@@ -3310,29 +2679,17 @@
           function ^= functions.At(pos);
           ASSERT(!function.IsNull());
           bool function_added = false;
-          if (function.is_debuggable() &&
-              (function.HasCode() ||
-               (FLAG_enable_interpreter && function.HasBytecode())) &&
+          if (function.is_debuggable() && function.HasCode() &&
               function.token_pos() == start_pos &&
               function.end_token_pos() == end_pos &&
               function.script() == script.raw()) {
-            if (FLAG_enable_interpreter && function.HasBytecode()) {
-              bytecode_function_list->Add(function);
-            }
-            if (function.HasCode()) {
-              code_function_list->Add(function);
-            }
+            code_function_list->Add(function);
             function_added = true;
           }
           if (function_added && function.HasImplicitClosureFunction()) {
             function = function.ImplicitClosureFunction();
-            if (function.is_debuggable()) {
-              if (FLAG_enable_interpreter && function.HasBytecode()) {
-                bytecode_function_list->Add(function);
-              }
-              if (function.HasCode()) {
-                code_function_list->Add(function);
-              }
+            if (function.is_debuggable() && function.HasCode()) {
+              code_function_list->Add(function);
             }
           }
         }
@@ -3498,8 +2855,6 @@
 }
 
 BreakpointLocation* Debugger::SetCodeBreakpoints(
-    bool in_bytecode,
-    BreakpointLocation* loc,
     const Script& script,
     TokenPosition token_pos,
     TokenPosition last_token_pos,
@@ -3507,24 +2862,18 @@
     intptr_t requested_column,
     TokenPosition exact_token_pos,
     const GrowableObjectArray& functions) {
-  ASSERT(!in_bytecode || FLAG_enable_interpreter);
   Function& function = Function::Handle();
   function ^= functions.At(0);
-  TokenPosition breakpoint_pos =
-      ResolveBreakpointPos(in_bytecode, function, token_pos, last_token_pos,
-                           requested_column, exact_token_pos);
+  TokenPosition breakpoint_pos = ResolveBreakpointPos(
+      function, token_pos, last_token_pos, requested_column, exact_token_pos);
   if (!breakpoint_pos.IsReal()) {
     return NULL;
   }
-  if (loc == NULL) {
-    // Find an existing resolved breakpoint location.
-    loc = GetBreakpointLocation(
-        script, TokenPosition::kNoSource,
-        /* requested_line = */ -1,
-        /* requested_column = */ -1,
-        in_bytecode ? breakpoint_pos : TokenPosition::kNoSource,
-        !in_bytecode ? breakpoint_pos : TokenPosition::kNoSource);
-  }
+  // Find an existing resolved breakpoint location.
+  BreakpointLocation* loc =
+      GetBreakpointLocation(script, TokenPosition::kNoSource,
+                            /* requested_line = */ -1,
+                            /* requested_column = */ -1, breakpoint_pos);
   if (loc == NULL) {
     // Find an existing unresolved breakpoint location.
     loc = GetBreakpointLocation(script, token_pos, requested_line,
@@ -3536,28 +2885,26 @@
     RegisterBreakpointLocation(loc);
   }
   // A source breakpoint for this location may already exists, but it may
-  // not yet be resolved in both bytecode and code.
-  if (loc->IsResolved(in_bytecode)) {
+  // not yet be resolved in code.
+  if (loc->IsResolved()) {
     return loc;
   }
-  loc->SetResolved(in_bytecode, function, breakpoint_pos);
+  loc->SetResolved(function, breakpoint_pos);
 
   // Create code breakpoints for all compiled functions we found.
   Function& func = Function::Handle();
   const intptr_t num_functions = functions.Length();
   for (intptr_t i = 0; i < num_functions; i++) {
     func ^= functions.At(i);
-    ASSERT((in_bytecode && func.HasBytecode()) ||
-           (!in_bytecode && func.HasCode()));
+    ASSERT(func.HasCode());
     MakeCodeBreakpointAt(func, loc);
   }
   if (FLAG_verbose_debug) {
     intptr_t line_number;
     intptr_t column_number;
     script.GetTokenLocation(breakpoint_pos, &line_number, &column_number);
-    OS::PrintErr("Resolved %s breakpoint for function '%s' at line %" Pd
+    OS::PrintErr("Resolved code breakpoint for function '%s' at line %" Pd
                  " col %" Pd "\n",
-                 in_bytecode ? "bytecode" : "code",
                  func.ToFullyQualifiedCString(), line_number, column_number);
   }
   return loc;
@@ -3578,7 +2925,7 @@
   } else {
     func = function.raw();
     if (!func.token_pos().IsReal()) {
-      return NULL;  // Missing source positions in bytecode?
+      return NULL;  // Missing source positions?
     }
   }
   if (!func.IsNull()) {
@@ -3587,14 +2934,12 @@
     // there may be copies of mixin functions. Collect all compiled
     // functions whose source code range matches exactly the best fit
     // function we found.
-    GrowableObjectArray& bytecode_functions =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
     GrowableObjectArray& code_functions =
         GrowableObjectArray::Handle(GrowableObjectArray::New());
     FindCompiledFunctions(script, func.token_pos(), func.end_token_pos(),
-                          &bytecode_functions, &code_functions);
+                          &code_functions);
 
-    if (bytecode_functions.Length() > 0 || code_functions.Length() > 0) {
+    if (code_functions.Length() > 0) {
       // One or more function object containing this breakpoint location
       // have already been compiled. We can resolve the breakpoint now.
       // If requested_column is larger than zero, [token_pos, last_token_pos]
@@ -3607,19 +2952,9 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
       }
       DeoptimizeWorld();
-      // Since source positions may differ in code and bytecode, process
-      // breakpoints in bytecode and code separately.
-      BreakpointLocation* loc = NULL;
-      if (bytecode_functions.Length() > 0) {
-        loc = SetCodeBreakpoints(true, loc, script, token_pos, last_token_pos,
-                                 requested_line, requested_column,
-                                 exact_token_pos, bytecode_functions);
-      }
-      if (code_functions.Length() > 0) {
-        loc = SetCodeBreakpoints(false, loc, script, token_pos, last_token_pos,
-                                 requested_line, requested_column,
-                                 exact_token_pos, code_functions);
-      }
+      BreakpointLocation* loc =
+          SetCodeBreakpoints(script, token_pos, last_token_pos, requested_line,
+                             requested_column, exact_token_pos, code_functions);
       if (loc != NULL) {
         return loc;
       }
@@ -3955,7 +3290,6 @@
       (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
        stack_trace->FrameAt(0)->function().IsAsyncGenClosure())) {
     async_stepping_fp_ = stack_trace->FrameAt(0)->fp();
-    interpreted_async_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     async_stepping_fp_ = 0;
   }
@@ -3964,7 +3298,6 @@
 void Debugger::SetSyncSteppingFramePointer(DebuggerStackTrace* stack_trace) {
   if (stack_trace->Length() > 0) {
     stepping_fp_ = stack_trace->FrameAt(0)->fp();
-    interpreted_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     stepping_fp_ = 0;
   }
@@ -4025,7 +3358,6 @@
       ActivationFrame* frame = stack_trace->FrameAt(i);
       if (frame->IsDebuggable()) {
         stepping_fp_ = frame->fp();
-        interpreted_stepping_ = frame->IsInterpreted();
         break;
       }
     }
@@ -4149,33 +3481,10 @@
   return 0;
 }
 
-// Given a return address, find the "rewind" pc, which is the pc
-// before the corresponding call.
-static uword LookupRewindPc(const Bytecode& bytecode, uword return_address) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  ASSERT(bytecode.ContainsInstructionAt(return_address));
-  uword pc = bytecode.PayloadStart();
-  const uword end_pc = pc + bytecode.Size();
-  while (pc < end_pc) {
-    uword next_pc = KernelBytecode::Next(pc);
-    if (next_pc == return_address) {
-      return pc;
-    }
-    pc = next_pc;
-  }
-  return 0;
-#endif
-}
-
 void Debugger::RewindToFrame(intptr_t frame_index) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Code& code = Code::Handle(zone);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(zone);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Function& function = Function::Handle(zone);
 
   // Find the requested frame.
@@ -4187,47 +3496,29 @@
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (frame->IsDartFrame()) {
-      if (frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-        bytecode = frame->LookupDartBytecode();
-        function = bytecode.function();
-        if (function.IsNull() || !IsFunctionVisible(function)) {
-          continue;  // Skip bytecode stub frame or invisible frame.
-        }
-        if (current_frame == frame_index) {
-          // We are rewinding to an interpreted frame.
-          RewindToInterpretedFrame(frame, bytecode);
-          UNREACHABLE();
-        }
-        current_frame++;
-#else
-        UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-      } else {
-        code = frame->LookupDartCode();
-        function = code.function();
-        if (!IsFunctionVisible(function)) {
-          continue;
-        }
-        if (code.is_optimized()) {
-          intptr_t sub_index = 0;
-          for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
-               it.Advance()) {
-            if (current_frame == frame_index) {
-              RewindToOptimizedFrame(frame, code, sub_index);
-              UNREACHABLE();
-            }
-            current_frame++;
-            sub_index++;
-          }
-        } else {
+      code = frame->LookupDartCode();
+      function = code.function();
+      if (!IsFunctionVisible(function)) {
+        continue;
+      }
+      if (code.is_optimized()) {
+        intptr_t sub_index = 0;
+        for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
+             it.Advance()) {
           if (current_frame == frame_index) {
-            // We are rewinding to an unoptimized frame.
-            RewindToUnoptimizedFrame(frame, code);
+            RewindToOptimizedFrame(frame, code, sub_index);
             UNREACHABLE();
           }
           current_frame++;
+          sub_index++;
         }
+      } else {
+        if (current_frame == frame_index) {
+          // We are rewinding to an unoptimized frame.
+          RewindToUnoptimizedFrame(frame, code);
+          UNREACHABLE();
+        }
+        current_frame++;
       }
     }
   }
@@ -4290,36 +3581,6 @@
   UNREACHABLE();
 }
 
-void Debugger::RewindToInterpretedFrame(StackFrame* frame,
-                                        const Bytecode& bytecode) {
-  // We will be jumping out of the debugger rather than exiting this
-  // function, so prepare the debugger state.
-  ClearCachedStackTraces();
-  resume_action_ = kContinue;
-  resume_frame_index_ = -1;
-  EnterSingleStepMode();
-
-  uword rewind_pc = LookupRewindPc(bytecode, frame->pc());
-  if (FLAG_trace_rewind && rewind_pc == 0) {
-    OS::PrintErr("Unable to find rewind pc for bytecode pc(%" Px ")\n",
-                 frame->pc());
-  }
-  ASSERT(rewind_pc != 0);
-  if (FLAG_trace_rewind) {
-    OS::PrintErr(
-        "===============================\n"
-        "Rewinding to interpreted frame:\n"
-        "    rewind_pc(0x%" Px " offset:0x%" Px ") sp(0x%" Px ") fp(0x%" Px
-        ")\n"
-        "===============================\n",
-        rewind_pc, rewind_pc - bytecode.PayloadStart(), frame->sp(),
-        frame->fp());
-  }
-  Exceptions::JumpToFrame(Thread::Current(), rewind_pc, frame->sp(),
-                          frame->fp(), true /* clear lazy deopt at target */);
-  UNREACHABLE();
-}
-
 void Debugger::RewindPostDeopt() {
   intptr_t rewind_frame = post_deopt_frame_index_;
   post_deopt_frame_index_ = -1;
@@ -4404,23 +3665,6 @@
            top_frame->function().IsAsyncGenClosure());
     ASSERT(closure_or_null.IsInstance());
     ASSERT(Instance::Cast(closure_or_null).IsClosure());
-    if (top_frame->function().is_declared_in_bytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      const auto& bytecode =
-          Bytecode::Handle(zone, top_frame->function().bytecode());
-      const TokenPosition token_pos = top_frame->TokenPos();
-      kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-      while (iter.MoveNext()) {
-        if (iter.IsYieldPoint() && (iter.TokenPos() == token_pos)) {
-          return true;
-        }
-      }
-      return false;
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    }
-    ASSERT(!top_frame->IsInterpreted());
     const auto& pc_descriptors =
         PcDescriptors::Handle(zone, top_frame->code().pc_descriptors());
     if (pc_descriptors.IsNull()) {
@@ -4464,7 +3708,7 @@
       // async machinery as we finish the async function. The second check
       // handles the case of returning from an async function.
       const ActivationFrame::Relation relation =
-          frame->CompareTo(async_stepping_fp_, interpreted_async_stepping_);
+          frame->CompareTo(async_stepping_fp_);
       const bool exited_async_function =
           (relation == ActivationFrame::kCallee && frame->IsAsyncMachinery()) ||
           relation == ActivationFrame::kCaller;
@@ -4481,8 +3725,7 @@
   if (stepping_fp_ != 0) {
     // There is an "interesting frame" set. Only pause at appropriate
     // locations in this frame.
-    const ActivationFrame::Relation relation =
-        frame->CompareTo(stepping_fp_, interpreted_stepping_);
+    const ActivationFrame::Relation relation = frame->CompareTo(stepping_fp_);
     if (relation == ActivationFrame::kCallee) {
       // We are in a callee of the frame we're interested in.
       // Ignore this stepping break.
@@ -4540,17 +3783,6 @@
     return Error::null();
   }
 
-  // In bytecode, do not stop before encountering the DebugCheck opcode.
-  // Skip this check if we previously stopped in this frame.
-  // If no DebugCheck was emitted, do not stop (InPrologue returns true).
-  if (frame->IsInterpreted() && frame->fp() != last_stepping_fp_) {
-    uword debug_check_pc = frame->bytecode().GetFirstDebugCheckOpcodePc();
-    // Frame pc is return address, debug_check_pc is exact, so use '<=' in test.
-    if (debug_check_pc == 0 || frame->pc() <= debug_check_pc) {
-      return Error::null();
-    }
-  }
-
   // We are stopping in this frame at the token pos.
   last_stepping_fp_ = frame->fp();
   last_stepping_pos_ = frame->TokenPos();
@@ -4561,15 +3793,13 @@
   ASSERT(!HasActiveBreakpoint(frame->pc()));
 
   if (FLAG_verbose_debug) {
-    OS::PrintErr(
-        ">>> single step break at %s:%" Pd ":%" Pd
-        " (func %s token %s address %#" Px " offset %#" Px ")\n",
-        String::Handle(frame->SourceUrl()).ToCString(), frame->LineNumber(),
-        frame->ColumnNumber(),
-        String::Handle(frame->QualifiedFunctionName()).ToCString(),
-        frame->TokenPos().ToCString(), frame->pc(),
-        frame->pc() - (frame->IsInterpreted() ? frame->bytecode().PayloadStart()
-                                              : frame->code().PayloadStart()));
+    OS::PrintErr(">>> single step break at %s:%" Pd ":%" Pd
+                 " (func %s token %s address %#" Px " offset %#" Px ")\n",
+                 String::Handle(frame->SourceUrl()).ToCString(),
+                 frame->LineNumber(), frame->ColumnNumber(),
+                 String::Handle(frame->QualifiedFunctionName()).ToCString(),
+                 frame->TokenPos().ToCString(), frame->pc(),
+                 frame->pc() - frame->code().PayloadStart());
   }
 
   CacheStackTraces(CollectStackTrace(), CollectAsyncCausalStackTrace(),
@@ -4622,9 +3852,7 @@
           String::Handle(cbpt->SourceUrl()).ToCString(), cbpt->LineNumber(),
           String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
           cbpt->token_pos().ToCString(), top_frame->pc(),
-          top_frame->pc() - (top_frame->IsInterpreted()
-                                 ? top_frame->bytecode().PayloadStart()
-                                 : top_frame->code().PayloadStart()));
+          top_frame->pc() - top_frame->code().PayloadStart());
     }
 
     ASSERT(synthetic_async_breakpoint_ == NULL);
@@ -4648,9 +3876,7 @@
                  cbpt->LineNumber(),
                  String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
                  cbpt->token_pos().ToCString(), top_frame->pc(),
-                 top_frame->pc() - (top_frame->IsInterpreted()
-                                        ? top_frame->bytecode().PayloadStart()
-                                        : top_frame->code().PayloadStart()));
+                 top_frame->pc() - top_frame->code().PayloadStart());
   }
 
   CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
@@ -4778,15 +4004,11 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-void Debugger::HandleCodeChange(bool bytecode_loaded, const Function& func) {
+void Debugger::NotifyCompilation(const Function& func) {
   if (breakpoint_locations_ == NULL) {
     // Return with minimal overhead if there are no breakpoints.
     return;
   }
-  if (bytecode_loaded && !FLAG_enable_interpreter) {
-    // We do not set breakpoints in bytecode if the interpreter is not used.
-    return;
-  }
   if (!func.is_debuggable()) {
     // Nothing to do if the function is not debuggable. If there is
     // a pending breakpoint in an inner function (that is debuggable),
@@ -4816,46 +4038,23 @@
       const Function& inner_function =
           Function::Handle(zone, FindInnermostClosure(func, token_pos));
       if (!inner_function.IsNull()) {
-        if (bytecode_loaded) {
-          // func's bytecode was just loaded.
-          // If func is a closure and has an inner closure, the inner closure
-          // may not have been loaded yet.
-          if (inner_function.HasBytecode()) {
-            ASSERT(loc->IsResolved(bytecode_loaded));
-          } else {
-            if (FLAG_verbose_debug) {
-              OS::PrintErr(
-                  "Pending breakpoint remains unresolved in "
-                  "inner bytecode function '%s'\n",
-                  inner_function.ToFullyQualifiedCString());
-            }
-          }
-          continue;
-        } else {
-          if (FLAG_verbose_debug) {
-            OS::PrintErr(
-                "Pending breakpoint remains unresolved in "
-                "inner function '%s'\n",
-                inner_function.ToFullyQualifiedCString());
-          }
-          continue;
+        if (FLAG_verbose_debug) {
+          OS::PrintErr(
+              "Pending breakpoint remains unresolved in "
+              "inner function '%s'\n",
+              inner_function.ToFullyQualifiedCString());
         }
-
-        // TODO(hausner): What should we do if function is optimized?
-        // Can we deoptimize the function?
-        ASSERT(!func.HasOptimizedCode());
+        continue;
       }
 
       // There is no local function within func that contains the
       // breakpoint token position. Resolve the breakpoint if necessary
       // and set the code breakpoints.
-      const bool resolved_in_bytecode =
-          !bytecode_loaded && loc->IsResolved(/* in_bytecode = */ true);
-      if (!loc->IsResolved(bytecode_loaded)) {
+      if (!loc->IsResolved()) {
         // Resolve source breakpoint in the newly compiled function.
-        TokenPosition bp_pos = ResolveBreakpointPos(
-            bytecode_loaded, func, loc->token_pos(), loc->end_token_pos(),
-            loc->requested_column_number(), token_pos);
+        TokenPosition bp_pos =
+            ResolveBreakpointPos(func, loc->token_pos(), loc->end_token_pos(),
+                                 loc->requested_column_number(), token_pos);
         if (!bp_pos.IsDebugPause()) {
           if (FLAG_verbose_debug) {
             OS::PrintErr("Failed resolving breakpoint for function '%s'\n",
@@ -4865,7 +4064,7 @@
         }
         TokenPosition requested_pos = loc->token_pos();
         TokenPosition requested_end_pos = loc->end_token_pos();
-        loc->SetResolved(bytecode_loaded, func, bp_pos);
+        loc->SetResolved(func, bp_pos);
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
           if (FLAG_verbose_debug) {
@@ -4877,15 +4076,11 @@
                 func.ToFullyQualifiedCString(), requested_pos.ToCString(),
                 requested_end_pos.ToCString(), loc->requested_column_number());
           }
-          // Do not signal resolution in code if already signaled resolution
-          // in bytecode.
-          if (!resolved_in_bytecode) {
-            SendBreakpointEvent(ServiceEvent::kBreakpointResolved, bpt);
-          }
+          SendBreakpointEvent(ServiceEvent::kBreakpointResolved, bpt);
           bpt = bpt->next();
         }
       }
-      ASSERT(loc->IsResolved(bytecode_loaded));
+      ASSERT(loc->IsResolved());
       if (FLAG_verbose_debug) {
         Breakpoint* bpt = loc->breakpoints();
         while (bpt != NULL) {
@@ -5167,7 +4362,6 @@
     TokenPosition token_pos,
     intptr_t requested_line,
     intptr_t requested_column,
-    TokenPosition bytecode_token_pos,
     TokenPosition code_token_pos) {
   BreakpointLocation* loc = breakpoint_locations_;
   while (loc != NULL) {
@@ -5177,8 +4371,6 @@
          (loc->requested_line_number_ == requested_line)) &&
         ((requested_column == -1) ||
          (loc->requested_column_number_ == requested_column)) &&
-        (!bytecode_token_pos.IsReal() ||
-         (loc->bytecode_token_pos_ == bytecode_token_pos)) &&
         (!code_token_pos.IsReal() ||
          (loc->code_token_pos_ == code_token_pos))) {
       return loc;
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 7a99640..e5fd4ac 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -7,7 +7,6 @@
 
 #include "include/dart_tools_api.h"
 
-#include "vm/constants_kbc.h"
 #include "vm/kernel_isolate.h"
 #include "vm/object.h"
 #include "vm/port.h"
@@ -152,21 +151,13 @@
                             bool for_over_await);
 
   bool AnyEnabled() const;
-  bool IsResolved() const {
-    return bytecode_token_pos_.IsReal() || code_token_pos_.IsReal();
-  }
-  bool IsResolved(bool in_bytecode) const {
-    return in_bytecode ? bytecode_token_pos_.IsReal()
-                       : code_token_pos_.IsReal();
-  }
+  bool IsResolved() const { return code_token_pos_.IsReal(); }
   bool IsLatent() const { return !token_pos_.IsReal(); }
 
  private:
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-  void SetResolved(bool in_bytecode,
-                   const Function& func,
-                   TokenPosition token_pos);
+  void SetResolved(const Function& func, TokenPosition token_pos);
 
   BreakpointLocation* next() const { return this->next_; }
   void set_next(BreakpointLocation* value) { next_ = value; }
@@ -187,14 +178,13 @@
 
   // Valid for resolved breakpoints:
   FunctionPtr function_;
-  TokenPosition bytecode_token_pos_;
   TokenPosition code_token_pos_;
 
   friend class Debugger;
   DISALLOW_COPY_AND_ASSIGN(BreakpointLocation);
 };
 
-// CodeBreakpoint represents a location in compiled or interpreted code.
+// CodeBreakpoint represents a location in compiled code.
 // There may be more than one CodeBreakpoint for one BreakpointLocation,
 // e.g. when a function gets compiled as a regular function and as a closure.
 class CodeBreakpoint {
@@ -203,7 +193,6 @@
                  TokenPosition token_pos,
                  uword pc,
                  PcDescriptorsLayout::Kind kind);
-  CodeBreakpoint(const Bytecode& bytecode, TokenPosition token_pos, uword pc);
   ~CodeBreakpoint();
 
   FunctionPtr function() const;
@@ -217,7 +206,6 @@
   void Enable();
   void Disable();
   bool IsEnabled() const { return is_enabled_; }
-  bool IsInterpreted() const { return bytecode_ != Bytecode::null(); }
 
   CodePtr OrigStubAddress() const;
 
@@ -232,11 +220,8 @@
 
   void PatchCode();
   void RestoreCode();
-  void SetBytecodeBreakpoint();
-  void UnsetBytecodeBreakpoint();
 
   CodePtr code_;
-  BytecodePtr bytecode_;
   TokenPosition token_pos_;
   uword pc_;
   intptr_t line_number_;
@@ -273,16 +258,6 @@
 
   ActivationFrame(uword pc, const Code& code);
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  ActivationFrame(uword pc,
-                  uword fp,
-                  uword sp,
-                  const Bytecode& bytecode,
-                  Kind kind = kRegular);
-
-  ActivationFrame(uword pc, const Bytecode& bytecode);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   explicit ActivationFrame(Kind kind);
 
   explicit ActivationFrame(const Closure& async_activation);
@@ -291,11 +266,7 @@
   uword fp() const { return fp_; }
   uword sp() const { return sp_; }
 
-  uword GetCallerSp() const {
-    return fp() +
-           ((IsInterpreted() ? kKBCCallerSpSlotFromFp : kCallerSpSlotFromFp) *
-            kWordSize);
-  }
+  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
 
   const Function& function() const {
     return function_;
@@ -304,11 +275,6 @@
     ASSERT(!code_.IsNull());
     return code_;
   }
-  const Bytecode& bytecode() const {
-    ASSERT(!bytecode_.IsNull());
-    return bytecode_;
-  }
-  bool IsInterpreted() const { return !bytecode_.IsNull(); }
 
   enum Relation {
     kCallee,
@@ -316,7 +282,7 @@
     kCaller,
   };
 
-  Relation CompareTo(uword other_fp, bool other_is_interpreted) const;
+  Relation CompareTo(uword other_fp) const;
 
   StringPtr QualifiedFunctionName();
   StringPtr SourceUrl();
@@ -430,7 +396,6 @@
   // The anchor of the context chain for this function.
   Context& ctx_;
   Code& code_;
-  Bytecode& bytecode_;
   Function& function_;
   bool live_frame_;  // Is this frame a live frame?
   bool token_pos_initialized_;
@@ -473,7 +438,6 @@
   void AddActivation(ActivationFrame* frame);
   void AddMarker(ActivationFrame::Kind marker);
   void AddAsyncCausalFrame(uword pc, const Code& code);
-  void AddAsyncCausalFrame(uword pc, const Bytecode& bytecode);
 
   ZoneGrowableArray<ActivationFrame*> trace_;
 
@@ -508,12 +472,7 @@
 
   void OnIsolateRunnable();
 
-  void NotifyCompilation(const Function& func) {
-    HandleCodeChange(/* bytecode_loaded = */ false, func);
-  }
-  void NotifyBytecodeLoaded(const Function& func) {
-    HandleCodeChange(/* bytecode_loaded = */ true, func);
-  }
+  void NotifyCompilation(const Function& func);
   void NotifyDoneLoading();
 
   // Set breakpoint at closest location to function entry.
@@ -561,10 +520,6 @@
     ignore_breakpoints_ = ignore_breakpoints;
   }
 
-  bool HasEnabledBytecodeBreakpoints() const;
-  // Called from the interpreter. Note that pc already points to next bytecode.
-  bool HasBytecodeBreakpointAt(const KBCInstr* next_pc) const;
-
   // Put the isolate into single stepping mode when Dart code next runs.
   //
   // This is used by the vm service to allow the user to step while
@@ -588,7 +543,6 @@
   // debugger's zone.
   bool HasBreakpoint(const Function& func, Zone* zone);
   bool HasBreakpoint(const Code& code);
-  // A Bytecode version of HasBreakpoint is not needed.
 
   // Returns true if the call at address pc is patched to point to
   // a debugger stub.
@@ -669,7 +623,6 @@
   void FindCompiledFunctions(const Script& script,
                              TokenPosition start_pos,
                              TokenPosition end_pos,
-                             GrowableObjectArray* bytecode_function_list,
                              GrowableObjectArray* code_function_list);
   bool FindBestFit(const Script& script,
                    TokenPosition token_pos,
@@ -677,17 +630,14 @@
                    Function* best_fit);
   FunctionPtr FindInnermostClosure(const Function& function,
                                    TokenPosition token_pos);
-  TokenPosition ResolveBreakpointPos(bool in_bytecode,
-                                     const Function& func,
+  TokenPosition ResolveBreakpointPos(const Function& func,
                                      TokenPosition requested_token_pos,
                                      TokenPosition last_token_pos,
                                      intptr_t requested_column,
                                      TokenPosition exact_token_pos);
   void DeoptimizeWorld();
   void NotifySingleStepping(bool value) const;
-  BreakpointLocation* SetCodeBreakpoints(bool in_bytecode,
-                                         BreakpointLocation* loc,
-                                         const Script& script,
+  BreakpointLocation* SetCodeBreakpoints(const Script& script,
                                          TokenPosition token_pos,
                                          TokenPosition last_token_pos,
                                          intptr_t requested_line,
@@ -714,7 +664,6 @@
       TokenPosition token_pos,
       intptr_t requested_line,
       intptr_t requested_column,
-      TokenPosition bytecode_token_pos = TokenPosition::kNoSource,
       TokenPosition code_token_pos = TokenPosition::kNoSource);
   void MakeCodeBreakpointAt(const Function& func, BreakpointLocation* bpt);
   // Returns NULL if no breakpoint exists for the given address.
@@ -724,8 +673,6 @@
   void PrintBreakpointsListToJSONArray(BreakpointLocation* sbpt,
                                        JSONArray* jsarr) const;
 
-  void HandleCodeChange(bool bytecode_loaded, const Function& func);
-
   ActivationFrame* TopDartFrame() const;
   static ActivationFrame* CollectDartFrame(
       Isolate* isolate,
@@ -736,12 +683,6 @@
       intptr_t deopt_frame_offset,
       ActivationFrame::Kind kind = ActivationFrame::kRegular);
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  static ActivationFrame* CollectDartFrame(
-      Isolate* isolate,
-      uword pc,
-      StackFrame* frame,
-      const Bytecode& bytecode,
-      ActivationFrame::Kind kind = ActivationFrame::kRegular);
   static ArrayPtr DeoptimizeToArray(Thread* thread,
                                     StackFrame* frame,
                                     const Code& code);
@@ -789,7 +730,6 @@
   void RewindToOptimizedFrame(StackFrame* frame,
                               const Code& code,
                               intptr_t post_deopt_frame_index);
-  void RewindToInterpretedFrame(StackFrame* frame, const Bytecode& bytecode);
 
   void ResetSteppingFramePointers();
   bool SteppedForSyntheticAsyncBreakpoint() const;
@@ -832,7 +772,6 @@
   // frame corresponds to this fp value, or if the top frame is
   // lower on the stack.
   uword stepping_fp_;
-  bool interpreted_stepping_;
 
   // When stepping through code, do not stop more than once in the same
   // token position range.
@@ -841,7 +780,6 @@
 
   // Used to track the current async/async* function.
   uword async_stepping_fp_;
-  bool interpreted_async_stepping_;
   ObjectPtr top_frame_awaiter_;
 
   // If we step while at a breakpoint, we would hit the same pc twice.
diff --git a/runtime/vm/debugger_kbc.cc b/runtime/vm/debugger_kbc.cc
deleted file mode 100644
index c07d8e9..0000000
--- a/runtime/vm/debugger_kbc.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2019, 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/debugger.h"
-#include "vm/instructions_kbc.h"
-#include "vm/interpreter.h"
-
-namespace dart {
-
-#ifndef PRODUCT
-void CodeBreakpoint::SetBytecodeBreakpoint() {
-  ASSERT(!is_enabled_);
-  is_enabled_ = true;
-  Interpreter::Current()->set_is_debugging(true);
-}
-
-void CodeBreakpoint::UnsetBytecodeBreakpoint() {
-  ASSERT(is_enabled_);
-  is_enabled_ = false;
-  if (!Isolate::Current()->single_step() &&
-      !Isolate::Current()->debugger()->HasEnabledBytecodeBreakpoints()) {
-    Interpreter::Current()->set_is_debugging(false);
-  }
-}
-
-bool Debugger::HasEnabledBytecodeBreakpoints() const {
-  CodeBreakpoint* cbpt = code_breakpoints_;
-  while (cbpt != nullptr) {
-    if (cbpt->IsEnabled() && cbpt->IsInterpreted()) {
-      return true;
-    }
-    cbpt = cbpt->next();
-  }
-  return false;
-}
-
-bool Debugger::HasBytecodeBreakpointAt(const KBCInstr* next_pc) const {
-  CodeBreakpoint* cbpt = code_breakpoints_;
-  while (cbpt != nullptr) {
-    if ((reinterpret_cast<uword>(next_pc)) == cbpt->pc_ && cbpt->IsEnabled()) {
-      ASSERT(cbpt->IsInterpreted());
-      return true;
-    }
-    cbpt = cbpt->next();
-  }
-  return false;
-}
-#endif  // !PRODUCT
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index e54dc1f..54cac1a 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -378,7 +378,6 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* top_frame = iterator.NextFrame();
     ASSERT(top_frame != NULL);
-    ASSERT(!top_frame->is_interpreted());
     const Code& code = Code::Handle(top_frame->LookupDartCode());
     const Function& top_function = Function::Handle(code.function());
     const Script& script = Script::Handle(top_function.script());
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 9cba5d4..5e640c3 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -24,7 +24,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, trace_deoptimization);
 DEFINE_FLAG(bool,
             print_stacktrace_at_throw,
@@ -129,26 +128,15 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle();
-  Bytecode& bytecode = Bytecode::Handle();
   Smi& offset = Smi::Handle();
   for (; frame != NULL; frame = frames.NextFrame()) {
     if (!frame->IsDartFrame()) {
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      ASSERT(bytecode.ContainsInstructionAt(frame->pc()));
-      if (bytecode.function() == Function::null()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      builder->AddFrame(bytecode, offset);
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(code.ContainsInstructionAt(frame->pc()));
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      builder->AddFrame(code, offset);
-    }
+    code = frame->LookupDartCode();
+    ASSERT(code.ContainsInstructionAt(frame->pc()));
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    builder->AddFrame(code, offset);
   }
 }
 
@@ -622,9 +610,7 @@
                                StackFrameIterator::kNoCrossThreadIteration);
       for (StackFrame* frame = frames.NextFrame(); frame != nullptr;
            frame = frames.NextFrame()) {
-        if (frame->is_interpreted()) {
-          continue;
-        } else if (frame->fp() >= frame_pointer) {
+        if (frame->fp() >= frame_pointer) {
           break;
         }
         if (frame->IsMarkedForLazyDeopt()) {
@@ -677,18 +663,6 @@
                              uword stack_pointer,
                              uword frame_pointer,
                              bool clear_deopt_at_target) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // TODO(regis): We still possibly need to unwind interpreter frames if they
-  // are callee frames of the C++ frame handling the exception.
-  if (FLAG_enable_interpreter) {
-    Interpreter* interpreter = thread->interpreter();
-    if ((interpreter != NULL) && interpreter->HasFrame(frame_pointer)) {
-      interpreter->JumpToFrame(program_counter, stack_pointer, frame_pointer,
-                               thread);
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   const uword fp_for_clearing =
       (clear_deopt_at_target ? frame_pointer + 1 : frame_pointer);
   ClearLazyDeopts(thread, fp_for_clearing);
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 279db5e..51e4a3f 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -96,9 +96,6 @@
     "Collects all dynamic function names to identify unique targets")          \
   P(compactor_tasks, int, 2,                                                   \
     "The number of tasks to use for parallel compaction.")                     \
-  P(compilation_counter_threshold, int, 10,                                    \
-    "Function's usage-counter value before interpreted function is compiled, " \
-    "-1 means never")                                                          \
   P(concurrent_mark, bool, true, "Concurrent mark for old generation.")        \
   P(concurrent_sweep, bool, true, "Concurrent sweep for old generation.")      \
   C(deoptimize_alot, false, false, bool, false,                                \
@@ -219,7 +216,6 @@
   D(trace_zones, bool, false, "Traces allocation sizes in the zone.")          \
   P(truncating_left_shift, bool, true,                                         \
     "Optimize left shift to truncate if possible")                             \
-  P(use_bytecode_compiler, bool, false, "Compile from bytecode")               \
   P(use_compactor, bool, false, "Compact the heap during old-space GC.")       \
   P(use_cha_deopt, bool, true,                                                 \
     "Use class hierarchy analysis even if it can cause deoptimization.")       \
@@ -242,7 +238,6 @@
     "Enable magical pragmas for testing purposes. Use at your own risk!")      \
   R(eliminate_type_checks, true, bool, true,                                   \
     "Eliminate type checks when allowed by static type analysis.")             \
-  P(enable_interpreter, bool, false, "Enable interpreting kernel bytecode.")   \
   D(support_rr, bool, false, "Support running within RR.")                     \
   P(verify_entry_points, bool, false,                                          \
     "Throw API error on invalid member access throuh native API. See "         \
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index f75c89a..61baa78 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -53,26 +53,6 @@
   }
 }
 
-// Like _printDartStackTrace, but works in the interpreter loop.
-// Must be called with the current interpreter fp, sp, and pc.
-// Note that sp[0] is not modified, but sp[1] will be trashed.
-DART_EXPORT
-void _printInterpreterStackTrace(ObjectPtr* fp,
-                                 ObjectPtr* sp,
-                                 const KBCInstr* pc) {
-  Thread* thread = Thread::Current();
-  sp[1] = Function::null();
-  sp[2] = Bytecode::null();
-  sp[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
-  sp[4] = static_cast<ObjectPtr>(reinterpret_cast<uword>(fp));
-  ObjectPtr* exit_fp = sp + 1 + kKBCDartFrameFixedSize;
-  thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
-  thread->set_execution_state(Thread::kThreadInVM);
-  _printDartStackTrace();
-  thread->set_execution_state(Thread::kThreadInGenerated);
-  thread->set_top_exit_frame_info(0);
-}
-
 class PrintObjectPointersVisitor : public ObjectPointerVisitor {
  public:
   PrintObjectPointersVisitor()
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 186d6fd..0e306f7 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -312,20 +312,6 @@
 
 void GCMarker::Prologue() {
   isolate_group_->ReleaseStoreBuffers();
-
-#ifndef DART_PRECOMPILED_RUNTIME
-  isolate_group_->ForEachIsolate(
-      [&](Isolate* isolate) {
-        Thread* mutator_thread = isolate->mutator_thread();
-        if (mutator_thread != NULL) {
-          Interpreter* interpreter = mutator_thread->interpreter();
-          if (interpreter != NULL) {
-            interpreter->ClearLookupCache();
-          }
-        }
-      },
-      /*at_safepoint=*/true);
-#endif
 }
 
 void GCMarker::Epilogue() {}
diff --git a/runtime/vm/heap/weak_code.cc b/runtime/vm/heap/weak_code.cc
index 795eda1a..c1a3d53 100644
--- a/runtime/vm/heap/weak_code.cc
+++ b/runtime/vm/heap/weak_code.cc
@@ -76,12 +76,10 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
     while (frame != NULL) {
-      if (!frame->is_interpreted()) {
-        code = frame->LookupDartCode();
-        if (IsOptimizedCode(code_objects, code)) {
-          ReportDeoptimization(code);
-          DeoptimizeAt(code, frame);
-        }
+      code = frame->LookupDartCode();
+      if (IsOptimizedCode(code_objects, code)) {
+        ReportDeoptimization(code);
+        DeoptimizeAt(code, frame);
       }
       frame = iterator.NextFrame();
     }
diff --git a/runtime/vm/instructions_kbc.cc b/runtime/vm/instructions_kbc.cc
deleted file mode 100644
index b427738..0000000
--- a/runtime/vm/instructions_kbc.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/instructions.h"
-#include "vm/instructions_kbc.h"
-
-#include "vm/constants_kbc.h"
-#include "vm/native_entry.h"
-
-namespace dart {
-
-TypedDataPtr KBCNativeCallPattern::GetNativeEntryDataAt(
-    uword pc,
-    const Bytecode& bytecode) {
-  ASSERT(bytecode.ContainsInstructionAt(pc));
-
-  const KBCInstr* return_addr = reinterpret_cast<const KBCInstr*>(pc);
-  const KBCInstr* instr =
-      reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
-  ASSERT(instr < return_addr);
-  while (!KernelBytecode::IsNativeCallOpcode(instr)) {
-    instr = KernelBytecode::Next(instr);
-    if (instr >= return_addr) {
-      FATAL1(
-          "Unable to find NativeCall bytecode instruction"
-          " corresponding to PC %" Px,
-          pc);
-    }
-  }
-
-  intptr_t native_entry_data_pool_index = KernelBytecode::DecodeD(instr);
-  const ObjectPool& obj_pool = ObjectPool::Handle(bytecode.object_pool());
-  TypedData& native_entry_data = TypedData::Handle();
-  native_entry_data ^= obj_pool.ObjectAt(native_entry_data_pool_index);
-  // Native calls to recognized functions should never be patched.
-  ASSERT(NativeEntryData(native_entry_data).kind() ==
-         MethodRecognizer::kUnknown);
-  return native_entry_data.raw();
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/instructions_kbc.h b/runtime/vm/instructions_kbc.h
deleted file mode 100644
index 5bfdb11..0000000
--- a/runtime/vm/instructions_kbc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-// Classes that describe assembly patterns as used by inline caches.
-
-#ifndef RUNTIME_VM_INSTRUCTIONS_KBC_H_
-#define RUNTIME_VM_INSTRUCTIONS_KBC_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/object.h"
-
-namespace dart {
-
-class KBCNativeCallPattern : public AllStatic {
- public:
-  static TypedDataPtr GetNativeEntryDataAt(uword pc, const Bytecode& bytecode);
-};
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_INSTRUCTIONS_KBC_H_
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
deleted file mode 100644
index 38a0159..0000000
--- a/runtime/vm/interpreter.cc
+++ /dev/null
@@ -1,3991 +0,0 @@
-// 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.
-
-#include <setjmp.h>  // NOLINT
-#include <stdlib.h>
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/interpreter.h"
-
-#include "vm/class_id.h"
-#include "vm/compiler/api/type_check_mode.h"
-#include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
-#include "vm/compiler/backend/flow_graph_compiler.h"
-#include "vm/compiler/ffi/abi.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
-#include "vm/compiler/jit/compiler.h"
-#include "vm/cpu.h"
-#include "vm/dart_entry.h"
-#include "vm/debugger.h"
-#include "vm/lockers.h"
-#include "vm/native_arguments.h"
-#include "vm/native_entry.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
-#include "vm/os_thread.h"
-#include "vm/stack_frame_kbc.h"
-#include "vm/symbols.h"
-
-namespace dart {
-
-DEFINE_FLAG(uint64_t,
-            trace_interpreter_after,
-            ULLONG_MAX,
-            "Trace interpreter execution after instruction count reached.");
-DEFINE_FLAG(charp,
-            interpreter_trace_file,
-            NULL,
-            "File to write a dynamic instruction trace to.");
-DEFINE_FLAG(uint64_t,
-            interpreter_trace_file_max_bytes,
-            100 * MB,
-            "Maximum size in bytes of the interpreter trace file");
-
-// InterpreterSetjmpBuffer are linked together, and the last created one
-// is referenced by the Interpreter. When an exception is thrown, the exception
-// runtime looks at where to jump and finds the corresponding
-// InterpreterSetjmpBuffer based on the stack pointer of the exception handler.
-// The runtime then does a Longjmp on that buffer to return to the interpreter.
-class InterpreterSetjmpBuffer {
- public:
-  void Longjmp() {
-    // "This" is now the last setjmp buffer.
-    interpreter_->set_last_setjmp_buffer(this);
-    longjmp(buffer_, 1);
-  }
-
-  explicit InterpreterSetjmpBuffer(Interpreter* interpreter) {
-    interpreter_ = interpreter;
-    link_ = interpreter->last_setjmp_buffer();
-    interpreter->set_last_setjmp_buffer(this);
-    fp_ = interpreter->fp_;
-  }
-
-  ~InterpreterSetjmpBuffer() {
-    ASSERT(interpreter_->last_setjmp_buffer() == this);
-    interpreter_->set_last_setjmp_buffer(link_);
-  }
-
-  InterpreterSetjmpBuffer* link() const { return link_; }
-
-  uword fp() const { return reinterpret_cast<uword>(fp_); }
-
-  jmp_buf buffer_;
-
- private:
-  ObjectPtr* fp_;
-  Interpreter* interpreter_;
-  InterpreterSetjmpBuffer* link_;
-
-  friend class Interpreter;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(InterpreterSetjmpBuffer);
-};
-
-DART_FORCE_INLINE static ObjectPtr* SavedCallerFP(ObjectPtr* FP) {
-  return reinterpret_cast<ObjectPtr*>(
-      static_cast<uword>(FP[kKBCSavedCallerFpSlotFromFp]));
-}
-
-DART_FORCE_INLINE static ObjectPtr* FrameArguments(ObjectPtr* FP,
-                                                   intptr_t argc) {
-  return FP - (kKBCDartFrameFixedSize + argc);
-}
-
-#define RAW_CAST(Type, val) (InterpreterHelpers::CastTo##Type(val))
-
-class InterpreterHelpers {
- public:
-#define DEFINE_CASTS(Type)                                                     \
-  DART_FORCE_INLINE static Type##Ptr CastTo##Type(ObjectPtr obj) {             \
-    ASSERT((k##Type##Cid == kSmiCid)                                           \
-               ? !obj->IsHeapObject()                                          \
-               : (k##Type##Cid == kIntegerCid)                                 \
-                     ? (!obj->IsHeapObject() || obj->IsMint())                 \
-                     : obj->Is##Type());                                       \
-    return static_cast<Type##Ptr>(obj);                                        \
-  }
-  CLASS_LIST(DEFINE_CASTS)
-#undef DEFINE_CASTS
-
-  DART_FORCE_INLINE static SmiPtr GetClassIdAsSmi(ObjectPtr obj) {
-    return Smi::New(obj->IsHeapObject() ? obj->GetClassId()
-                                        : static_cast<intptr_t>(kSmiCid));
-  }
-
-  DART_FORCE_INLINE static intptr_t GetClassId(ObjectPtr obj) {
-    return obj->IsHeapObject() ? obj->GetClassId()
-                               : static_cast<intptr_t>(kSmiCid);
-  }
-
-  DART_FORCE_INLINE static TypeArgumentsPtr GetTypeArguments(
-      Thread* thread,
-      InstancePtr instance) {
-    ClassPtr instance_class =
-        thread->isolate()->class_table()->At(GetClassId(instance));
-    return instance_class->ptr()->num_type_arguments_ > 0
-               ? reinterpret_cast<TypeArgumentsPtr*>(instance->ptr())
-                     [instance_class->ptr()
-                          ->host_type_arguments_field_offset_in_words_]
-               : TypeArguments::null();
-  }
-
-  // The usage counter is actually a 'hotness' counter.
-  // For an instance call, both the usage counters of the caller and of the
-  // calle will get incremented, as well as the ICdata counter at the call site.
-  DART_FORCE_INLINE static void IncrementUsageCounter(FunctionPtr f) {
-    f->ptr()->usage_counter_++;
-  }
-
-  DART_FORCE_INLINE static void IncrementICUsageCount(ObjectPtr* entries,
-                                                      intptr_t offset,
-                                                      intptr_t args_tested) {
-    const intptr_t count_offset = ICData::CountIndexFor(args_tested);
-    const intptr_t raw_smi_old =
-        static_cast<intptr_t>(entries[offset + count_offset]);
-    const intptr_t raw_smi_new = raw_smi_old + Smi::RawValue(1);
-    *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) = raw_smi_new;
-  }
-
-  DART_FORCE_INLINE static bool CheckIndex(SmiPtr index, SmiPtr length) {
-    return !index->IsHeapObject() && (static_cast<intptr_t>(index) >= 0) &&
-           (static_cast<intptr_t>(index) < static_cast<intptr_t>(length));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescTypeArgsLen(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kTypeArgsLenIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescArgCount(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kCountIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescArgSize(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kSizeIndex)));
-  }
-
-  DART_FORCE_INLINE static intptr_t ArgDescPosCount(ArrayPtr argdesc) {
-    return Smi::Value(*reinterpret_cast<SmiPtr*>(
-        reinterpret_cast<uword>(argdesc->ptr()) +
-        Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
-  }
-
-  DART_FORCE_INLINE static BytecodePtr FrameBytecode(ObjectPtr* FP) {
-    ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kBytecodeCid);
-    return static_cast<BytecodePtr>(FP[kKBCPcMarkerSlotFromFp]);
-  }
-
-  DART_FORCE_INLINE static bool FieldNeedsGuardUpdate(FieldPtr field,
-                                                      ObjectPtr value) {
-    // The interpreter should never see a cloned field.
-    ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
-
-    const classid_t guarded_cid = field->ptr()->guarded_cid_;
-
-    if (guarded_cid == kDynamicCid) {
-      // Field is not guarded.
-      return false;
-    }
-
-    ASSERT(Isolate::Current()->use_field_guards());
-
-    const classid_t nullability_cid = field->ptr()->is_nullable_;
-    const classid_t value_cid = InterpreterHelpers::GetClassId(value);
-
-    if (nullability_cid == value_cid) {
-      // Storing null into a nullable field.
-      return false;
-    }
-
-    if (guarded_cid != value_cid) {
-      // First assignment (guarded_cid == kIllegalCid) or
-      // field no longer monomorphic or
-      // field has become nullable.
-      return true;
-    }
-
-    intptr_t guarded_list_length =
-        Smi::Value(field->ptr()->guarded_list_length_);
-
-    if (UNLIKELY(guarded_list_length >= Field::kUnknownFixedLength)) {
-      // Guarding length, check this in the runtime.
-      return true;
-    }
-
-    if (UNLIKELY(field->ptr()->static_type_exactness_state_ >=
-                 StaticTypeExactnessState::Uninitialized().Encode())) {
-      // Guarding "exactness", check this in the runtime.
-      return true;
-    }
-
-    // Everything matches.
-    return false;
-  }
-
-  DART_FORCE_INLINE static bool IsAllocateFinalized(ClassPtr cls) {
-    return Class::ClassFinalizedBits::decode(cls->ptr()->state_bits_) ==
-           ClassLayout::kAllocateFinalized;
-  }
-};
-
-DART_FORCE_INLINE static const KBCInstr* SavedCallerPC(ObjectPtr* FP) {
-  return reinterpret_cast<const KBCInstr*>(
-      static_cast<uword>(FP[kKBCSavedCallerPcSlotFromFp]));
-}
-
-DART_FORCE_INLINE static FunctionPtr FrameFunction(ObjectPtr* FP) {
-  FunctionPtr function = static_cast<FunctionPtr>(FP[kKBCFunctionSlotFromFp]);
-  ASSERT(InterpreterHelpers::GetClassId(function) == kFunctionCid ||
-         InterpreterHelpers::GetClassId(function) == kNullCid);
-  return function;
-}
-
-DART_FORCE_INLINE static ObjectPtr InitializeHeader(uword addr,
-                                                    intptr_t class_id,
-                                                    intptr_t instance_size) {
-  uint32_t tags = 0;
-  tags = ObjectLayout::ClassIdTag::update(class_id, tags);
-  tags = ObjectLayout::SizeTag::update(instance_size, tags);
-  tags = ObjectLayout::OldBit::update(false, tags);
-  tags = ObjectLayout::OldAndNotMarkedBit::update(false, tags);
-  tags = ObjectLayout::OldAndNotRememberedBit::update(false, tags);
-  tags = ObjectLayout::NewBit::update(true, tags);
-  // Also writes zero in the hash_ field.
-  *reinterpret_cast<uword*>(addr + Object::tags_offset()) = tags;
-  return ObjectLayout::FromAddr(addr);
-}
-
-DART_FORCE_INLINE static bool TryAllocate(Thread* thread,
-                                          intptr_t class_id,
-                                          intptr_t instance_size,
-                                          ObjectPtr* result) {
-  ASSERT(instance_size > 0);
-  ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
-
-#ifndef PRODUCT
-  auto table = thread->isolate_group()->shared_class_table();
-  if (UNLIKELY(table->TraceAllocationFor(class_id))) {
-    return false;
-  }
-#endif
-  const uword top = thread->top();
-  const intptr_t remaining = thread->end() - top;
-  if (LIKELY(remaining >= instance_size)) {
-    thread->set_top(top + instance_size);
-    *result = InitializeHeader(top, class_id, instance_size);
-    return true;
-  }
-  return false;
-}
-
-void LookupCache::Clear() {
-  for (intptr_t i = 0; i < kNumEntries; i++) {
-    entries_[i].receiver_cid = kIllegalCid;
-  }
-}
-
-bool LookupCache::Lookup(intptr_t receiver_cid,
-                         StringPtr function_name,
-                         ArrayPtr arguments_descriptor,
-                         FunctionPtr* target) const {
-  ASSERT(receiver_cid != kIllegalCid);  // Sentinel value.
-
-  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
-                        static_cast<intptr_t>(arguments_descriptor);
-  const intptr_t probe1 = hash & kTableMask;
-  if (entries_[probe1].receiver_cid == receiver_cid &&
-      entries_[probe1].function_name == function_name &&
-      entries_[probe1].arguments_descriptor == arguments_descriptor) {
-    *target = entries_[probe1].target;
-    return true;
-  }
-
-  intptr_t probe2 = (hash >> 3) & kTableMask;
-  if (entries_[probe2].receiver_cid == receiver_cid &&
-      entries_[probe2].function_name == function_name &&
-      entries_[probe2].arguments_descriptor == arguments_descriptor) {
-    *target = entries_[probe2].target;
-    return true;
-  }
-
-  return false;
-}
-
-void LookupCache::Insert(intptr_t receiver_cid,
-                         StringPtr function_name,
-                         ArrayPtr arguments_descriptor,
-                         FunctionPtr target) {
-  // Otherwise we have to clear the cache or rehash on scavenges too.
-  ASSERT(function_name->IsOldObject());
-  ASSERT(arguments_descriptor->IsOldObject());
-  ASSERT(target->IsOldObject());
-
-  const intptr_t hash = receiver_cid ^ static_cast<intptr_t>(function_name) ^
-                        static_cast<intptr_t>(arguments_descriptor);
-  const intptr_t probe1 = hash & kTableMask;
-  if (entries_[probe1].receiver_cid == kIllegalCid) {
-    entries_[probe1].receiver_cid = receiver_cid;
-    entries_[probe1].function_name = function_name;
-    entries_[probe1].arguments_descriptor = arguments_descriptor;
-    entries_[probe1].target = target;
-    return;
-  }
-
-  const intptr_t probe2 = (hash >> 3) & kTableMask;
-  if (entries_[probe2].receiver_cid == kIllegalCid) {
-    entries_[probe2].receiver_cid = receiver_cid;
-    entries_[probe2].function_name = function_name;
-    entries_[probe2].arguments_descriptor = arguments_descriptor;
-    entries_[probe2].target = target;
-    return;
-  }
-
-  entries_[probe1].receiver_cid = receiver_cid;
-  entries_[probe1].function_name = function_name;
-  entries_[probe1].arguments_descriptor = arguments_descriptor;
-  entries_[probe1].target = target;
-}
-
-Interpreter::Interpreter()
-    : stack_(NULL),
-      fp_(NULL),
-      pp_(nullptr),
-      argdesc_(nullptr),
-      lookup_cache_() {
-  // Setup interpreter support first. Some of this information is needed to
-  // setup the architecture state.
-  // We allocate the stack here, the size is computed as the sum of
-  // the size specified by the user and the buffer space needed for
-  // handling stack overflow exceptions. To be safe in potential
-  // stack underflows we also add some underflow buffer space.
-  stack_ = new uintptr_t[(OSThread::GetSpecifiedStackSize() +
-                          OSThread::kStackSizeBufferMax +
-                          kInterpreterStackUnderflowSize) /
-                         sizeof(uintptr_t)];
-  // Low address.
-  stack_base_ =
-      reinterpret_cast<uword>(stack_) + kInterpreterStackUnderflowSize;
-  // Limit for StackOverflowError.
-  overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
-  // High address.
-  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBufferMax;
-
-  last_setjmp_buffer_ = NULL;
-
-  DEBUG_ONLY(icount_ = 1);  // So that tracing after 0 traces first bytecode.
-
-#if defined(DEBUG)
-  trace_file_bytes_written_ = 0;
-  trace_file_ = NULL;
-  if (FLAG_interpreter_trace_file != NULL) {
-    Dart_FileOpenCallback file_open = Dart::file_open_callback();
-    if (file_open != NULL) {
-      trace_file_ = file_open(FLAG_interpreter_trace_file, /* write */ true);
-      trace_buffer_ = new KBCInstr[kTraceBufferInstrs];
-      trace_buffer_idx_ = 0;
-    }
-  }
-#endif
-  // Make sure interpreter's unboxing view is consistent with compiler.
-  supports_unboxed_doubles_ = FlowGraphCompiler::SupportsUnboxedDoubles();
-  supports_unboxed_simd128_ = FlowGraphCompiler::SupportsUnboxedSimd128();
-}
-
-Interpreter::~Interpreter() {
-  delete[] stack_;
-  pp_ = NULL;
-  argdesc_ = NULL;
-#if defined(DEBUG)
-  if (trace_file_ != NULL) {
-    FlushTraceBuffer();
-    // Close the file.
-    Dart_FileCloseCallback file_close = Dart::file_close_callback();
-    if (file_close != NULL) {
-      file_close(trace_file_);
-      trace_file_ = NULL;
-      delete[] trace_buffer_;
-      trace_buffer_ = NULL;
-    }
-  }
-#endif
-}
-
-// Get the active Interpreter for the current isolate.
-Interpreter* Interpreter::Current() {
-  Thread* thread = Thread::Current();
-  Interpreter* interpreter = thread->interpreter();
-  if (interpreter == nullptr) {
-    NoSafepointScope no_safepoint;
-    interpreter = new Interpreter();
-    thread->set_interpreter(interpreter);
-  }
-  return interpreter;
-}
-
-#if defined(DEBUG)
-// Returns true if tracing of executed instructions is enabled.
-// May be called on entry, when icount_ has not been incremented yet.
-DART_FORCE_INLINE bool Interpreter::IsTracingExecution() const {
-  return icount_ > FLAG_trace_interpreter_after;
-}
-
-// Prints bytecode instruction at given pc for instruction tracing.
-DART_NOINLINE void Interpreter::TraceInstruction(const KBCInstr* pc) const {
-  THR_Print("%" Pu64 " ", icount_);
-  if (FLAG_support_disassembler) {
-    KernelBytecodeDisassembler::Disassemble(
-        reinterpret_cast<uword>(pc),
-        reinterpret_cast<uword>(KernelBytecode::Next(pc)));
-  } else {
-    THR_Print("Disassembler not supported in this mode.\n");
-  }
-}
-
-DART_FORCE_INLINE bool Interpreter::IsWritingTraceFile() const {
-  return (trace_file_ != NULL) &&
-         (trace_file_bytes_written_ < FLAG_interpreter_trace_file_max_bytes);
-}
-
-void Interpreter::FlushTraceBuffer() {
-  Dart_FileWriteCallback file_write = Dart::file_write_callback();
-  if (file_write == NULL) {
-    return;
-  }
-  if (trace_file_bytes_written_ >= FLAG_interpreter_trace_file_max_bytes) {
-    return;
-  }
-  const intptr_t bytes_to_write = Utils::Minimum(
-      static_cast<uint64_t>(trace_buffer_idx_ * sizeof(KBCInstr)),
-      FLAG_interpreter_trace_file_max_bytes - trace_file_bytes_written_);
-  if (bytes_to_write == 0) {
-    return;
-  }
-  file_write(trace_buffer_, bytes_to_write, trace_file_);
-  trace_file_bytes_written_ += bytes_to_write;
-  trace_buffer_idx_ = 0;
-}
-
-DART_NOINLINE void Interpreter::WriteInstructionToTrace(const KBCInstr* pc) {
-  Dart_FileWriteCallback file_write = Dart::file_write_callback();
-  if (file_write == NULL) {
-    return;
-  }
-  const KBCInstr* next = KernelBytecode::Next(pc);
-  while ((trace_buffer_idx_ < kTraceBufferInstrs) && (pc != next)) {
-    trace_buffer_[trace_buffer_idx_++] = *pc;
-    ++pc;
-  }
-  if (trace_buffer_idx_ == kTraceBufferInstrs) {
-    FlushTraceBuffer();
-  }
-}
-
-#endif  // defined(DEBUG)
-
-// Calls into the Dart runtime are based on this interface.
-typedef void (*InterpreterRuntimeCall)(NativeArguments arguments);
-
-// Calls to leaf Dart runtime functions are based on this interface.
-typedef intptr_t (*InterpreterLeafRuntimeCall)(intptr_t r0,
-                                               intptr_t r1,
-                                               intptr_t r2,
-                                               intptr_t r3);
-
-// Calls to leaf float Dart runtime functions are based on this interface.
-typedef double (*InterpreterLeafFloatRuntimeCall)(double d0, double d1);
-
-void Interpreter::Exit(Thread* thread,
-                       ObjectPtr* base,
-                       ObjectPtr* frame,
-                       const KBCInstr* pc) {
-  frame[0] = Function::null();
-  frame[1] = Bytecode::null();
-  frame[2] = static_cast<ObjectPtr>(reinterpret_cast<uword>(pc));
-  frame[3] = static_cast<ObjectPtr>(reinterpret_cast<uword>(base));
-
-  ObjectPtr* exit_fp = frame + kKBCDartFrameFixedSize;
-  thread->set_top_exit_frame_info(reinterpret_cast<uword>(exit_fp));
-  fp_ = exit_fp;
-
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("Exiting interpreter 0x%" Px " at fp_ 0x%" Px "\n",
-              reinterpret_cast<uword>(this), reinterpret_cast<uword>(exit_fp));
-  }
-#endif
-}
-
-void Interpreter::Unexit(Thread* thread) {
-#if !defined(PRODUCT)
-  // For the profiler.
-  ObjectPtr* exit_fp =
-      reinterpret_cast<ObjectPtr*>(thread->top_exit_frame_info());
-  ASSERT(exit_fp != 0);
-  pc_ = SavedCallerPC(exit_fp);
-  fp_ = SavedCallerFP(exit_fp);
-#endif
-  thread->set_top_exit_frame_info(0);
-}
-
-// Calling into runtime may trigger garbage collection and relocate objects,
-// so all ObjectPtr pointers become outdated and should not be used across
-// runtime calls.
-// Note: functions below are marked DART_NOINLINE to recover performance where
-// inlining these functions into the interpreter loop seemed to cause some code
-// quality issues. Functions with the "returns_twice" attribute, such as setjmp,
-// prevent reusing spill slots and large frame sizes.
-static DART_NOINLINE bool InvokeRuntime(Thread* thread,
-                                        Interpreter* interpreter,
-                                        RuntimeFunction drt,
-                                        const NativeArguments& args) {
-  InterpreterSetjmpBuffer buffer(interpreter);
-  if (!setjmp(buffer.buffer_)) {
-    thread->set_vm_tag(reinterpret_cast<uword>(drt));
-    drt(args);
-    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-    interpreter->Unexit(thread);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-static DART_NOINLINE bool InvokeNative(Thread* thread,
-                                       Interpreter* interpreter,
-                                       NativeFunctionWrapper wrapper,
-                                       Dart_NativeFunction function,
-                                       Dart_NativeArguments args) {
-  InterpreterSetjmpBuffer buffer(interpreter);
-  if (!setjmp(buffer.buffer_)) {
-    thread->set_vm_tag(reinterpret_cast<uword>(function));
-    wrapper(args, function);
-    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-    interpreter->Unexit(thread);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-extern "C" {
-// Note: The invocation stub follows the C ABI, so we cannot pass C++ struct
-// values like ObjectPtr. In some calling conventions (IA32), ObjectPtr is
-// passed/returned different from a pointer.
-typedef uword /*ObjectPtr*/ (*invokestub)(uword /*CodePtr*/ code,
-                                          uword /*ArrayPtr*/ argdesc,
-                                          ObjectPtr* arg0,
-                                          Thread* thread);
-}
-
-DART_NOINLINE bool Interpreter::InvokeCompiled(Thread* thread,
-                                               FunctionPtr function,
-                                               ObjectPtr* call_base,
-                                               ObjectPtr* call_top,
-                                               const KBCInstr** pc,
-                                               ObjectPtr** FP,
-                                               ObjectPtr** SP) {
-  ASSERT(Function::HasCode(function));
-  CodePtr code = function->ptr()->code_;
-  ASSERT(code != StubCode::LazyCompile().raw());
-  // TODO(regis): Once we share the same stack, try to invoke directly.
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking compiled %s\n", Function::Handle(function).ToCString());
-  }
-#endif
-  // On success, returns a RawInstance.  On failure, a RawError.
-  invokestub volatile entrypoint = reinterpret_cast<invokestub>(
-      StubCode::InvokeDartCodeFromBytecode().EntryPoint());
-  ObjectPtr result;
-  Exit(thread, *FP, call_top + 1, *pc);
-  {
-    InterpreterSetjmpBuffer buffer(this);
-    if (!setjmp(buffer.buffer_)) {
-#if defined(USING_SIMULATOR)
-      // We need to beware that bouncing between the interpreter and the
-      // simulator may exhaust the C stack before exhausting either the
-      // interpreter or simulator stacks.
-      if (!thread->os_thread()->HasStackHeadroom()) {
-        thread->SetStackLimit(-1);
-      }
-      result = bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
-          reinterpret_cast<intptr_t>(entrypoint), static_cast<intptr_t>(code),
-          static_cast<intptr_t>(argdesc_),
-          reinterpret_cast<intptr_t>(call_base),
-          reinterpret_cast<intptr_t>(thread)));
-#else
-      result = static_cast<ObjectPtr>(entrypoint(static_cast<uword>(code),
-                                                 static_cast<uword>(argdesc_),
-                                                 call_base, thread));
-#endif
-      ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
-      ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-      Unexit(thread);
-    } else {
-      return false;
-    }
-  }
-  // Pop args and push result.
-  *SP = call_base;
-  **SP = result;
-  pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
-
-  // If the result is an error (not a Dart instance), it must either be rethrown
-  // (in the case of an unhandled exception) or it must be returned to the
-  // caller of the interpreter to be propagated.
-  if (result->IsHeapObject()) {
-    const intptr_t result_cid = result->GetClassId();
-    if (result_cid == kUnhandledExceptionCid) {
-      (*SP)[0] = UnhandledException::RawCast(result)->ptr()->exception_;
-      (*SP)[1] = UnhandledException::RawCast(result)->ptr()->stacktrace_;
-      (*SP)[2] = 0;  // Space for result.
-      Exit(thread, *FP, *SP + 3, *pc);
-      NativeArguments args(thread, 2, *SP, *SP + 2);
-      if (!InvokeRuntime(thread, this, DRT_ReThrow, args)) {
-        return false;
-      }
-      UNREACHABLE();
-    }
-    if (IsErrorClassId(result_cid)) {
-      // Unwind to entry frame.
-      fp_ = *FP;
-      pc_ = SavedCallerPC(fp_);
-      while (!IsEntryFrameMarker(pc_)) {
-        fp_ = SavedCallerFP(fp_);
-        pc_ = SavedCallerPC(fp_);
-      }
-      // Pop entry frame.
-      fp_ = SavedCallerFP(fp_);
-      special_[KernelBytecode::kExceptionSpecialIndex] = result;
-      return false;
-    }
-  }
-  return true;
-}
-
-DART_FORCE_INLINE bool Interpreter::InvokeBytecode(Thread* thread,
-                                                   FunctionPtr function,
-                                                   ObjectPtr* call_base,
-                                                   ObjectPtr* call_top,
-                                                   const KBCInstr** pc,
-                                                   ObjectPtr** FP,
-                                                   ObjectPtr** SP) {
-  ASSERT(Function::HasBytecode(function));
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("invoking %s\n",
-              Function::Handle(function).ToFullyQualifiedCString());
-  }
-#endif
-  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
-  ASSERT(function == FrameFunction(callee_fp));
-  BytecodePtr bytecode = function->ptr()->bytecode_;
-  callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
-  callee_fp[kKBCSavedCallerPcSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(*pc));
-  callee_fp[kKBCSavedCallerFpSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(*FP));
-  pp_ = bytecode->ptr()->object_pool_;
-  *pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-  NOT_IN_PRODUCT(pc_ = *pc);  // For the profiler.
-  *FP = callee_fp;
-  NOT_IN_PRODUCT(fp_ = callee_fp);  // For the profiler.
-  *SP = *FP - 1;
-  return true;
-}
-
-DART_FORCE_INLINE bool Interpreter::Invoke(Thread* thread,
-                                           ObjectPtr* call_base,
-                                           ObjectPtr* call_top,
-                                           const KBCInstr** pc,
-                                           ObjectPtr** FP,
-                                           ObjectPtr** SP) {
-  ObjectPtr* callee_fp = call_top + kKBCDartFrameFixedSize;
-  FunctionPtr function = FrameFunction(callee_fp);
-
-  for (;;) {
-    if (Function::HasCode(function)) {
-      return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
-    }
-    if (Function::HasBytecode(function)) {
-      return InvokeBytecode(thread, function, call_base, call_top, pc, FP, SP);
-    }
-
-    // Compile the function to either generate code or load bytecode.
-    call_top[1] = 0;  // Code result.
-    call_top[2] = function;
-    Exit(thread, *FP, call_top + 3, *pc);
-    NativeArguments native_args(thread, 1, call_top + 2, call_top + 1);
-    if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
-      return false;
-    }
-    // Reload objects after the call which may trigger GC.
-    function = Function::RawCast(call_top[2]);
-
-    ASSERT(Function::HasCode(function) || Function::HasBytecode(function));
-  }
-}
-
-DART_FORCE_INLINE bool Interpreter::InstanceCall(Thread* thread,
-                                                 StringPtr target_name,
-                                                 ObjectPtr* call_base,
-                                                 ObjectPtr* top,
-                                                 const KBCInstr** pc,
-                                                 ObjectPtr** FP,
-                                                 ObjectPtr** SP) {
-  ObjectPtr null_value = Object::null();
-  const intptr_t type_args_len =
-      InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-  const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-
-  intptr_t receiver_cid =
-      InterpreterHelpers::GetClassId(call_base[receiver_idx]);
-
-  FunctionPtr target;
-  if (UNLIKELY(!lookup_cache_.Lookup(receiver_cid, target_name, argdesc_,
-                                     &target))) {
-    // Table lookup miss.
-    top[0] = null_value;  // Clean up slot as it may be visited by GC.
-    top[1] = call_base[receiver_idx];
-    top[2] = target_name;
-    top[3] = argdesc_;
-    top[4] = null_value;  // Result slot.
-
-    Exit(thread, *FP, top + 5, *pc);
-    NativeArguments native_args(thread, 3, /* argv */ top + 1,
-                                /* result */ top + 4);
-    if (!InvokeRuntime(thread, this, DRT_InterpretedInstanceCallMissHandler,
-                       native_args)) {
-      return false;
-    }
-
-    target = static_cast<FunctionPtr>(top[4]);
-    target_name = static_cast<StringPtr>(top[2]);
-    argdesc_ = static_cast<ArrayPtr>(top[3]);
-  }
-
-  if (target != Function::null()) {
-    lookup_cache_.Insert(receiver_cid, target_name, argdesc_, target);
-    top[0] = target;
-    return Invoke(thread, call_base, top, pc, FP, SP);
-  }
-
-  // The miss handler should only fail to return a function if lazy dispatchers
-  // are disabled, in which case we need to call DRT_InvokeNoSuchMethod, which
-  // walks the receiver appropriately in this case.
-  ASSERT(!FLAG_lazy_dispatchers);
-
-  // The receiver, name, and argument descriptor are already in the appropriate
-  // places on the stack from the previous call.
-  ASSERT(top[4] == null_value);
-
-  // Allocate array of arguments.
-  {
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ASSERT_EQUAL(top - call_base, argc);
-
-    top[5] = Smi::New(argc);  // length
-    top[6] = null_value;      // type
-    Exit(thread, *FP, top + 7, *pc);
-    NativeArguments native_args(thread, 2, /* argv */ top + 5,
-                                /* result */ top + 4);
-    if (!InvokeRuntime(thread, this, DRT_AllocateArray, native_args)) {
-      return false;
-    }
-
-    // Copy arguments into the newly allocated array.
-    ArrayPtr array = Array::RawCast(top[4]);
-    for (intptr_t i = 0; i < argc; i++) {
-      array->ptr()->data()[i] = call_base[i];
-    }
-  }
-
-  {
-    Exit(thread, *FP, top + 5, *pc);
-    NativeArguments native_args(thread, 4, /* argv */ top + 1,
-                                /* result */ top);
-    if (!InvokeRuntime(thread, this, DRT_InvokeNoSuchMethod, native_args)) {
-      return false;
-    }
-
-    // Pop the call args and push the result.
-    ObjectPtr result = top[0];
-    *SP = call_base;
-    **SP = result;
-    pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
-  }
-
-  return true;
-}
-
-// Note:
-// All macro helpers are intended to be used only inside Interpreter::Call.
-
-// Counts and prints executed bytecode instructions (in DEBUG mode).
-#if defined(DEBUG)
-#define TRACE_INSTRUCTION                                                      \
-  if (IsTracingExecution()) {                                                  \
-    TraceInstruction(pc);                                                      \
-  }                                                                            \
-  if (IsWritingTraceFile()) {                                                  \
-    WriteInstructionToTrace(pc);                                               \
-  }                                                                            \
-  icount_++;
-#else
-#define TRACE_INSTRUCTION
-#endif  // defined(DEBUG)
-
-// Decode opcode and A part of the given value and dispatch to the
-// corresponding bytecode handler.
-#ifdef DART_HAS_COMPUTED_GOTO
-#define DISPATCH_OP(val)                                                       \
-  do {                                                                         \
-    op = (val);                                                                \
-    TRACE_INSTRUCTION                                                          \
-    goto* dispatch[op];                                                        \
-  } while (0)
-#else
-#define DISPATCH_OP(val)                                                       \
-  do {                                                                         \
-    op = (val);                                                                \
-    TRACE_INSTRUCTION                                                          \
-    goto SwitchDispatch;                                                       \
-  } while (0)
-#endif
-
-// Fetch next operation from PC and dispatch.
-#define DISPATCH() DISPATCH_OP(*pc)
-
-// Load target of a jump instruction into PC.
-#define LOAD_JUMP_TARGET() pc = rT
-
-#define BYTECODE_ENTRY_LABEL(Name) bc##Name:
-#define BYTECODE_WIDE_ENTRY_LABEL(Name) bc##Name##_Wide:
-#define BYTECODE_IMPL_LABEL(Name) bc##Name##Impl:
-#define GOTO_BYTECODE_IMPL(Name) goto bc##Name##Impl;
-
-// Define entry point that handles bytecode Name with the given operand format.
-#define BYTECODE(Name, Operands) BYTECODE_HEADER_##Operands(Name)
-
-// Helpers to decode common instruction formats. Used in conjunction with
-// BYTECODE() macro.
-
-#define BYTECODE_HEADER_0(Name)                                                \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  pc += 1;
-
-#define BYTECODE_HEADER_A(Name)                                                \
-  uint32_t rA;                                                                 \
-  USE(rA);                                                                     \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  pc += 2;
-
-#define BYTECODE_HEADER_D(Name)                                                \
-  uint32_t rD;                                                                 \
-  USE(rD);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rD = static_cast<uint32_t>(pc[1]) | (static_cast<uint32_t>(pc[2]) << 8) |    \
-       (static_cast<uint32_t>(pc[3]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[4]) << 24);                                   \
-  pc += 5;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rD = pc[1];                                                                  \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_X(Name)                                                \
-  int32_t rX;                                                                  \
-  USE(rX);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rX = static_cast<int32_t>(static_cast<uint32_t>(pc[1]) |                     \
-                            (static_cast<uint32_t>(pc[2]) << 8) |              \
-                            (static_cast<uint32_t>(pc[3]) << 16) |             \
-                            (static_cast<uint32_t>(pc[4]) << 24));             \
-  pc += 5;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rX = static_cast<int8_t>(pc[1]);                                             \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_T(Name)                                                \
-  const KBCInstr* rT;                                                          \
-  USE(rT);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rT = pc + (static_cast<int32_t>((static_cast<uint32_t>(pc[1]) << 8) |        \
-                                  (static_cast<uint32_t>(pc[2]) << 16) |       \
-                                  (static_cast<uint32_t>(pc[3]) << 24)) >>     \
-             8);                                                               \
-  pc += 4;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rT = pc + static_cast<int8_t>(pc[1]);                                        \
-  pc += 2;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_E(Name)                                              \
-  uint32_t rA, rE;                                                             \
-  USE(rA);                                                                     \
-  USE(rE);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rA = pc[1];                                                                  \
-  rE = static_cast<uint32_t>(pc[2]) | (static_cast<uint32_t>(pc[3]) << 8) |    \
-       (static_cast<uint32_t>(pc[4]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[5]) << 24);                                   \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rE = pc[2];                                                                  \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_Y(Name)                                              \
-  uint32_t rA;                                                                 \
-  int32_t rY;                                                                  \
-  USE(rA);                                                                     \
-  USE(rY);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rA = pc[1];                                                                  \
-  rY = static_cast<int32_t>(static_cast<uint32_t>(pc[2]) |                     \
-                            (static_cast<uint32_t>(pc[3]) << 8) |              \
-                            (static_cast<uint32_t>(pc[4]) << 16) |             \
-                            (static_cast<uint32_t>(pc[5]) << 24));             \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rY = static_cast<int8_t>(pc[2]);                                             \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_D_F(Name)                                              \
-  uint32_t rD, rF;                                                             \
-  USE(rD);                                                                     \
-  USE(rF);                                                                     \
-  BYTECODE_WIDE_ENTRY_LABEL(Name)                                              \
-  rD = static_cast<uint32_t>(pc[1]) | (static_cast<uint32_t>(pc[2]) << 8) |    \
-       (static_cast<uint32_t>(pc[3]) << 16) |                                  \
-       (static_cast<uint32_t>(pc[4]) << 24);                                   \
-  rF = pc[5];                                                                  \
-  pc += 6;                                                                     \
-  GOTO_BYTECODE_IMPL(Name);                                                    \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rD = pc[1];                                                                  \
-  rF = pc[2];                                                                  \
-  pc += 3;                                                                     \
-  BYTECODE_IMPL_LABEL(Name)
-
-#define BYTECODE_HEADER_A_B_C(Name)                                            \
-  uint32_t rA, rB, rC;                                                         \
-  USE(rA);                                                                     \
-  USE(rB);                                                                     \
-  USE(rC);                                                                     \
-  BYTECODE_ENTRY_LABEL(Name)                                                   \
-  rA = pc[1];                                                                  \
-  rB = pc[2];                                                                  \
-  rC = pc[3];                                                                  \
-  pc += 4;
-
-#define HANDLE_EXCEPTION                                                       \
-  do {                                                                         \
-    goto HandleException;                                                      \
-  } while (0)
-
-#define HANDLE_RETURN                                                          \
-  do {                                                                         \
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;          \
-  } while (0)
-
-// Runtime call helpers: handle invocation and potential exception after return.
-#define INVOKE_RUNTIME(Func, Args)                                             \
-  if (!InvokeRuntime(thread, this, Func, Args)) {                              \
-    HANDLE_EXCEPTION;                                                          \
-  } else {                                                                     \
-    HANDLE_RETURN;                                                             \
-  }
-
-#define INVOKE_NATIVE(Wrapper, Func, Args)                                     \
-  if (!InvokeNative(thread, this, Wrapper, Func, Args)) {                      \
-    HANDLE_EXCEPTION;                                                          \
-  } else {                                                                     \
-    HANDLE_RETURN;                                                             \
-  }
-
-#define LOAD_CONSTANT(index) (pp_->ptr()->data()[(index)].raw_obj_)
-
-#define UNBOX_INT64(value, obj, selector)                                      \
-  int64_t value;                                                               \
-  {                                                                            \
-    word raw_value = static_cast<word>(obj);                                   \
-    if (LIKELY((raw_value & kSmiTagMask) == kSmiTag)) {                        \
-      value = raw_value >> kSmiTagShift;                                       \
-    } else {                                                                   \
-      if (UNLIKELY(obj == null_value)) {                                       \
-        SP[0] = selector.raw();                                                \
-        goto ThrowNullError;                                                   \
-      }                                                                        \
-      value = Integer::GetInt64Value(RAW_CAST(Integer, obj));                  \
-    }                                                                          \
-  }
-
-#define BOX_INT64_RESULT(result)                                               \
-  if (LIKELY(Smi::IsValid(result))) {                                          \
-    SP[0] = Smi::New(static_cast<intptr_t>(result));                           \
-  } else if (!AllocateMint(thread, result, pc, FP, SP)) {                      \
-    HANDLE_EXCEPTION;                                                          \
-  }                                                                            \
-  ASSERT(Integer::GetInt64Value(RAW_CAST(Integer, SP[0])) == result);
-
-#define UNBOX_DOUBLE(value, obj, selector)                                     \
-  double value;                                                                \
-  {                                                                            \
-    if (UNLIKELY(obj == null_value)) {                                         \
-      SP[0] = selector.raw();                                                  \
-      goto ThrowNullError;                                                     \
-    }                                                                          \
-    value = Double::RawCast(obj)->ptr()->value_;                               \
-  }
-
-#define BOX_DOUBLE_RESULT(result)                                              \
-  if (!AllocateDouble(thread, result, pc, FP, SP)) {                           \
-    HANDLE_EXCEPTION;                                                          \
-  }                                                                            \
-  ASSERT(Utils::DoublesBitEqual(Double::RawCast(SP[0])->ptr()->value_, result));
-
-#define BUMP_USAGE_COUNTER_ON_ENTRY(function)                                  \
-  {                                                                            \
-    int32_t counter = ++(function->ptr()->usage_counter_);                     \
-    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&                    \
-                 counter >= FLAG_compilation_counter_threshold &&              \
-                 !Function::HasCode(function))) {                              \
-      SP[1] = 0; /* Unused result. */                                          \
-      SP[2] = function;                                                        \
-      Exit(thread, FP, SP + 3, pc);                                            \
-      INVOKE_RUNTIME(DRT_CompileInterpretedFunction,                           \
-                     NativeArguments(thread, 1, SP + 2, SP + 1));              \
-      function = FrameFunction(FP);                                            \
-    }                                                                          \
-  }
-
-#ifdef PRODUCT
-#define DEBUG_CHECK
-#else
-// The DEBUG_CHECK macro must only be called from bytecodes listed in
-// KernelBytecode::IsDebugCheckedOpcode.
-#define DEBUG_CHECK                                                            \
-  if (is_debugging()) {                                                        \
-    /* Check for debug breakpoint or if single stepping. */                    \
-    if (thread->isolate()->debugger()->HasBytecodeBreakpointAt(pc)) {          \
-      SP[1] = null_value;                                                      \
-      Exit(thread, FP, SP + 2, pc);                                            \
-      INVOKE_RUNTIME(DRT_BreakpointRuntimeHandler,                             \
-                     NativeArguments(thread, 0, nullptr, SP + 1))              \
-    }                                                                          \
-    /* The debugger expects to see the same pc again when single-stepping */   \
-    if (thread->isolate()->single_step()) {                                    \
-      Exit(thread, FP, SP + 1, pc);                                            \
-      INVOKE_RUNTIME(DRT_SingleStepHandler,                                    \
-                     NativeArguments(thread, 0, nullptr, nullptr));            \
-    }                                                                          \
-  }
-#endif  // PRODUCT
-
-bool Interpreter::CopyParameters(Thread* thread,
-                                 const KBCInstr** pc,
-                                 ObjectPtr** FP,
-                                 ObjectPtr** SP,
-                                 const intptr_t num_fixed_params,
-                                 const intptr_t num_opt_pos_params,
-                                 const intptr_t num_opt_named_params) {
-  const intptr_t min_num_pos_args = num_fixed_params;
-  const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
-  // Decode arguments descriptor.
-  const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-  const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
-  const intptr_t named_count = (arg_count - pos_count);
-
-  // Check that got the right number of positional parameters.
-  if ((min_num_pos_args > pos_count) || (pos_count > max_num_pos_args)) {
-    return false;
-  }
-
-  // Copy all passed position arguments.
-  ObjectPtr* first_arg = FrameArguments(*FP, arg_count);
-  memmove(*FP, first_arg, pos_count * kWordSize);
-
-  if (num_opt_named_params != 0) {
-    // This is a function with named parameters.
-    // Walk the list of named parameters and their
-    // default values encoded as pairs of LoadConstant instructions that
-    // follows the entry point and find matching values via arguments
-    // descriptor.
-    ObjectPtr* argdesc_data = argdesc_->ptr()->data();
-
-    intptr_t i = 0;  // argument position
-    intptr_t j = 0;  // parameter position
-    while ((j < num_opt_named_params) && (i < named_count)) {
-      // Fetch formal parameter information: name, default value, target slot.
-      const KBCInstr* load_name = *pc;
-      const KBCInstr* load_value = KernelBytecode::Next(load_name);
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      const uint8_t reg = KernelBytecode::DecodeA(load_name);
-      ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
-      StringPtr name = static_cast<StringPtr>(
-          LOAD_CONSTANT(KernelBytecode::DecodeE(load_name)));
-      if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
-        // Parameter was passed. Fetch passed value.
-        const intptr_t arg_index = Smi::Value(static_cast<SmiPtr>(
-            argdesc_data[ArgumentsDescriptor::position_index(i)]));
-        (*FP)[reg] = first_arg[arg_index];
-        ++i;  // Consume passed argument.
-      } else {
-        // Parameter was not passed. Fetch default value.
-        (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-      }
-      ++j;  // Next formal parameter.
-    }
-
-    // If we have unprocessed formal parameters then initialize them all
-    // using default values.
-    while (j < num_opt_named_params) {
-      const KBCInstr* load_name = *pc;
-      const KBCInstr* load_value = KernelBytecode::Next(load_name);
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      const uint8_t reg = KernelBytecode::DecodeA(load_name);
-      ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
-      (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-      ++j;
-    }
-
-    // If we have unprocessed passed arguments that means we have mismatch
-    // between formal parameters and concrete arguments. This can only
-    // occur if the current function is a closure.
-    if (i < named_count) {
-      return false;
-    }
-
-    // SP points past copied arguments.
-    *SP = *FP + num_fixed_params + num_opt_named_params - 1;
-  } else {
-    ASSERT(num_opt_pos_params != 0);
-    if (named_count != 0) {
-      // Function can't have both named and optional positional parameters.
-      // This kind of mismatch can only occur if the current function
-      // is a closure.
-      return false;
-    }
-
-    // Process the list of default values encoded as a sequence of
-    // LoadConstant instructions after EntryOpt bytecode.
-    // Execute only those that correspond to parameters that were not passed.
-    for (intptr_t i = num_fixed_params; i < pos_count; ++i) {
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(*pc));
-      *pc = KernelBytecode::Next(*pc);
-    }
-    for (intptr_t i = pos_count; i < max_num_pos_args; ++i) {
-      const KBCInstr* load_value = *pc;
-      *pc = KernelBytecode::Next(load_value);
-      ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
-      ASSERT(KernelBytecode::DecodeA(load_value) == i);
-      (*FP)[i] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
-    }
-
-    // SP points past the last copied parameter.
-    *SP = *FP + max_num_pos_args - 1;
-  }
-
-  return true;
-}
-
-bool Interpreter::AssertAssignable(Thread* thread,
-                                   const KBCInstr* pc,
-                                   ObjectPtr* FP,
-                                   ObjectPtr* call_top,
-                                   ObjectPtr* args,
-                                   SubtypeTestCachePtr cache) {
-  ObjectPtr null_value = Object::null();
-  if (cache != null_value) {
-    InstancePtr instance = static_cast<InstancePtr>(args[0]);
-    TypeArgumentsPtr instantiator_type_arguments =
-        static_cast<TypeArgumentsPtr>(args[2]);
-    TypeArgumentsPtr function_type_arguments =
-        static_cast<TypeArgumentsPtr>(args[3]);
-
-    const intptr_t cid = InterpreterHelpers::GetClassId(instance);
-
-    TypeArgumentsPtr instance_type_arguments =
-        static_cast<TypeArgumentsPtr>(null_value);
-    ObjectPtr instance_cid_or_function;
-
-    TypeArgumentsPtr parent_function_type_arguments;
-    TypeArgumentsPtr delayed_function_type_arguments;
-    if (cid == kClosureCid) {
-      ClosurePtr closure = static_cast<ClosurePtr>(instance);
-      instance_type_arguments = closure->ptr()->instantiator_type_arguments_;
-      parent_function_type_arguments = closure->ptr()->function_type_arguments_;
-      delayed_function_type_arguments = closure->ptr()->delayed_type_arguments_;
-      instance_cid_or_function = closure->ptr()->function_;
-    } else {
-      instance_cid_or_function = Smi::New(cid);
-
-      ClassPtr instance_class = thread->isolate()->class_table()->At(cid);
-      if (instance_class->ptr()->num_type_arguments_ < 0) {
-        goto AssertAssignableCallRuntime;
-      } else if (instance_class->ptr()->num_type_arguments_ > 0) {
-        instance_type_arguments = reinterpret_cast<TypeArgumentsPtr*>(
-            instance->ptr())[instance_class->ptr()
-                                 ->host_type_arguments_field_offset_in_words_];
-      }
-      parent_function_type_arguments =
-          static_cast<TypeArgumentsPtr>(null_value);
-      delayed_function_type_arguments =
-          static_cast<TypeArgumentsPtr>(null_value);
-    }
-
-    for (ObjectPtr* entries = cache->ptr()->cache_->ptr()->data();
-         entries[0] != null_value;
-         entries += SubtypeTestCache::kTestEntryLength) {
-      if ((entries[SubtypeTestCache::kInstanceClassIdOrFunction] ==
-           instance_cid_or_function) &&
-          (entries[SubtypeTestCache::kInstanceTypeArguments] ==
-           instance_type_arguments) &&
-          (entries[SubtypeTestCache::kInstantiatorTypeArguments] ==
-           instantiator_type_arguments) &&
-          (entries[SubtypeTestCache::kFunctionTypeArguments] ==
-           function_type_arguments) &&
-          (entries[SubtypeTestCache::kInstanceParentFunctionTypeArguments] ==
-           parent_function_type_arguments) &&
-          (entries[SubtypeTestCache::kInstanceDelayedFunctionTypeArguments] ==
-           delayed_function_type_arguments)) {
-        if (Bool::True().raw() == entries[SubtypeTestCache::kTestResult]) {
-          return true;
-        } else {
-          break;
-        }
-      }
-    }
-  }
-
-AssertAssignableCallRuntime:
-  // args[0]: Instance.
-  // args[1]: Type.
-  // args[2]: Instantiator type args.
-  // args[3]: Function type args.
-  // args[4]: Name.
-  args[5] = cache;
-  args[6] = Smi::New(kTypeCheckFromInline);
-  args[7] = 0;  // Unused result.
-  Exit(thread, FP, args + 8, pc);
-  NativeArguments native_args(thread, 7, args, args + 7);
-  return InvokeRuntime(thread, this, DRT_TypeCheck, native_args);
-}
-
-template <bool is_getter>
-bool Interpreter::AssertAssignableField(Thread* thread,
-                                        const KBCInstr* pc,
-                                        ObjectPtr* FP,
-                                        ObjectPtr* SP,
-                                        InstancePtr instance,
-                                        FieldPtr field,
-                                        InstancePtr value) {
-  AbstractTypePtr field_type = field->ptr()->type_;
-  // Perform type test of value if field type is not one of dynamic, object,
-  // or void, and if the value is not null.
-  if (field_type->GetClassId() == kTypeCid) {
-    classid_t cid = Smi::Value(
-        static_cast<SmiPtr>(Type::RawCast(field_type)->ptr()->type_class_id_));
-    // TODO(regis): Revisit shortcut for NNBD.
-    if (cid == kDynamicCid || cid == kInstanceCid || cid == kVoidCid) {
-      return true;
-    }
-  }
-  ObjectPtr null_value = Object::null();
-  if (value == null_value) {
-    // TODO(regis): Revisit null shortcut for NNBD.
-    return true;
-  }
-
-  SubtypeTestCachePtr cache = field->ptr()->type_test_cache_;
-  if (UNLIKELY(cache == null_value)) {
-    // Allocate new cache.
-    SP[1] = instance;    // Preserve.
-    SP[2] = field;       // Preserve.
-    SP[3] = value;       // Preserve.
-    SP[4] = null_value;  // Result slot.
-
-    Exit(thread, FP, SP + 5, pc);
-    if (!InvokeRuntime(thread, this, DRT_AllocateSubtypeTestCache,
-                       NativeArguments(thread, 0, /* argv */ SP + 4,
-                                       /* retval */ SP + 4))) {
-      return false;
-    }
-
-    // Reload objects after the call which may trigger GC.
-    instance = static_cast<InstancePtr>(SP[1]);
-    field = static_cast<FieldPtr>(SP[2]);
-    value = static_cast<InstancePtr>(SP[3]);
-    cache = static_cast<SubtypeTestCachePtr>(SP[4]);
-    field_type = field->ptr()->type_;
-    field->ptr()->type_test_cache_ = cache;
-  }
-
-  // Push arguments of type test.
-  SP[1] = value;
-  SP[2] = field_type;
-  // Provide type arguments of instance as instantiator.
-  SP[3] = InterpreterHelpers::GetTypeArguments(thread, instance);
-  SP[4] = null_value;  // Implicit setters cannot be generic.
-  SP[5] = is_getter ? Symbols::FunctionResult().raw() : field->ptr()->name_;
-  return AssertAssignable(thread, pc, FP, /* call_top */ SP + 5,
-                          /* args */ SP + 1, cache);
-}
-
-ObjectPtr Interpreter::Call(const Function& function,
-                            const Array& arguments_descriptor,
-                            const Array& arguments,
-                            Thread* thread) {
-  return Call(function.raw(), arguments_descriptor.raw(), arguments.Length(),
-              arguments.raw_ptr()->data(), thread);
-}
-
-// Allocate a _Mint for the given int64_t value and puts it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateMint(Thread* thread,
-                                             int64_t value,
-                                             const KBCInstr* pc,
-                                             ObjectPtr* FP,
-                                             ObjectPtr* SP) {
-  ASSERT(!Smi::IsValid(value));
-  MintPtr result;
-  if (TryAllocate(thread, kMintCid, Mint::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->value_ = value;
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->mint_class();  // Class object.
-    SP[2] = Object::null();                                   // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    static_cast<MintPtr>(SP[0])->ptr()->value_ = value;
-    return true;
-  }
-}
-
-// Allocate a _Double for the given double value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateDouble(Thread* thread,
-                                               double value,
-                                               const KBCInstr* pc,
-                                               ObjectPtr* FP,
-                                               ObjectPtr* SP) {
-  DoublePtr result;
-  if (TryAllocate(thread, kDoubleCid, Double::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->value_ = value;
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->double_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    Double::RawCast(SP[0])->ptr()->value_ = value;
-    return true;
-  }
-}
-
-// Allocate a _Float32x4 for the given simd value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateFloat32x4(Thread* thread,
-                                                  simd128_value_t value,
-                                                  const KBCInstr* pc,
-                                                  ObjectPtr* FP,
-                                                  ObjectPtr* SP) {
-  Float32x4Ptr result;
-  if (TryAllocate(thread, kFloat32x4Cid, Float32x4::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    value.writeTo(result->ptr()->value_);
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->float32x4_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    value.writeTo(Float32x4::RawCast(SP[0])->ptr()->value_);
-    return true;
-  }
-}
-
-// Allocate _Float64x2 box for the given simd value and put it into SP[0].
-// Returns false on exception.
-DART_NOINLINE bool Interpreter::AllocateFloat64x2(Thread* thread,
-                                                  simd128_value_t value,
-                                                  const KBCInstr* pc,
-                                                  ObjectPtr* FP,
-                                                  ObjectPtr* SP) {
-  Float64x2Ptr result;
-  if (TryAllocate(thread, kFloat64x2Cid, Float64x2::InstanceSize(),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    value.writeTo(result->ptr()->value_);
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->float64x2_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
-      return false;
-    }
-    value.writeTo(Float64x2::RawCast(SP[0])->ptr()->value_);
-    return true;
-  }
-}
-
-// Allocate a _List with the given type arguments and length and put it into
-// SP[0]. Returns false on exception.
-bool Interpreter::AllocateArray(Thread* thread,
-                                TypeArgumentsPtr type_args,
-                                ObjectPtr length_object,
-                                const KBCInstr* pc,
-                                ObjectPtr* FP,
-                                ObjectPtr* SP) {
-  if (LIKELY(!length_object->IsHeapObject())) {
-    const intptr_t length = Smi::Value(Smi::RawCast(length_object));
-    if (LIKELY(Array::IsValidLength(length))) {
-      ArrayPtr result;
-      if (TryAllocate(thread, kArrayCid, Array::InstanceSize(length),
-                      reinterpret_cast<ObjectPtr*>(&result))) {
-        result->ptr()->type_arguments_ = type_args;
-        result->ptr()->length_ = Smi::New(length);
-        for (intptr_t i = 0; i < length; i++) {
-          result->ptr()->data()[i] = Object::null();
-        }
-        SP[0] = result;
-        return true;
-      }
-    }
-  }
-
-  SP[0] = 0;  // Space for the result;
-  SP[1] = length_object;
-  SP[2] = type_args;
-  Exit(thread, FP, SP + 3, pc);
-  NativeArguments args(thread, 2, SP + 1, SP);
-  return InvokeRuntime(thread, this, DRT_AllocateArray, args);
-}
-
-// Allocate a _Context with the given length and put it into SP[0].
-// Returns false on exception.
-bool Interpreter::AllocateContext(Thread* thread,
-                                  intptr_t num_context_variables,
-                                  const KBCInstr* pc,
-                                  ObjectPtr* FP,
-                                  ObjectPtr* SP) {
-  ContextPtr result;
-  if (TryAllocate(thread, kContextCid,
-                  Context::InstanceSize(num_context_variables),
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    result->ptr()->num_variables_ = num_context_variables;
-    ObjectPtr null_value = Object::null();
-    result->ptr()->parent_ = static_cast<ContextPtr>(null_value);
-    for (intptr_t i = 0; i < num_context_variables; i++) {
-      result->ptr()->data()[i] = null_value;
-    }
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = Smi::New(num_context_variables);
-    Exit(thread, FP, SP + 2, pc);
-    NativeArguments args(thread, 1, SP + 1, SP);
-    return InvokeRuntime(thread, this, DRT_AllocateContext, args);
-  }
-}
-
-// Allocate a _Closure and put it into SP[0].
-// Returns false on exception.
-bool Interpreter::AllocateClosure(Thread* thread,
-                                  const KBCInstr* pc,
-                                  ObjectPtr* FP,
-                                  ObjectPtr* SP) {
-  const intptr_t instance_size = Closure::InstanceSize();
-  ClosurePtr result;
-  if (TryAllocate(thread, kClosureCid, instance_size,
-                  reinterpret_cast<ObjectPtr*>(&result))) {
-    uword start = ObjectLayout::ToAddr(result);
-    ObjectPtr null_value = Object::null();
-    for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-         offset += kWordSize) {
-      *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-    }
-    SP[0] = result;
-    return true;
-  } else {
-    SP[0] = 0;  // Space for the result.
-    SP[1] = thread->isolate()->object_store()->closure_class();
-    SP[2] = Object::null();  // Type arguments.
-    Exit(thread, FP, SP + 3, pc);
-    NativeArguments args(thread, 2, SP + 1, SP);
-    return InvokeRuntime(thread, this, DRT_AllocateObject, args);
-  }
-}
-
-ObjectPtr Interpreter::Call(FunctionPtr function,
-                            ArrayPtr argdesc,
-                            intptr_t argc,
-                            ObjectPtr const* argv,
-                            Thread* thread) {
-  // Interpreter state (see constants_kbc.h for high-level overview).
-  const KBCInstr* pc;  // Program Counter: points to the next op to execute.
-  ObjectPtr* FP;       // Frame Pointer.
-  ObjectPtr* SP;       // Stack Pointer.
-
-  uint32_t op;  // Currently executing op.
-
-  bool reentering = fp_ != NULL;
-  if (!reentering) {
-    fp_ = reinterpret_cast<ObjectPtr*>(stack_base_);
-  }
-#if defined(DEBUG)
-  if (IsTracingExecution()) {
-    THR_Print("%" Pu64 " ", icount_);
-    THR_Print("%s interpreter 0x%" Px " at fp_ 0x%" Px " exit 0x%" Px " %s\n",
-              reentering ? "Re-entering" : "Entering",
-              reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-              thread->top_exit_frame_info(),
-              Function::Handle(function).ToFullyQualifiedCString());
-  }
-#endif
-
-  // Setup entry frame:
-  //
-  //                        ^
-  //                        |  previous Dart frames
-  //                        |
-  //       | ........... | -+
-  // fp_ > | exit fp_    |     saved top_exit_frame_info
-  //       | argdesc_    |     saved argdesc_ (for reentering interpreter)
-  //       | pp_         |     saved pp_ (for reentering interpreter)
-  //       | arg 0       | -+
-  //       | arg 1       |  |
-  //         ...            |
-  //                         > incoming arguments
-  //                        |
-  //       | arg argc-1  | -+
-  //       | function    | -+
-  //       | code        |  |
-  //       | caller PC   | ---> special fake PC marking an entry frame
-  //  SP > | fp_         |  |
-  //  FP > | ........... |   > normal Dart frame (see stack_frame_kbc.h)
-  //                        |
-  //                        v
-  //
-  // A negative argc indicates reverse memory order of arguments.
-  const intptr_t arg_count = argc < 0 ? -argc : argc;
-  FP = fp_ + kKBCEntrySavedSlots + arg_count + kKBCDartFrameFixedSize;
-  SP = FP - 1;
-
-  // Save outer top_exit_frame_info, current argdesc, and current pp.
-  fp_[kKBCExitLinkSlotFromEntryFp] =
-      static_cast<ObjectPtr>(thread->top_exit_frame_info());
-  thread->set_top_exit_frame_info(0);
-  fp_[kKBCSavedArgDescSlotFromEntryFp] = static_cast<ObjectPtr>(argdesc_);
-  fp_[kKBCSavedPpSlotFromEntryFp] = static_cast<ObjectPtr>(pp_);
-
-  // Copy arguments and setup the Dart frame.
-  for (intptr_t i = 0; i < arg_count; i++) {
-    fp_[kKBCEntrySavedSlots + i] = argv[argc < 0 ? -i : i];
-  }
-
-  BytecodePtr bytecode = function->ptr()->bytecode_;
-  FP[kKBCFunctionSlotFromFp] = function;
-  FP[kKBCPcMarkerSlotFromFp] = bytecode;
-  FP[kKBCSavedCallerPcSlotFromFp] = static_cast<ObjectPtr>(kEntryFramePcMarker);
-  FP[kKBCSavedCallerFpSlotFromFp] =
-      static_cast<ObjectPtr>(reinterpret_cast<uword>(fp_));
-
-  // Load argument descriptor.
-  argdesc_ = argdesc;
-
-  // Ready to start executing bytecode. Load entry point and corresponding
-  // object pool.
-  pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-  NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-  NOT_IN_PRODUCT(fp_ = FP);  // For the profiler.
-  pp_ = bytecode->ptr()->object_pool_;
-
-  // Save current VM tag and mark thread as executing Dart code. For the
-  // profiler, do this *after* setting up the entry frame (compare the machine
-  // code entry stubs).
-  const uword vm_tag = thread->vm_tag();
-  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-
-  // Save current top stack resource and reset the list.
-  StackResource* top_resource = thread->top_resource();
-  thread->set_top_resource(NULL);
-
-  // Cache some frequently used values in the frame.
-  BoolPtr true_value = Bool::True().raw();
-  BoolPtr false_value = Bool::False().raw();
-  ObjectPtr null_value = Object::null();
-
-#ifdef DART_HAS_COMPUTED_GOTO
-  static const void* dispatch[] = {
-#define TARGET(name, fmt, kind, fmta, fmtb, fmtc) &&bc##name,
-      KERNEL_BYTECODES_LIST(TARGET)
-#undef TARGET
-  };
-  DISPATCH();  // Enter the dispatch loop.
-#else
-  DISPATCH();  // Enter the dispatch loop.
-SwitchDispatch:
-  switch (op & 0xFF) {
-#define TARGET(name, fmt, kind, fmta, fmtb, fmtc)                              \
-  case KernelBytecode::k##name:                                                \
-    goto bc##name;
-    KERNEL_BYTECODES_LIST(TARGET)
-#undef TARGET
-    default:
-      FATAL1("Undefined opcode: %d\n", op);
-  }
-#endif
-
-  // KernelBytecode handlers (see constants_kbc.h for bytecode descriptions).
-  {
-    BYTECODE(Entry, D);
-    const intptr_t num_locals = rD;
-
-    // Initialize locals with null & set SP.
-    for (intptr_t i = 0; i < num_locals; i++) {
-      FP[i] = null_value;
-    }
-    SP = FP + num_locals - 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EntryFixed, A_E);
-    const intptr_t num_fixed_params = rA;
-    const intptr_t num_locals = rE;
-
-    const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-    const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
-    if ((arg_count != num_fixed_params) || (pos_count != num_fixed_params)) {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-
-    // Initialize locals with null & set SP.
-    for (intptr_t i = 0; i < num_locals; i++) {
-      FP[i] = null_value;
-    }
-    SP = FP + num_locals - 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EntryOptional, A_B_C);
-    if (CopyParameters(thread, &pc, &FP, &SP, rA, rB, rC)) {
-      DISPATCH();
-    } else {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-  }
-
-  {
-    BYTECODE(Frame, D);
-    // Initialize locals with null and increment SP.
-    const intptr_t num_locals = rD;
-    for (intptr_t i = 1; i <= num_locals; i++) {
-      SP[i] = null_value;
-    }
-    SP += num_locals;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SetFrame, A);
-    SP = FP + rA - 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckStack, A);
-    {
-      // Check the interpreter's own stack limit for actual interpreter's stack
-      // overflows, and also the thread's stack limit for scheduled interrupts.
-      if (reinterpret_cast<uword>(SP) >= overflow_stack_limit() ||
-          thread->HasScheduledInterrupts()) {
-        Exit(thread, FP, SP + 1, pc);
-        INVOKE_RUNTIME(DRT_StackOverflow,
-                       NativeArguments(thread, 0, nullptr, nullptr));
-      }
-    }
-    FunctionPtr function = FrameFunction(FP);
-    int32_t counter = ++(function->ptr()->usage_counter_);
-    if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
-                 counter >= FLAG_compilation_counter_threshold &&
-                 !Function::HasCode(function))) {
-      SP[1] = 0;  // Unused result.
-      SP[2] = function;
-      Exit(thread, FP, SP + 3, pc);
-      INVOKE_RUNTIME(DRT_CompileInterpretedFunction,
-                     NativeArguments(thread, 1, SP + 2, SP + 1));
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DebugCheck, 0);
-    DEBUG_CHECK;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CheckFunctionTypeArgs, A_E);
-    const intptr_t declared_type_args_len = rA;
-    const intptr_t first_stack_local_index = rE;
-
-    // Decode arguments descriptor's type args len.
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    if ((type_args_len != declared_type_args_len) && (type_args_len != 0)) {
-      SP[1] = FrameFunction(FP);
-      goto NoSuchMethodFromPrologue;
-    }
-    if (type_args_len > 0) {
-      // Decode arguments descriptor's argument count (excluding type args).
-      const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
-      // Copy passed-in type args to first local slot.
-      FP[first_stack_local_index] = *FrameArguments(FP, arg_count + 1);
-    } else if (declared_type_args_len > 0) {
-      FP[first_stack_local_index] = Object::null();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstantiateType, D);
-    // Stack: instantiator type args, function type args
-    ObjectPtr type = LOAD_CONSTANT(rD);
-    SP[1] = type;
-    SP[2] = SP[-1];
-    SP[3] = SP[0];
-    Exit(thread, FP, SP + 4, pc);
-    {
-      INVOKE_RUNTIME(DRT_InstantiateType,
-                     NativeArguments(thread, 3, SP + 1, SP - 1));
-    }
-    SP -= 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InstantiateTypeArgumentsTOS, A_E);
-    // Stack: instantiator type args, function type args
-    TypeArgumentsPtr type_arguments =
-        static_cast<TypeArgumentsPtr>(LOAD_CONSTANT(rE));
-
-    ObjectPtr instantiator_type_args = SP[-1];
-    ObjectPtr function_type_args = SP[0];
-    // If both instantiators are null and if the type argument vector
-    // instantiated from null becomes a vector of dynamic, then use null as
-    // the type arguments.
-    if ((rA == 0) || (null_value != instantiator_type_args) ||
-        (null_value != function_type_args)) {
-      // First lookup in the cache.
-      ArrayPtr instantiations = type_arguments->ptr()->instantiations_;
-      for (intptr_t i = 0;
-           instantiations->ptr()->data()[i] !=
-           static_cast<ObjectPtr>(TypeArguments::kNoInstantiator);
-           i += TypeArguments::Instantiation::kSizeInWords) {
-        if ((instantiations->ptr()->data()
-                 [i +
-                  TypeArguments::Instantiation::kInstantiatorTypeArgsIndex] ==
-             instantiator_type_args) &&
-            (instantiations->ptr()->data()
-                 [i + TypeArguments::Instantiation::kFunctionTypeArgsIndex] ==
-             function_type_args)) {
-          // Found in the cache.
-          SP[-1] =
-              instantiations->ptr()->data()[i + TypeArguments::Instantiation::
-                                                    kInstantiatedTypeArgsIndex];
-          goto InstantiateTypeArgumentsTOSDone;
-        }
-      }
-
-      // Cache lookup failed, call runtime.
-      SP[1] = type_arguments;
-      SP[2] = instantiator_type_args;
-      SP[3] = function_type_args;
-
-      Exit(thread, FP, SP + 4, pc);
-      INVOKE_RUNTIME(DRT_InstantiateTypeArguments,
-                     NativeArguments(thread, 3, SP + 1, SP - 1));
-    }
-
-  InstantiateTypeArgumentsTOSDone:
-    SP -= 1;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Throw, A);
-    {
-      SP[1] = 0;  // Space for result.
-      Exit(thread, FP, SP + 2, pc);
-      if (rA == 0) {  // Throw
-        INVOKE_RUNTIME(DRT_Throw, NativeArguments(thread, 1, SP, SP + 1));
-      } else {  // ReThrow
-        INVOKE_RUNTIME(DRT_ReThrow, NativeArguments(thread, 2, SP - 1, SP + 1));
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Drop1, 0);
-    SP--;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadConstant, A_E);
-    FP[rA] = LOAD_CONSTANT(rE);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushConstant, D);
-    *++SP = LOAD_CONSTANT(rD);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushNull, 0);
-    *++SP = null_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushTrue, 0);
-    *++SP = true_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushFalse, 0);
-    *++SP = false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushInt, X);
-    *++SP = Smi::New(rX);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Push, X);
-    *++SP = FP[rX];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreLocal, X);
-    FP[rX] = *SP;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PopLocal, X);
-    FP[rX] = *SP--;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MoveSpecial, A_Y);
-    ASSERT(rA < KernelBytecode::kSpecialIndexCount);
-    FP[rY] = special_[rA];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BooleanNegateTOS, 0);
-    SP[0] = (SP[0] == true_value) ? false_value : true_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DirectCall, D_F);
-    DEBUG_CHECK;
-    // Invoke target function.
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      *++SP = LOAD_CONSTANT(kidx);
-      ObjectPtr* call_base = SP - argc;
-      ObjectPtr* call_top = SP;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedDirectCall, D_F);
-    DEBUG_CHECK;
-    // Invoke target function.
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      *++SP = LOAD_CONSTANT(kidx);
-      ObjectPtr* call_base = SP - argc;
-      ObjectPtr* call_top = SP;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-  {
-    BYTECODE(InstantiatedInterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedClosureCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ClosurePtr receiver = Closure::RawCast(*SP--);
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      if (UNLIKELY(receiver == null_value)) {
-        SP[0] = Symbols::Call().raw();
-        goto ThrowNullError;
-      }
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx));
-      call_top[0] = receiver->ptr()->function_;
-
-      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(UncheckedInterfaceCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name =
-          static_cast<FunctionPtr>(LOAD_CONSTANT(kidx))->ptr()->name_;
-      argdesc_ = static_cast<ArrayPtr>(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DynamicCall, D_F);
-    DEBUG_CHECK;
-    {
-      const uint32_t argc = rF;
-      const uint32_t kidx = rD;
-
-      ObjectPtr* call_base = SP - argc + 1;
-      ObjectPtr* call_top = SP + 1;
-
-      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
-      StringPtr target_name = String::RawCast(LOAD_CONSTANT(kidx));
-      argdesc_ = Array::RawCast(LOAD_CONSTANT(kidx + 1));
-      if (!InstanceCall(thread, target_name, call_base, call_top, &pc, &FP,
-                        &SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NativeCall, D);
-    TypedDataPtr data = static_cast<TypedDataPtr>(LOAD_CONSTANT(rD));
-    MethodRecognizer::Kind kind = NativeEntryData::GetKind(data);
-    switch (kind) {
-      case MethodRecognizer::kObjectEquals: {
-        SP[-1] = SP[-1] == SP[0] ? Bool::True().raw() : Bool::False().raw();
-        SP--;
-      } break;
-      case MethodRecognizer::kStringBaseLength:
-      case MethodRecognizer::kStringBaseIsEmpty: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[String::length_offset() / kWordSize];
-        if (kind == MethodRecognizer::kStringBaseIsEmpty) {
-          SP[0] =
-              SP[0] == Smi::New(0) ? Bool::True().raw() : Bool::False().raw();
-        }
-      } break;
-      case MethodRecognizer::kGrowableArrayLength: {
-        GrowableObjectArrayPtr instance =
-            static_cast<GrowableObjectArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kObjectArrayLength:
-      case MethodRecognizer::kImmutableArrayLength: {
-        ArrayPtr instance = static_cast<ArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kTypedListLength:
-      case MethodRecognizer::kTypedListViewLength:
-      case MethodRecognizer::kByteDataViewLength: {
-        TypedDataBasePtr instance = static_cast<TypedDataBasePtr>(SP[0]);
-        SP[0] = instance->ptr()->length_;
-      } break;
-      case MethodRecognizer::kByteDataViewOffsetInBytes:
-      case MethodRecognizer::kTypedDataViewOffsetInBytes: {
-        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
-        SP[0] = instance->ptr()->offset_in_bytes_;
-      } break;
-      case MethodRecognizer::kByteDataViewTypedData:
-      case MethodRecognizer::kTypedDataViewTypedData: {
-        TypedDataViewPtr instance = static_cast<TypedDataViewPtr>(SP[0]);
-        SP[0] = instance->ptr()->typed_data_;
-      } break;
-      case MethodRecognizer::kClassIDgetID: {
-        SP[0] = InterpreterHelpers::GetClassIdAsSmi(SP[0]);
-      } break;
-      case MethodRecognizer::kAsyncStackTraceHelper: {
-        SP[0] = Object::null();
-      } break;
-      case MethodRecognizer::kGrowableArrayCapacity: {
-        GrowableObjectArrayPtr instance =
-            static_cast<GrowableObjectArrayPtr>(SP[0]);
-        SP[0] = instance->ptr()->data_->ptr()->length_;
-      } break;
-      case MethodRecognizer::kListFactory: {
-        // factory List<E>([int length]) {
-        //   return (:arg_desc.positional_count == 2) ? new _List<E>(length)
-        //                                            : new _GrowableList<E>(0);
-        // }
-        if (InterpreterHelpers::ArgDescPosCount(argdesc_) == 2) {
-          TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-          ObjectPtr length = SP[0];
-          SP--;
-          if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-            HANDLE_EXCEPTION;
-          }
-        } else {
-          ASSERT(InterpreterHelpers::ArgDescPosCount(argdesc_) == 1);
-          // SP[-1] is type.
-          // The native wrapper pushed null as the optional length argument.
-          ASSERT(SP[0] == null_value);
-          SP[0] = Smi::New(0);  // Patch null length with zero length.
-          SP[1] = thread->isolate()->object_store()->growable_list_factory();
-          // Change the ArgumentsDescriptor of the call with a new cached one.
-          argdesc_ = ArgumentsDescriptor::NewBoxed(
-              0, KernelBytecode::kNativeCallToGrowableListArgc);
-          // Replace PC to the return trampoline so ReturnTOS would see
-          // a call bytecode at return address and will be able to get argc
-          // via DecodeArgc.
-          pc = KernelBytecode::GetNativeCallToGrowableListReturnTrampoline();
-          if (!Invoke(thread, SP - 1, SP + 1, &pc, &FP, &SP)) {
-            HANDLE_EXCEPTION;
-          }
-        }
-      } break;
-      case MethodRecognizer::kObjectArrayAllocate: {
-        TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-        ObjectPtr length = SP[0];
-        SP--;
-        if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-          HANDLE_EXCEPTION;
-        }
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getIndex: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::index_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setIndex: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        instance->ptr()->StorePointer(
-            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
-                LinkedHashMap::index_offset() / kWordSize,
-            SP[0]);
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::data_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        instance->ptr()->StorePointer(
-            reinterpret_cast<ObjectPtr*>(instance->ptr()) +
-                LinkedHashMap::data_offset() / kWordSize,
-            SP[0]);
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getHashMask: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setHashMask: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::hash_mask_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getUsedData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setUsedData: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::used_data_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kLinkedHashMap_getDeletedKeys: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-        SP[0] = reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize];
-      } break;
-      case MethodRecognizer::kLinkedHashMap_setDeletedKeys: {
-        InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-        ASSERT(!SP[0]->IsHeapObject());
-        reinterpret_cast<ObjectPtr*>(
-            instance->ptr())[LinkedHashMap::deleted_keys_offset() / kWordSize] =
-            SP[0];
-        *--SP = null_value;
-      } break;
-      case MethodRecognizer::kFfiAbi: {
-        *++SP = Smi::New(static_cast<int64_t>(compiler::ffi::TargetAbi()));
-      } break;
-#define TYPED_DATA_FACTORY(clazz)                                              \
-  case MethodRecognizer::kTypedData_##clazz##_factory: {                       \
-    ObjectPtr length = SP[0];                                                  \
-    SP[1] = Smi::New(kTypedData##clazz##Cid);                                  \
-    SP[2] = length;                                                            \
-    Exit(thread, FP, SP + 3, pc);                                              \
-    INVOKE_RUNTIME(DRT_AllocateTypedData,                                      \
-                   NativeArguments(thread, 2, SP + 1, SP));                    \
-  } break;
-        CLASS_LIST_TYPED_DATA(TYPED_DATA_FACTORY)
-#undef TYPED_DATA_FACTORY
-      default: {
-        NativeEntryData::Payload* payload =
-            NativeEntryData::FromTypedArray(data);
-        intptr_t argc_tag = NativeEntryData::GetArgcTag(data);
-        const intptr_t num_arguments =
-            NativeArguments::ArgcBits::decode(argc_tag);
-
-        if (payload->trampoline == NULL) {
-          ASSERT(payload->native_function == NULL);
-          payload->trampoline = &NativeEntry::BootstrapNativeCallWrapper;
-          payload->native_function =
-              reinterpret_cast<NativeFunction>(&NativeEntry::LinkNativeCall);
-        }
-
-        *++SP = null_value;  // Result slot.
-
-        ObjectPtr* incoming_args = SP - num_arguments;
-        ObjectPtr* return_slot = SP;
-        Exit(thread, FP, SP + 1, pc);
-        NativeArguments native_args(thread, argc_tag, incoming_args,
-                                    return_slot);
-        INVOKE_NATIVE(
-            payload->trampoline,
-            reinterpret_cast<Dart_NativeFunction>(payload->native_function),
-            reinterpret_cast<Dart_NativeArguments>(&native_args));
-
-        *(SP - num_arguments) = *return_slot;
-        SP -= num_arguments;
-      }
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ReturnTOS, 0);
-    DEBUG_CHECK;
-    ObjectPtr result;  // result to return to the caller.
-    result = *SP;
-    // Restore caller PC.
-    pc = SavedCallerPC(FP);
-
-    // Check if it is a fake PC marking the entry frame.
-    if (IsEntryFrameMarker(pc)) {
-      // Pop entry frame.
-      ObjectPtr* entry_fp = SavedCallerFP(FP);
-      // Restore exit frame info saved in entry frame.
-      pp_ = static_cast<ObjectPoolPtr>(entry_fp[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ =
-          static_cast<ArrayPtr>(entry_fp[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp = static_cast<uword>(entry_fp[kKBCExitLinkSlotFromEntryFp]);
-      thread->set_top_exit_frame_info(exit_fp);
-      thread->set_top_resource(top_resource);
-      thread->set_vm_tag(vm_tag);
-      fp_ = entry_fp;
-      NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-#if defined(DEBUG)
-      if (IsTracingExecution()) {
-        THR_Print("%" Pu64 " ", icount_);
-        THR_Print("Returning from interpreter 0x%" Px " at fp_ 0x%" Px
-                  " exit 0x%" Px "\n",
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-                  exit_fp);
-      }
-      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
-      // Exception propagation should have been done.
-      ASSERT(!result->IsHeapObject() ||
-             result->GetClassId() != kUnhandledExceptionCid);
-#endif
-      return result;
-    }
-
-    // Look at the caller to determine how many arguments to pop.
-    const uint8_t argc = KernelBytecode::DecodeArgc(pc);
-
-    // Restore SP, FP and PP. Push result and dispatch.
-    SP = FrameArguments(FP, argc);
-    FP = SavedCallerFP(FP);
-    NOT_IN_PRODUCT(fp_ = FP);  // For the profiler.
-    NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
-    *SP = result;
-#if defined(DEBUG)
-    if (IsTracingExecution()) {
-      THR_Print("%" Pu64 " ", icount_);
-      THR_Print("Returning to %s (argc %d)\n",
-                Function::Handle(FrameFunction(FP)).ToFullyQualifiedCString(),
-                static_cast<int>(argc));
-    }
-#endif
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(InitLateField, D);
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
-        Object::RawCast(Object::sentinel().raw()), thread);
-
-    SP -= 1;  // Drop instance.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(PushUninitializedSentinel, 0);
-    *++SP = Object::sentinel().raw();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfInitialized, T);
-    SP -= 1;
-    if (SP[1] != Object::sentinel().raw()) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreStaticTOS, D);
-    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
-    InstancePtr value = static_cast<InstancePtr>(*SP--);
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    thread->field_table_values()[field_id] = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadStatic, D);
-    FieldPtr field = static_cast<FieldPtr>(LOAD_CONSTANT(rD));
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    InstancePtr value = thread->field_table_values()[field_id];
-    ASSERT((value != Object::sentinel().raw()) &&
-           (value != Object::transition_sentinel().raw()));
-    *++SP = value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreFieldTOS, D);
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    InstancePtr instance = static_cast<InstancePtr>(SP[-1]);
-    ObjectPtr value = static_cast<ObjectPtr>(SP[0]);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
-      SP[1] = 0;  // Unused result of runtime call.
-      SP[2] = field;
-      SP[3] = value;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid,
-                         NativeArguments(thread, 2, /* argv */ SP + 2,
-                                         /* retval */ SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Reload objects after the call which may trigger GC.
-      field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-      instance = static_cast<InstancePtr>(SP[-1]);
-      value = SP[0];
-    }
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      ASSERT(*(reinterpret_cast<DoublePtr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateDouble(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      DoublePtr box = Double::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words, box,
-          thread);
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateFloat32x4(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      Float32x4Ptr box = Float32x4::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words,
-          box, thread);
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      ASSERT(*(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) +
-               offset_in_words) == null_value);  // Initializing store.
-      if (!AllocateFloat64x2(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-      Float64x2Ptr box = Float64x2::RawCast(SP[0]);
-      instance = static_cast<InstancePtr>(SP[-1]);
-      instance->ptr()->StorePointer(
-          reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words,
-          box, thread);
-    } else {
-      instance->ptr()->StorePointer(
-          reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words,
-          value, thread);
-    }
-
-    SP -= 2;  // Drop instance and value.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreContextParent, 0);
-    const uword offset_in_words =
-        static_cast<uword>(Context::parent_offset() / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
-    ContextPtr value = static_cast<ContextPtr>(SP[0]);
-    SP -= 2;  // Drop instance and value.
-
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ContextPtr*>(instance->ptr()) + offset_in_words, value,
-        thread);
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreContextVar, A_E);
-    const uword offset_in_words =
-        static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[-1]);
-    ObjectPtr value = static_cast<ContextPtr>(SP[0]);
-    SP -= 2;  // Drop instance and value.
-    ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    instance->ptr()->StorePointer(
-        reinterpret_cast<ObjectPtr*>(instance->ptr()) + offset_in_words, value,
-        thread);
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadFieldTOS, D);
-#if defined(DEBUG)
-    // Currently only used to load closure fields, which are not unboxed.
-    // If used for general field, code for copying the mutable box must be
-    // added.
-    FieldPtr field = RAW_CAST(Field, LOAD_CONSTANT(rD + 1));
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    ASSERT(!unboxing);
-#endif
-    const uword offset_in_words =
-        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadTypeArgumentsField, D);
-    const uword offset_in_words =
-        static_cast<uword>(Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(rD))));
-    InstancePtr instance = static_cast<InstancePtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadContextParent, 0);
-    const uword offset_in_words =
-        static_cast<uword>(Context::parent_offset() / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(LoadContextVar, A_E);
-    const uword offset_in_words =
-        static_cast<uword>(Context::variable_offset(rE) / kWordSize);
-    ContextPtr instance = static_cast<ContextPtr>(SP[0]);
-    ASSERT(rE < static_cast<uint32_t>(instance->ptr()->num_variables_));
-    SP[0] = reinterpret_cast<ObjectPtr*>(instance->ptr())[offset_in_words];
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateContext, A_E);
-    ++SP;
-    const uint32_t num_context_variables = rE;
-    if (!AllocateContext(thread, num_context_variables, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CloneContext, A_E);
-    {
-      SP[1] = SP[0];  // Context to clone.
-      Exit(thread, FP, SP + 2, pc);
-      INVOKE_RUNTIME(DRT_CloneContext, NativeArguments(thread, 1, SP + 1, SP));
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Allocate, D);
-    ClassPtr cls = Class::RawCast(LOAD_CONSTANT(rD));
-    if (LIKELY(InterpreterHelpers::IsAllocateFinalized(cls))) {
-      const intptr_t class_id = cls->ptr()->id_;
-      const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
-                                     << kWordSizeLog2;
-      ObjectPtr result;
-      if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = ObjectLayout::ToAddr(result);
-        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-             offset += kWordSize) {
-          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-        }
-        *++SP = result;
-        DISPATCH();
-      }
-    }
-
-    SP[1] = 0;           // Space for the result.
-    SP[2] = cls;         // Class object.
-    SP[3] = null_value;  // Type arguments.
-    Exit(thread, FP, SP + 4, pc);
-    INVOKE_RUNTIME(DRT_AllocateObject,
-                   NativeArguments(thread, 2, SP + 2, SP + 1));
-    SP++;  // Result is in SP[1].
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateT, 0);
-    ClassPtr cls = Class::RawCast(SP[0]);
-    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-    if (LIKELY(InterpreterHelpers::IsAllocateFinalized(cls))) {
-      const intptr_t class_id = cls->ptr()->id_;
-      const intptr_t instance_size = cls->ptr()->host_instance_size_in_words_
-                                     << kWordSizeLog2;
-      ObjectPtr result;
-      if (TryAllocate(thread, class_id, instance_size, &result)) {
-        uword start = ObjectLayout::ToAddr(result);
-        for (intptr_t offset = sizeof(InstanceLayout); offset < instance_size;
-             offset += kWordSize) {
-          *reinterpret_cast<ObjectPtr*>(start + offset) = null_value;
-        }
-        const intptr_t type_args_offset =
-            cls->ptr()->host_type_arguments_field_offset_in_words_
-            << kWordSizeLog2;
-        *reinterpret_cast<ObjectPtr*>(start + type_args_offset) = type_args;
-        *--SP = result;
-        DISPATCH();
-      }
-    }
-
-    SP[1] = cls;
-    SP[2] = type_args;
-    Exit(thread, FP, SP + 3, pc);
-    INVOKE_RUNTIME(DRT_AllocateObject,
-                   NativeArguments(thread, 2, SP + 1, SP - 1));
-    SP -= 1;  // Result is in SP - 1.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CreateArrayTOS, 0);
-    TypeArgumentsPtr type_args = TypeArguments::RawCast(SP[-1]);
-    ObjectPtr length = SP[0];
-    SP--;
-    if (!AllocateArray(thread, type_args, length, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertAssignable, A_E);
-    // Stack: instance, type, instantiator type args, function type args, name
-    ObjectPtr* args = SP - 4;
-    const bool may_be_smi = (rA == 1);
-    const bool is_smi =
-        ((static_cast<intptr_t>(args[0]) & kSmiTagMask) == kSmiTag);
-    const bool smi_ok = is_smi && may_be_smi;
-    if (!smi_ok && (args[0] != null_value)) {
-      SubtypeTestCachePtr cache =
-          static_cast<SubtypeTestCachePtr>(LOAD_CONSTANT(rE));
-
-      if (!AssertAssignable(thread, pc, FP, SP, args, cache)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    SP -= 4;  // Instance remains on stack.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertSubtype, 0);
-    ObjectPtr* args = SP - 4;
-
-    // TODO(kustermann): Implement fast case for common arguments.
-
-    // The arguments on the stack look like:
-    //     args[0]  instantiator type args
-    //     args[1]  function type args
-    //     args[2]  sub_type
-    //     args[3]  super_type
-    //     args[4]  name
-
-    // This is unused, since the negative case throws an exception.
-    SP++;
-    ObjectPtr* result_slot = SP;
-
-    Exit(thread, FP, SP + 1, pc);
-    INVOKE_RUNTIME(DRT_SubtypeCheck,
-                   NativeArguments(thread, 5, args, result_slot));
-
-    // Drop result slot and all arguments.
-    SP -= 6;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AssertBoolean, A);
-    ObjectPtr value = SP[0];
-    if (rA != 0u) {  // Should we perform type check?
-      if ((value == true_value) || (value == false_value)) {
-        goto AssertBooleanOk;
-      }
-    } else if (value != null_value) {
-      goto AssertBooleanOk;
-    }
-
-    // Assertion failed.
-    {
-      SP[1] = SP[0];  // instance
-      Exit(thread, FP, SP + 2, pc);
-      INVOKE_RUNTIME(DRT_NonBoolTypeError,
-                     NativeArguments(thread, 1, SP + 1, SP));
-    }
-
-  AssertBooleanOk:
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(Jump, T);
-    LOAD_JUMP_TARGET();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNoAsserts, T);
-    if (!thread->isolate()->asserts()) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNotZeroTypeArgs, T);
-    if (InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) != 0) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfEqStrict, T);
-    SP -= 2;
-    if (SP[1] == SP[2]) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNeStrict, T);
-    SP -= 2;
-    if (SP[1] != SP[2]) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfTrue, T);
-    SP -= 1;
-    if (SP[1] == true_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfFalse, T);
-    SP -= 1;
-    if (SP[1] == false_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNull, T);
-    SP -= 1;
-    if (SP[1] == null_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfNotNull, T);
-    SP -= 1;
-    if (SP[1] != null_value) {
-      LOAD_JUMP_TARGET();
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(JumpIfUnchecked, T);
-    // Interpreter is not tracking unchecked calls, so fall through to
-    // parameter type checks.
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(StoreIndexedTOS, 0);
-    SP -= 3;
-    ArrayPtr array = RAW_CAST(Array, SP[1]);
-    SmiPtr index = RAW_CAST(Smi, SP[2]);
-    ObjectPtr value = SP[3];
-    ASSERT(InterpreterHelpers::CheckIndex(index, array->ptr()->length_));
-    array->ptr()->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                               thread);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(EqualsNull, 0);
-    DEBUG_CHECK;
-    SP[0] = (SP[0] == null_value) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NullCheck, D);
-
-    if (UNLIKELY(SP[0] == null_value)) {
-      // Load selector.
-      SP[0] = LOAD_CONSTANT(rD);
-      goto ThrowNullError;
-    }
-    SP -= 1;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NegateInt, 0);
-    DEBUG_CHECK;
-    UNBOX_INT64(value, SP[0], Symbols::UnaryMinus());
-    int64_t result = Utils::SubWithWrapAround(0, value);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AddInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Plus());
-    UNBOX_INT64(b, SP[1], Symbols::Plus());
-    int64_t result = Utils::AddWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SubInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Minus());
-    UNBOX_INT64(b, SP[1], Symbols::Minus());
-    int64_t result = Utils::SubWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MulInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Star());
-    UNBOX_INT64(b, SP[1], Symbols::Star());
-    int64_t result = Utils::MulWithWrapAround(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(TruncDivInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::TruncDivOperator());
-    UNBOX_INT64(b, SP[1], Symbols::TruncDivOperator());
-    if (UNLIKELY(b == 0)) {
-      goto ThrowIntegerDivisionByZeroException;
-    }
-    int64_t result;
-    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
-      result = Mint::kMinValue;
-    } else {
-      result = a / b;
-    }
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ModInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Percent());
-    UNBOX_INT64(b, SP[1], Symbols::Percent());
-    if (UNLIKELY(b == 0)) {
-      goto ThrowIntegerDivisionByZeroException;
-    }
-    int64_t result;
-    if (UNLIKELY((a == Mint::kMinValue) && (b == -1))) {
-      result = 0;
-    } else {
-      result = a % b;
-      if (result < 0) {
-        if (b < 0) {
-          result -= b;
-        } else {
-          result += b;
-        }
-      }
-    }
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitAndInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Ampersand());
-    UNBOX_INT64(b, SP[1], Symbols::Ampersand());
-    int64_t result = a & b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitOrInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::BitOr());
-    UNBOX_INT64(b, SP[1], Symbols::BitOr());
-    int64_t result = a | b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(BitXorInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::Caret());
-    UNBOX_INT64(b, SP[1], Symbols::Caret());
-    int64_t result = a ^ b;
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ShlInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LeftShiftOperator());
-    UNBOX_INT64(b, SP[1], Symbols::LeftShiftOperator());
-    if (b < 0) {
-      SP[0] = SP[1];
-      goto ThrowArgumentError;
-    }
-    int64_t result = Utils::ShiftLeftWithTruncation(a, b);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(ShrInt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::RightShiftOperator());
-    UNBOX_INT64(b, SP[1], Symbols::RightShiftOperator());
-    if (b < 0) {
-      SP[0] = SP[1];
-      goto ThrowArgumentError;
-    }
-    int64_t result = a >> Utils::Minimum<int64_t>(b, Mint::kBits);
-    BOX_INT64_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntEq, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    if (SP[0] == SP[1]) {
-      SP[0] = true_value;
-    } else if (!SP[0]->IsHeapObject() || !SP[1]->IsHeapObject() ||
-               (SP[0] == null_value) || (SP[1] == null_value)) {
-      SP[0] = false_value;
-    } else {
-      int64_t a = Integer::GetInt64Value(RAW_CAST(Integer, SP[0]));
-      int64_t b = Integer::GetInt64Value(RAW_CAST(Integer, SP[1]));
-      SP[0] = (a == b) ? true_value : false_value;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntGt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::RAngleBracket());
-    UNBOX_INT64(b, SP[1], Symbols::RAngleBracket());
-    SP[0] = (a > b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntLt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LAngleBracket());
-    UNBOX_INT64(b, SP[1], Symbols::LAngleBracket());
-    SP[0] = (a < b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntGe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::GreaterEqualOperator());
-    UNBOX_INT64(b, SP[1], Symbols::GreaterEqualOperator());
-    SP[0] = (a >= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareIntLe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_INT64(a, SP[0], Symbols::LessEqualOperator());
-    UNBOX_INT64(b, SP[1], Symbols::LessEqualOperator());
-    SP[0] = (a <= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(NegateDouble, 0);
-    DEBUG_CHECK;
-    UNBOX_DOUBLE(value, SP[0], Symbols::UnaryMinus());
-    double result = -value;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AddDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Plus());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Plus());
-    double result = a + b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(SubDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Minus());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Minus());
-    double result = a - b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(MulDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Star());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Star());
-    double result = a * b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(DivDouble, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::Slash());
-    UNBOX_DOUBLE(b, SP[1], Symbols::Slash());
-    double result = a / b;
-    BOX_DOUBLE_RESULT(result);
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleEq, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    if ((SP[0] == null_value) || (SP[1] == null_value)) {
-      SP[0] = (SP[0] == SP[1]) ? true_value : false_value;
-    } else {
-      double a = Double::RawCast(SP[0])->ptr()->value_;
-      double b = Double::RawCast(SP[1])->ptr()->value_;
-      SP[0] = (a == b) ? true_value : false_value;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleGt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::RAngleBracket());
-    UNBOX_DOUBLE(b, SP[1], Symbols::RAngleBracket());
-    SP[0] = (a > b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleLt, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::LAngleBracket());
-    UNBOX_DOUBLE(b, SP[1], Symbols::LAngleBracket());
-    SP[0] = (a < b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleGe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::GreaterEqualOperator());
-    UNBOX_DOUBLE(b, SP[1], Symbols::GreaterEqualOperator());
-    SP[0] = (a >= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(CompareDoubleLe, 0);
-    DEBUG_CHECK;
-    SP -= 1;
-    UNBOX_DOUBLE(a, SP[0], Symbols::LessEqualOperator());
-    UNBOX_DOUBLE(b, SP[1], Symbols::LessEqualOperator());
-    SP[0] = (a <= b) ? true_value : false_value;
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(AllocateClosure, D);
-    ++SP;
-    if (!AllocateClosure(thread, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE_ENTRY_LABEL(Trap);
-
-#define UNIMPLEMENTED_LABEL_ORDN(Name)
-#define UNIMPLEMENTED_LABEL_WIDE(Name)
-#define UNIMPLEMENTED_LABEL_RESV(Name) BYTECODE_ENTRY_LABEL(Name)
-#define UNIMPLEMENTED_LABEL(name, encoding, kind, op1, op2, op3)               \
-  UNIMPLEMENTED_LABEL_##kind(name)
-
-    KERNEL_BYTECODES_LIST(UNIMPLEMENTED_LABEL)
-
-#undef UNIMPLEMENTED_LABEL_ORDN
-#undef UNIMPLEMENTED_LABEL_WIDE
-#undef UNIMPLEMENTED_LABEL_RESV
-#undef UNIMPLEMENTED_LABEL
-
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitGetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitGetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-
-    const intptr_t kArgc = 1;
-    InstancePtr instance =
-        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    InstancePtr value =
-        reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-
-    if (UNLIKELY(value == Object::sentinel().raw())) {
-      SP[1] = 0;  // Result slot.
-      SP[2] = instance;
-      SP[3] = field;
-      Exit(thread, FP, SP + 4, pc);
-      INVOKE_RUNTIME(
-          DRT_InitInstanceField,
-          NativeArguments(thread, 2, /* argv */ SP + 2, /* ret val */ SP + 1));
-
-      function = FrameFunction(FP);
-      instance = static_cast<InstancePtr>(SP[2]);
-      field = static_cast<FieldPtr>(SP[3]);
-      offset_in_words = Smi::Value(field->ptr()->host_offset_or_field_id_);
-      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-    }
-
-    *++SP = value;
-
-#if !defined(PRODUCT)
-    if (UNLIKELY(Field::NeedsLoadGuardBit::decode(field->ptr()->kind_bits_))) {
-      if (!AssertAssignableField<true>(thread, pc, FP, SP, instance, field,
-                                       value)) {
-        HANDLE_EXCEPTION;
-      }
-      // Reload objects after the call which may trigger GC.
-      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-      value = reinterpret_cast<InstancePtr*>(instance->ptr())[offset_in_words];
-    }
-#endif
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      ASSERT(FlowGraphCompiler::SupportsUnboxedDoubles());
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      // AllocateDouble places result at SP[0]
-      if (!AllocateDouble(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      // AllocateFloat32x4 places result at SP[0]
-      if (!AllocateFloat32x4(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      // AllocateFloat64x2 places result at SP[0]
-      if (!AllocateFloat64x2(thread, raw_value, pc, FP, SP)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitSetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitSetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t offset_in_words =
-        Smi::Value(field->ptr()->host_offset_or_field_id_);
-    const intptr_t kArgc = 2;
-    InstancePtr instance =
-        static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    InstancePtr value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-
-    if (!AssertAssignableField<false>(thread, pc, FP, SP, instance, field,
-                                      value)) {
-      HANDLE_EXCEPTION;
-    }
-    // Reload objects after the call which may trigger GC.
-    field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-    instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-    value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-
-    if (InterpreterHelpers::FieldNeedsGuardUpdate(field, value)) {
-      SP[1] = 0;  // Unused result of runtime call.
-      SP[2] = field;
-      SP[3] = value;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid,
-                         NativeArguments(thread, 2, /* argv */ SP + 2,
-                                         /* retval */ SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Reload objects after the call which may trigger GC.
-      field = static_cast<FieldPtr>(FrameFunction(FP)->ptr()->data_);
-      instance = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[0]);
-      value = static_cast<InstancePtr>(FrameArguments(FP, kArgc)[1]);
-    }
-
-    const bool unboxing =
-        (field->ptr()->is_nullable_ != kNullCid) &&
-        Field::UnboxingCandidateBit::decode(field->ptr()->kind_bits_);
-    classid_t guarded_cid = field->ptr()->guarded_cid_;
-    if (unboxing && (guarded_cid == kDoubleCid) && supports_unboxed_doubles_) {
-      double raw_value = Double::RawCast(value)->ptr()->value_;
-      DoublePtr box =
-          *(reinterpret_cast<DoublePtr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      box->ptr()->value_ = raw_value;
-    } else if (unboxing && (guarded_cid == kFloat32x4Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float32x4::RawCast(value)->ptr()->value_);
-      Float32x4Ptr box =
-          *(reinterpret_cast<Float32x4Ptr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      raw_value.writeTo(box->ptr()->value_);
-    } else if (unboxing && (guarded_cid == kFloat64x2Cid) &&
-               supports_unboxed_simd128_) {
-      simd128_value_t raw_value;
-      raw_value.readFrom(Float64x2::RawCast(value)->ptr()->value_);
-      Float64x2Ptr box =
-          *(reinterpret_cast<Float64x2Ptr*>(instance->ptr()) + offset_in_words);
-      ASSERT(box != null_value);  // Non-initializing store.
-      raw_value.writeTo(box->ptr()->value_);
-    } else {
-      instance->ptr()->StorePointer(
-          reinterpret_cast<InstancePtr*>(instance->ptr()) + offset_in_words,
-          value, thread);
-    }
-
-    *++SP = null_value;
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitStaticGetter, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kImplicitStaticGetter);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    // Field object is cached in function's data_.
-    FieldPtr field = static_cast<FieldPtr>(function->ptr()->data_);
-    intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-    InstancePtr value = thread->field_table_values()[field_id];
-    if (value == Object::sentinel().raw() ||
-        value == Object::transition_sentinel().raw()) {
-      SP[1] = 0;  // Unused result of invoking the initializer.
-      SP[2] = field;
-      Exit(thread, FP, SP + 3, pc);
-      INVOKE_RUNTIME(DRT_InitStaticField,
-                     NativeArguments(thread, 1, SP + 2, SP + 1));
-
-      // Reload objects after the call which may trigger GC.
-      function = FrameFunction(FP);
-      field = static_cast<FieldPtr>(function->ptr()->data_);
-      // The field is initialized by the runtime call, but not returned.
-      intptr_t field_id = Smi::Value(field->ptr()->host_offset_or_field_id_);
-      value = thread->field_table_values()[field_id];
-    }
-
-    // Field was initialized. Return its value.
-    *++SP = value;
-
-#if !defined(PRODUCT)
-    if (UNLIKELY(Field::NeedsLoadGuardBit::decode(field->ptr()->kind_bits_))) {
-      if (!AssertAssignableField<true>(thread, pc, FP, SP,
-                                       static_cast<InstancePtr>(null_value),
-                                       field, value)) {
-        HANDLE_EXCEPTION;
-      }
-    }
-#endif
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_MethodExtractor, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kMethodExtractor);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    ASSERT(InterpreterHelpers::ArgDescTypeArgsLen(argdesc_) == 0);
-
-    ++SP;
-    if (!AllocateClosure(thread, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-
-    ++SP;
-    if (!AllocateContext(thread, 1, pc, FP, SP)) {
-      HANDLE_EXCEPTION;
-    }
-
-    ContextPtr context = Context::RawCast(*SP--);
-    InstancePtr instance = Instance::RawCast(FrameArguments(FP, 1)[0]);
-    context->ptr()->StorePointer(
-        reinterpret_cast<InstancePtr*>(&context->ptr()->data()[0]), instance);
-
-    ClosurePtr closure = Closure::RawCast(*SP);
-    closure->ptr()->StorePointer(
-        &closure->ptr()->instantiator_type_arguments_,
-        InterpreterHelpers::GetTypeArguments(thread, instance));
-    // function_type_arguments_ is already null
-    closure->ptr()->delayed_type_arguments_ =
-        Object::empty_type_arguments().raw();
-    closure->ptr()->StorePointer(
-        &closure->ptr()->function_,
-        Function::RawCast(FrameFunction(FP)->ptr()->data_));
-    closure->ptr()->StorePointer(&closure->ptr()->context_, context);
-    // hash_ is already null
-
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_InvokeClosure, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
-    const bool is_dynamic_call =
-        Function::IsDynamicInvocationForwarderName(function->ptr()->name_);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-
-    ClosurePtr receiver =
-        Closure::RawCast(FrameArguments(FP, argc)[receiver_idx]);
-    SP[1] = receiver->ptr()->function_;
-
-    if (is_dynamic_call) {
-      {
-        SP[2] = null_value;
-        SP[3] = receiver;
-        SP[4] = argdesc_;
-        Exit(thread, FP, SP + 5, pc);
-        if (!InvokeRuntime(thread, this, DRT_ClosureArgumentsValid,
-                           NativeArguments(thread, 2, SP + 3, SP + 2))) {
-          HANDLE_EXCEPTION;
-        }
-        receiver = Closure::RawCast(SP[3]);
-        argdesc_ = Array::RawCast(SP[4]);
-      }
-
-      if (SP[2] != Bool::True().raw()) {
-        goto NoSuchMethodFromPrologue;
-      }
-
-      // TODO(dartbug.com/40813): Move other checks that are currently
-      // compiled in the closure body to here as they are also moved to
-      // FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher.
-    }
-
-    goto TailCallSP1;
-  }
-
-  {
-    BYTECODE(VMInternal_InvokeField, 0);
-
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kInvokeFieldDispatcher);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ObjectPtr receiver = FrameArguments(FP, argc)[receiver_idx];
-
-    // Possibly demangle field name and invoke field getter on receiver.
-    {
-      SP[1] = argdesc_;                // Save argdesc_.
-      SP[2] = 0;                       // Result of runtime call.
-      SP[3] = receiver;                // Receiver.
-      SP[4] = function->ptr()->name_;  // Field name (may change during call).
-      Exit(thread, FP, SP + 5, pc);
-      if (!InvokeRuntime(thread, this, DRT_GetFieldForDispatch,
-                         NativeArguments(thread, 2, SP + 3, SP + 2))) {
-        HANDLE_EXCEPTION;
-      }
-      function = FrameFunction(FP);
-      argdesc_ = Array::RawCast(SP[1]);
-    }
-
-    // If the field name in the arguments is different after the call, then
-    // this was a dynamic call.
-    StringPtr field_name = String::RawCast(SP[4]);
-    const bool is_dynamic_call = function->ptr()->name_ != field_name;
-
-    // Replace receiver with field value, keep all other arguments, and
-    // invoke 'call' function, or if not found, invoke noSuchMethod.
-    FrameArguments(FP, argc)[receiver_idx] = receiver = SP[2];
-
-    // If the field value is a closure, no need to resolve 'call' function.
-    if (InterpreterHelpers::GetClassId(receiver) == kClosureCid) {
-      SP[1] = Closure::RawCast(receiver)->ptr()->function_;
-
-      if (is_dynamic_call) {
-        {
-          SP[2] = null_value;
-          SP[3] = receiver;
-          SP[4] = argdesc_;
-          Exit(thread, FP, SP + 5, pc);
-          if (!InvokeRuntime(thread, this, DRT_ClosureArgumentsValid,
-                             NativeArguments(thread, 2, SP + 3, SP + 2))) {
-            HANDLE_EXCEPTION;
-          }
-          receiver = SP[3];
-          argdesc_ = Array::RawCast(SP[4]);
-        }
-
-        if (SP[2] != Bool::True().raw()) {
-          goto NoSuchMethodFromPrologue;
-        }
-
-        // TODO(dartbug.com/40813): Move other checks that are currently
-        // compiled in the closure body to here as they are also moved to
-        // FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher.
-      }
-
-      goto TailCallSP1;
-    }
-
-    // Otherwise, call runtime to resolve 'call' function.
-    {
-      SP[1] = 0;  // Result slot.
-      SP[2] = receiver;
-      SP[3] = argdesc_;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_ResolveCallFunction,
-                         NativeArguments(thread, 2, SP + 2, SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-      argdesc_ = Array::RawCast(SP[3]);
-      function = Function::RawCast(SP[1]);
-      receiver = SP[2];
-    }
-
-    if (function != Function::null()) {
-      SP[1] = function;
-      goto TailCallSP1;
-    }
-
-    // Function 'call' could not be resolved for argdesc_.
-    // Invoke noSuchMethod.
-    SP[1] = null_value;
-    SP[2] = receiver;
-    SP[3] = Symbols::Call().raw();  // We failed to resolve the 'call' function.
-    SP[4] = argdesc_;
-    SP[5] = null_value;  // Array of arguments (will be filled).
-
-    // Allocate array of arguments.
-    {
-      SP[6] = Smi::New(argc);  // length
-      SP[7] = null_value;      // type
-      Exit(thread, FP, SP + 8, pc);
-      if (!InvokeRuntime(thread, this, DRT_AllocateArray,
-                         NativeArguments(thread, 2, SP + 6, SP + 5))) {
-        HANDLE_EXCEPTION;
-      }
-    }
-
-    // Copy arguments into the newly allocated array.
-    ObjectPtr* argv = FrameArguments(FP, argc);
-    ArrayPtr array = static_cast<ArrayPtr>(SP[5]);
-    ASSERT(array->GetClassId() == kArrayCid);
-    for (intptr_t i = 0; i < argc; i++) {
-      array->ptr()->data()[i] = argv[i];
-    }
-
-    // Invoke noSuchMethod passing down receiver, target name, argument
-    // descriptor, and array of arguments.
-    {
-      Exit(thread, FP, SP + 6, pc);
-      if (!InvokeRuntime(thread, this, DRT_InvokeNoSuchMethod,
-                         NativeArguments(thread, 4, SP + 2, SP + 1))) {
-        HANDLE_EXCEPTION;
-      }
-
-      ++SP;  // Result at SP[0]
-    }
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ForwardDynamicInvocation, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kDynamicInvocationForwarder);
-
-    BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
-    ArrayPtr checks = Array::RawCast(function->ptr()->data_);
-    FunctionPtr target = Function::RawCast(checks->ptr()->data()[0]);
-    ASSERT(Function::kind(target) !=
-           FunctionLayout::kDynamicInvocationForwarder);
-    BytecodePtr target_bytecode = target->ptr()->bytecode_;
-    ASSERT(target_bytecode != Bytecode::null());
-    ASSERT(target_bytecode->IsBytecode());
-
-    const KBCInstr* pc2 = reinterpret_cast<const KBCInstr*>(
-        target_bytecode->ptr()->instructions_);
-    if (KernelBytecode::IsEntryOptionalOpcode(pc2)) {
-      pp_ = target_bytecode->ptr()->object_pool_;
-      uint32_t rA, rB, rC;
-      rA = KernelBytecode::DecodeA(pc2);
-      rB = KernelBytecode::DecodeB(pc2);
-      rC = KernelBytecode::DecodeC(pc2);
-      pc2 = KernelBytecode::Next(pc2);
-      if (!CopyParameters(thread, &pc2, &FP, &SP, rA, rB, rC)) {
-        SP[1] = function;
-        goto NoSuchMethodFromPrologue;
-      }
-    }
-
-    intptr_t len = Smi::Value(checks->ptr()->length_);
-    SP[1] = checks;
-    SP[2] = argdesc_;
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-
-    InstancePtr receiver =
-        Instance::RawCast(FrameArguments(FP, argc)[receiver_idx]);
-    SP[5] = InterpreterHelpers::GetTypeArguments(thread, receiver);
-
-    if (type_args_len > 0) {
-      SP[6] = FrameArguments(FP, argc)[0];
-    } else {
-      SP[6] = TypeArguments::RawCast(checks->ptr()->data()[1]);
-      // TODO(regis): Verify this condition; why test SP[6]?
-      if (SP[5] != null_value && SP[6] != null_value) {
-        SP[7] = SP[6];       // type_arguments
-        SP[8] = SP[5];       // instantiator_type_args
-        SP[9] = null_value;  // function_type_args
-        Exit(thread, FP, SP + 10, pc);
-        INVOKE_RUNTIME(DRT_InstantiateTypeArguments,
-                       NativeArguments(thread, 3, SP + 7, SP + 7));
-        SP[6] = SP[7];
-      }
-    }
-
-    for (intptr_t i = 2; i < len; i++) {
-      ParameterTypeCheckPtr check =
-          ParameterTypeCheck::RawCast(checks->ptr()->data()[i]);
-
-      if (LIKELY(check->ptr()->index_ != 0)) {
-        ASSERT(&FP[check->ptr()->index_] <= SP);
-        SP[3] = Instance::RawCast(FP[check->ptr()->index_]);
-        // TODO(regis): Revisit null handling once interpreter supports NNBD.
-        if (SP[3] == null_value) {
-          continue;  // Not handled by AssertAssignable for some reason...
-        }
-        SP[4] = check->ptr()->type_or_bound_;
-        // SP[5]: Instantiator type args.
-        // SP[6]: Function type args.
-        SP[7] = check->ptr()->name_;
-        if (!AssertAssignable(thread, pc, FP, SP + 7, SP + 3,
-                              check->ptr()->cache_)) {
-          HANDLE_EXCEPTION;
-        }
-      } else {
-        SP[3] = 0;
-        SP[4] = 0;
-        // SP[5]: Instantiator type args.
-        // SP[6]: Function type args.
-        SP[7] = check->ptr()->param_;
-        SP[8] = check->ptr()->type_or_bound_;
-        SP[9] = check->ptr()->name_;
-        SP[10] = 0;
-        Exit(thread, FP, SP + 11, pc);
-        INVOKE_RUNTIME(DRT_SubtypeCheck,
-                       NativeArguments(thread, 5, SP + 5, SP + 10));
-      }
-
-      checks = Array::RawCast(SP[1]);  // Reload after runtime call.
-    }
-
-    target = Function::RawCast(checks->ptr()->data()[0]);
-    argdesc_ = Array::RawCast(SP[2]);
-
-    SP = FP - 1;  // Unmarshall optional parameters.
-
-    SP[1] = target;
-    goto TailCallSP1;
-  }
-
-  {
-    BYTECODE(VMInternal_NoSuchMethodDispatcher, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) == FunctionLayout::kNoSuchMethodDispatcher);
-    SP[1] = function;
-    goto NoSuchMethodFromPrologue;
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitStaticClosure, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kImplicitClosureFunction);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-    BYTECODE(VMInternal_ImplicitInstanceClosure, 0);
-    FunctionPtr function = FrameFunction(FP);
-    ASSERT(Function::kind(function) ==
-           FunctionLayout::kImplicitClosureFunction);
-    UNIMPLEMENTED();
-    DISPATCH();
-  }
-
-  {
-  TailCallSP1:
-    FunctionPtr function = Function::RawCast(SP[1]);
-
-    for (;;) {
-      if (Function::HasBytecode(function)) {
-        ASSERT(function->IsFunction());
-        BytecodePtr bytecode = function->ptr()->bytecode_;
-        ASSERT(bytecode->IsBytecode());
-        FP[kKBCFunctionSlotFromFp] = function;
-        FP[kKBCPcMarkerSlotFromFp] = bytecode;
-        pp_ = bytecode->ptr()->object_pool_;
-        pc = reinterpret_cast<const KBCInstr*>(bytecode->ptr()->instructions_);
-        NOT_IN_PRODUCT(pc_ = pc);  // For the profiler.
-        DISPATCH();
-      }
-
-      if (Function::HasCode(function)) {
-        const intptr_t type_args_len =
-            InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-        const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-        const intptr_t argc =
-            InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-        ObjectPtr* argv = FrameArguments(FP, argc);
-        for (intptr_t i = 0; i < argc; i++) {
-          *++SP = argv[i];
-        }
-
-        ObjectPtr* call_base = SP - argc + 1;
-        ObjectPtr* call_top = SP + 1;
-        call_top[0] = function;
-        if (!InvokeCompiled(thread, function, call_base, call_top, &pc, &FP,
-                            &SP)) {
-          HANDLE_EXCEPTION;
-        } else {
-          HANDLE_RETURN;
-        }
-        DISPATCH();
-      }
-
-      // Compile the function to either generate code or load bytecode.
-      SP[1] = argdesc_;
-      SP[2] = 0;  // Code result.
-      SP[3] = function;
-      Exit(thread, FP, SP + 4, pc);
-      if (!InvokeRuntime(thread, this, DRT_CompileFunction,
-                         NativeArguments(thread, 1, /* argv */ SP + 3,
-                                         /* retval */ SP + 2))) {
-        HANDLE_EXCEPTION;
-      }
-      function = Function::RawCast(SP[3]);
-      argdesc_ = Array::RawCast(SP[1]);
-
-      ASSERT(Function::HasCode(function) || Function::HasBytecode(function));
-    }
-  }
-
-  // Helper used to handle noSuchMethod on closures. The function should be
-  // placed into SP[1] before jumping here, similar to TailCallSP1.
-  {
-  NoSuchMethodFromPrologue:
-    FunctionPtr function = Function::RawCast(SP[1]);
-
-    const intptr_t type_args_len =
-        InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
-    const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
-    const intptr_t argc =
-        InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-    ObjectPtr* args = FrameArguments(FP, argc);
-
-    SP[1] = null_value;
-    SP[2] = args[receiver_idx];
-    SP[3] = function;
-    SP[4] = argdesc_;
-    SP[5] = null_value;  // Array of arguments (will be filled).
-
-    // Allocate array of arguments.
-    {
-      SP[6] = Smi::New(argc);  // length
-      SP[7] = null_value;      // type
-      Exit(thread, FP, SP + 8, pc);
-      if (!InvokeRuntime(thread, this, DRT_AllocateArray,
-                         NativeArguments(thread, 2, SP + 6, SP + 5))) {
-        HANDLE_EXCEPTION;
-      }
-
-      // Copy arguments into the newly allocated array.
-      ArrayPtr array = static_cast<ArrayPtr>(SP[5]);
-      ASSERT(array->GetClassId() == kArrayCid);
-      for (intptr_t i = 0; i < argc; i++) {
-        array->ptr()->data()[i] = args[i];
-      }
-    }
-
-    // Invoke noSuchMethod passing down receiver, function, argument descriptor
-    // and array of arguments.
-    {
-      Exit(thread, FP, SP + 6, pc);
-      INVOKE_RUNTIME(DRT_NoSuchMethodFromPrologue,
-                     NativeArguments(thread, 4, SP + 2, SP + 1));
-      ++SP;  // Result at SP[0]
-    }
-
-    DISPATCH();
-  }
-
-  {
-  ThrowNullError:
-    // SP[0] contains selector.
-    SP[1] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 2, pc);
-    INVOKE_RUNTIME(DRT_NullErrorWithSelector,
-                   NativeArguments(thread, 1, SP, SP + 1));
-    UNREACHABLE();
-  }
-
-  {
-  ThrowIntegerDivisionByZeroException:
-    SP[0] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 1, pc);
-    INVOKE_RUNTIME(DRT_IntegerDivisionByZeroException,
-                   NativeArguments(thread, 0, SP, SP));
-    UNREACHABLE();
-  }
-
-  {
-  ThrowArgumentError:
-    // SP[0] contains value.
-    SP[1] = 0;  // Unused space for result.
-    Exit(thread, FP, SP + 2, pc);
-    INVOKE_RUNTIME(DRT_ArgumentError, NativeArguments(thread, 1, SP, SP + 1));
-    UNREACHABLE();
-  }
-
-  // Exception handling helper. Gets handler FP and PC from the Interpreter
-  // where they were stored by Interpreter::Longjmp and proceeds to execute the
-  // handler. Corner case: handler PC can be a fake marker that marks entry
-  // frame, which means exception was not handled in the interpreter. In this
-  // case we return the caught exception from Interpreter::Call.
-  {
-  HandleException:
-    FP = fp_;
-    pc = pc_;
-    if (IsEntryFrameMarker(pc)) {
-      pp_ = static_cast<ObjectPoolPtr>(fp_[kKBCSavedPpSlotFromEntryFp]);
-      argdesc_ = static_cast<ArrayPtr>(fp_[kKBCSavedArgDescSlotFromEntryFp]);
-      uword exit_fp = static_cast<uword>(fp_[kKBCExitLinkSlotFromEntryFp]);
-      thread->set_top_exit_frame_info(exit_fp);
-      thread->set_top_resource(top_resource);
-      thread->set_vm_tag(vm_tag);
-#if defined(DEBUG)
-      if (IsTracingExecution()) {
-        THR_Print("%" Pu64 " ", icount_);
-        THR_Print("Returning exception from interpreter 0x%" Px " at fp_ 0x%" Px
-                  " exit 0x%" Px "\n",
-                  reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
-                  exit_fp);
-      }
-#endif
-      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
-      return special_[KernelBytecode::kExceptionSpecialIndex];
-    }
-
-    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
-    DISPATCH();
-  }
-
-  UNREACHABLE();
-  return 0;
-}
-
-void Interpreter::JumpToFrame(uword pc, uword sp, uword fp, Thread* thread) {
-  // Walk over all setjmp buffers (simulated --> C++ transitions)
-  // and try to find the setjmp associated with the simulated frame pointer.
-  InterpreterSetjmpBuffer* buf = last_setjmp_buffer();
-  while ((buf->link() != NULL) && (buf->link()->fp() > fp)) {
-    buf = buf->link();
-  }
-  ASSERT(buf != NULL);
-  ASSERT(last_setjmp_buffer() == buf);
-
-  // The C++ caller has not cleaned up the stack memory of C++ frames.
-  // Prepare for unwinding frames by destroying all the stack resources
-  // in the previous C++ frames.
-  StackResource::Unwind(thread);
-
-  fp_ = reinterpret_cast<ObjectPtr*>(fp);
-
-  if (pc == StubCode::RunExceptionHandler().EntryPoint()) {
-    // The RunExceptionHandler stub is a placeholder.  We implement
-    // its behavior here.
-    ObjectPtr raw_exception = thread->active_exception();
-    ObjectPtr raw_stacktrace = thread->active_stacktrace();
-    ASSERT(raw_exception != Object::null());
-    thread->set_active_exception(Object::null_object());
-    thread->set_active_stacktrace(Object::null_object());
-    special_[KernelBytecode::kExceptionSpecialIndex] = raw_exception;
-    special_[KernelBytecode::kStackTraceSpecialIndex] = raw_stacktrace;
-    pc_ = reinterpret_cast<const KBCInstr*>(thread->resume_pc());
-  } else {
-    pc_ = reinterpret_cast<const KBCInstr*>(pc);
-  }
-
-  // Set the tag.
-  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
-  // Clear top exit frame.
-  thread->set_top_exit_frame_info(0);
-
-  buf->Longjmp();
-  UNREACHABLE();
-}
-
-void Interpreter::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&pp_));
-  visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&argdesc_));
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
deleted file mode 100644
index bc76fc9..0000000
--- a/runtime/vm/interpreter.h
+++ /dev/null
@@ -1,281 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_INTERPRETER_H_
-#define RUNTIME_VM_INTERPRETER_H_
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME)
-
-#include "vm/compiler/method_recognizer.h"
-#include "vm/constants_kbc.h"
-#include "vm/tagged_pointer.h"
-
-namespace dart {
-
-class Array;
-class Code;
-class InterpreterSetjmpBuffer;
-class Isolate;
-class ObjectPointerVisitor;
-class Thread;
-
-class LookupCache : public ValueObject {
- public:
-  LookupCache() {
-    ASSERT(Utils::IsPowerOfTwo(sizeof(Entry)));
-    ASSERT(Utils::IsPowerOfTwo(sizeof(kNumEntries)));
-    Clear();
-  }
-
-  void Clear();
-  bool Lookup(intptr_t receiver_cid,
-              StringPtr function_name,
-              ArrayPtr arguments_descriptor,
-              FunctionPtr* target) const;
-  void Insert(intptr_t receiver_cid,
-              StringPtr function_name,
-              ArrayPtr arguments_descriptor,
-              FunctionPtr target);
-
- private:
-  struct Entry {
-    intptr_t receiver_cid;
-    StringPtr function_name;
-    ArrayPtr arguments_descriptor;
-    FunctionPtr target;
-  };
-
-  static const intptr_t kNumEntries = 1024;
-  static const intptr_t kTableMask = kNumEntries - 1;
-
-  Entry entries_[kNumEntries];
-};
-
-// Interpreter intrinsic handler. It is invoked on entry to the intrinsified
-// function via Intrinsic bytecode before the frame is setup.
-// If the handler returns true then Intrinsic bytecode works as a return
-// instruction returning the value in result. Otherwise interpreter proceeds to
-// execute the body of the function.
-typedef bool (*IntrinsicHandler)(Thread* thread,
-                                 ObjectPtr* FP,
-                                 ObjectPtr* result);
-
-class Interpreter {
- public:
-  static const uword kInterpreterStackUnderflowSize = 0x80;
-  // The entry frame pc marker must be non-zero (a valid exception handler pc).
-  static const word kEntryFramePcMarker = -1;
-
-  Interpreter();
-  ~Interpreter();
-
-  // The currently executing Interpreter instance, which is associated to the
-  // current isolate
-  static Interpreter* Current();
-
-  // Low address (KBC stack grows up).
-  uword stack_base() const { return stack_base_; }
-  // Limit for StackOverflowError.
-  uword overflow_stack_limit() const { return overflow_stack_limit_; }
-  // High address (KBC stack grows up).
-  uword stack_limit() const { return stack_limit_; }
-
-  // Returns true if the interpreter's stack contains the given frame.
-  // TODO(regis): We should rely on a new thread vm_tag to identify an
-  // interpreter frame and not need this HasFrame() method.
-  bool HasFrame(uword frame) const {
-    return frame >= stack_base() && frame < stack_limit();
-  }
-
-  // Identify an entry frame by looking at its pc marker value.
-  static bool IsEntryFrameMarker(const KBCInstr* pc) {
-    return reinterpret_cast<word>(pc) == kEntryFramePcMarker;
-  }
-
-  ObjectPtr Call(const Function& function,
-                 const Array& arguments_descriptor,
-                 const Array& arguments,
-                 Thread* thread);
-
-  ObjectPtr Call(FunctionPtr function,
-                 ArrayPtr argdesc,
-                 intptr_t argc,
-                 ObjectPtr const* argv,
-                 Thread* thread);
-
-  void JumpToFrame(uword pc, uword sp, uword fp, Thread* thread);
-
-  uword get_sp() const { return reinterpret_cast<uword>(fp_); }  // Yes, fp_.
-  uword get_fp() const { return reinterpret_cast<uword>(fp_); }
-  uword get_pc() const { return reinterpret_cast<uword>(pc_); }
-
-  void Unexit(Thread* thread);
-
-  void VisitObjectPointers(ObjectPointerVisitor* visitor);
-  void ClearLookupCache() { lookup_cache_.Clear(); }
-
-#ifndef PRODUCT
-  void set_is_debugging(bool value) { is_debugging_ = value; }
-  bool is_debugging() const { return is_debugging_; }
-#endif  // !PRODUCT
-
- private:
-  uintptr_t* stack_;
-  uword stack_base_;
-  uword overflow_stack_limit_;
-  uword stack_limit_;
-
-  ObjectPtr* volatile fp_;
-  const KBCInstr* volatile pc_;
-  DEBUG_ONLY(uint64_t icount_;)
-
-  InterpreterSetjmpBuffer* last_setjmp_buffer_;
-
-  ObjectPoolPtr pp_;  // Pool Pointer.
-  ArrayPtr argdesc_;  // Arguments Descriptor: used to pass information between
-                      // call instruction and the function entry.
-  ObjectPtr special_[KernelBytecode::kSpecialIndexCount];
-
-  LookupCache lookup_cache_;
-
-  void Exit(Thread* thread,
-            ObjectPtr* base,
-            ObjectPtr* exit_frame,
-            const KBCInstr* pc);
-
-  bool Invoke(Thread* thread,
-              ObjectPtr* call_base,
-              ObjectPtr* call_top,
-              const KBCInstr** pc,
-              ObjectPtr** FP,
-              ObjectPtr** SP);
-
-  bool InvokeCompiled(Thread* thread,
-                      FunctionPtr function,
-                      ObjectPtr* call_base,
-                      ObjectPtr* call_top,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP);
-
-  bool InvokeBytecode(Thread* thread,
-                      FunctionPtr function,
-                      ObjectPtr* call_base,
-                      ObjectPtr* call_top,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP);
-
-  bool InstanceCall(Thread* thread,
-                    StringPtr target_name,
-                    ObjectPtr* call_base,
-                    ObjectPtr* call_top,
-                    const KBCInstr** pc,
-                    ObjectPtr** FP,
-                    ObjectPtr** SP);
-
-  bool CopyParameters(Thread* thread,
-                      const KBCInstr** pc,
-                      ObjectPtr** FP,
-                      ObjectPtr** SP,
-                      const intptr_t num_fixed_params,
-                      const intptr_t num_opt_pos_params,
-                      const intptr_t num_opt_named_params);
-
-  bool AssertAssignable(Thread* thread,
-                        const KBCInstr* pc,
-                        ObjectPtr* FP,
-                        ObjectPtr* call_top,
-                        ObjectPtr* args,
-                        SubtypeTestCachePtr cache);
-  template <bool is_getter>
-  bool AssertAssignableField(Thread* thread,
-                             const KBCInstr* pc,
-                             ObjectPtr* FP,
-                             ObjectPtr* SP,
-                             InstancePtr instance,
-                             FieldPtr field,
-                             InstancePtr value);
-
-  bool AllocateMint(Thread* thread,
-                    int64_t value,
-                    const KBCInstr* pc,
-                    ObjectPtr* FP,
-                    ObjectPtr* SP);
-  bool AllocateDouble(Thread* thread,
-                      double value,
-                      const KBCInstr* pc,
-                      ObjectPtr* FP,
-                      ObjectPtr* SP);
-  bool AllocateFloat32x4(Thread* thread,
-                         simd128_value_t value,
-                         const KBCInstr* pc,
-                         ObjectPtr* FP,
-                         ObjectPtr* SP);
-  bool AllocateFloat64x2(Thread* thread,
-                         simd128_value_t value,
-                         const KBCInstr* pc,
-                         ObjectPtr* FP,
-                         ObjectPtr* SP);
-  bool AllocateArray(Thread* thread,
-                     TypeArgumentsPtr type_args,
-                     ObjectPtr length,
-                     const KBCInstr* pc,
-                     ObjectPtr* FP,
-                     ObjectPtr* SP);
-  bool AllocateContext(Thread* thread,
-                       intptr_t num_variables,
-                       const KBCInstr* pc,
-                       ObjectPtr* FP,
-                       ObjectPtr* SP);
-  bool AllocateClosure(Thread* thread,
-                       const KBCInstr* pc,
-                       ObjectPtr* FP,
-                       ObjectPtr* SP);
-
-#if defined(DEBUG)
-  // Returns true if tracing of executed instructions is enabled.
-  bool IsTracingExecution() const;
-
-  // Prints bytecode instruction at given pc for instruction tracing.
-  void TraceInstruction(const KBCInstr* pc) const;
-
-  bool IsWritingTraceFile() const;
-  void FlushTraceBuffer();
-  void WriteInstructionToTrace(const KBCInstr* pc);
-
-  void* trace_file_;
-  uint64_t trace_file_bytes_written_;
-
-  static const intptr_t kTraceBufferSizeInBytes = 10 * KB;
-  static const intptr_t kTraceBufferInstrs =
-      kTraceBufferSizeInBytes / sizeof(KBCInstr);
-  KBCInstr* trace_buffer_;
-  intptr_t trace_buffer_idx_;
-#endif  // defined(DEBUG)
-
-  // Longjmp support for exceptions.
-  InterpreterSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; }
-  void set_last_setjmp_buffer(InterpreterSetjmpBuffer* buffer) {
-    last_setjmp_buffer_ = buffer;
-  }
-
-#ifndef PRODUCT
-  bool is_debugging_ = false;
-#endif  // !PRODUCT
-
-  bool supports_unboxed_doubles_;
-  bool supports_unboxed_simd128_;
-
-  friend class InterpreterSetjmpBuffer;
-
-  DISALLOW_COPY_AND_ASSIGN(Interpreter);
-};
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-#endif  // RUNTIME_VM_INTERPRETER_H_
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 03f4c83..8b8bbc0 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -26,7 +26,6 @@
 #include "vm/heap/safepoint.h"
 #include "vm/heap/verifier.h"
 #include "vm/image_snapshot.h"
-#include "vm/interpreter.h"
 #include "vm/isolate_reload.h"
 #include "vm/kernel_isolate.h"
 #include "vm/lockers.h"
@@ -1681,10 +1680,6 @@
         "         See dartbug.com/30524 for more information.\n");
   }
 
-  if (FLAG_enable_interpreter) {
-    NOT_IN_PRECOMPILED(background_compiler_ = new BackgroundCompiler(
-                           this, /* optimizing = */ false));
-  }
   NOT_IN_PRECOMPILED(optimizing_background_compiler_ =
                          new BackgroundCompiler(this, /* optimizing = */ true));
 }
@@ -1698,11 +1693,6 @@
   // RELEASE_ASSERT(reload_context_ == NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
-  if (FLAG_enable_interpreter) {
-    delete background_compiler_;
-    background_compiler_ = nullptr;
-  }
-
   delete optimizing_background_compiler_;
   optimizing_background_compiler_ = nullptr;
 
@@ -2395,9 +2385,8 @@
     args.SetAt(2, Instance::Handle(state->BuildArgs(thread)));
     args.SetAt(3, Instance::Handle(state->BuildMessage(thread)));
     args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
-    args.SetAt(5, ReceivePort::Handle(
-                      ReceivePort::New(isolate->main_port(), String::Handle(),
-                                       true /* control port */)));
+    args.SetAt(5, ReceivePort::Handle(ReceivePort::New(
+                      isolate->main_port(), true /* control port */)));
     args.SetAt(6, capabilities);
 
     const Library& lib = Library::Handle(Library::IsolateLibrary());
@@ -2603,10 +2592,6 @@
 void Isolate::Shutdown() {
   ASSERT(this == Isolate::Current());
   BackgroundCompiler::Stop(this);
-  if (FLAG_enable_interpreter) {
-    delete background_compiler_;
-    background_compiler_ = nullptr;
-  }
   delete optimizing_background_compiler_;
   optimizing_background_compiler_ = nullptr;
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 68c72ed..0d3279d 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -18,7 +18,6 @@
 #include "platform/atomic.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
-#include "vm/constants_kbc.h"
 #include "vm/dispatch_table.h"
 #include "vm/exceptions.h"
 #include "vm/field_table.h"
@@ -56,9 +55,6 @@
 class HandleVisitor;
 class Heap;
 class ICData;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-class Interpreter;
-#endif
 class IsolateObjectStore;
 class IsolateProfilerData;
 class IsolateReloadContext;
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 005a2e9..f9e26a0 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -1221,7 +1221,7 @@
   Function& func = Function::Handle();
   while (it.HasNextFrame()) {
     StackFrame* frame = it.NextFrame();
-    if (frame->IsDartFrame() && !frame->is_interpreted()) {
+    if (frame->IsDartFrame()) {
       func = frame->LookupDartFunction();
       ASSERT(!func.IsNull());
       // Force-optimized functions don't need unoptimized code because their
@@ -1945,31 +1945,25 @@
   Zone* zone = stack_zone.GetZone();
 
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Function& function = Function::Handle(zone);
   CallSiteResetter resetter(zone);
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   while (frame != NULL) {
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      resetter.RebindStaticTargets(bytecode);
+    code = frame->LookupDartCode();
+    if (code.is_optimized() && !code.is_force_optimized()) {
+      // If this code is optimized, we need to reset the ICs in the
+      // corresponding unoptimized code, which will be executed when the stack
+      // unwinds to the optimized code.
+      function = code.function();
+      code = function.unoptimized_code();
+      ASSERT(!code.IsNull());
+      resetter.ResetSwitchableCalls(code);
+      resetter.ResetCaches(code);
     } else {
-      code = frame->LookupDartCode();
-      if (code.is_optimized() && !code.is_force_optimized()) {
-        // If this code is optimized, we need to reset the ICs in the
-        // corresponding unoptimized code, which will be executed when the stack
-        // unwinds to the optimized code.
-        function = code.function();
-        code = function.unoptimized_code();
-        ASSERT(!code.IsNull());
-        resetter.ResetSwitchableCalls(code);
-        resetter.ResetCaches(code);
-      } else {
-        resetter.ResetSwitchableCalls(code);
-        resetter.ResetCaches(code);
-      }
+      resetter.ResetSwitchableCalls(code);
+      resetter.ResetCaches(code);
     }
     frame = iterator.NextFrame();
   }
@@ -2032,14 +2026,6 @@
   StackZone stack_zone(thread);
   Zone* zone = stack_zone.GetZone();
 
-  Thread* mutator_thread = I->mutator_thread();
-  if (mutator_thread != nullptr) {
-    Interpreter* interpreter = mutator_thread->interpreter();
-    if (interpreter != nullptr) {
-      interpreter->ClearLookupCache();
-    }
-  }
-
   GrowableArray<const Function*> functions(4 * KB);
   GrowableArray<const KernelProgramInfo*> kernel_infos(KB);
   GrowableArray<const Field*> fields(4 * KB);
@@ -2084,10 +2070,6 @@
       table.Clear();
       info.set_classes_cache(table.Release());
     }
-    // Clear the bytecode object table.
-    if (info.bytecode_component() != Array::null()) {
-      kernel::BytecodeReader::ResetObjectTable(info);
-    }
   }
 }
 
@@ -2102,7 +2084,6 @@
   Class& owning_class = Class::Handle(zone);
   Library& owning_lib = Library::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   for (intptr_t i = 0; i < functions.length(); i++) {
     const Function& func = *functions[i];
     if (func.IsSignatureFunction()) {
@@ -2115,7 +2096,6 @@
     // Grab the current code.
     code = func.CurrentCode();
     ASSERT(!code.IsNull());
-    bytecode = func.bytecode();
 
     owning_class = func.Owner();
     owning_lib = owning_class.library();
@@ -2126,10 +2106,6 @@
     // they're held.
     resetter.ZeroEdgeCounters(func);
 
-    if (!bytecode.IsNull()) {
-      resetter.RebindStaticTargets(bytecode);
-    }
-
     if (stub_code) {
       // Nothing to reset.
     } else if (clear_code) {
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index b06ca57..ad29eb0 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -435,7 +435,6 @@
   void ZeroEdgeCounters(const Function& function);
   void ResetCaches(const Code& code);
   void ResetCaches(const ObjectPool& pool);
-  void RebindStaticTargets(const Bytecode& code);
   void Reset(const ICData& ic);
   void ResetSwitchableCalls(const Code& code);
 
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 7dc1096..23e5ce8 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -7,7 +7,6 @@
 #include "vm/kernel.h"
 
 #include "vm/bit_vector.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/jit/compiler.h"
@@ -230,71 +229,6 @@
   token_position_collector.CollectTokenPositions(kernel_offset);
 }
 
-static void CollectTokenPosition(TokenPosition position,
-                                 GrowableArray<intptr_t>* token_positions) {
-  if (position.IsReal()) {
-    token_positions->Add(position.value());
-  }
-}
-
-static void CollectBytecodeSourceTokenPositions(
-    const Bytecode& bytecode,
-    Zone* zone,
-    GrowableArray<intptr_t>* token_positions) {
-  BytecodeSourcePositionsIterator iter(zone, bytecode);
-  while (iter.MoveNext()) {
-    CollectTokenPosition(iter.TokenPos(), token_positions);
-  }
-}
-
-static void CollectBytecodeFunctionTokenPositions(
-    const Function& function,
-    GrowableArray<intptr_t>* token_positions) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  ASSERT(function.is_declared_in_bytecode());
-  CollectTokenPosition(function.token_pos(), token_positions);
-  CollectTokenPosition(function.end_token_pos(), token_positions);
-  if (!function.HasBytecode()) {
-    const Object& result = Object::Handle(
-        zone, BytecodeReader::ReadFunctionBytecode(thread, function));
-    if (!result.IsNull()) {
-      Exceptions::PropagateError(Error::Cast(result));
-    }
-  }
-  Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
-  if (bytecode.IsNull()) {
-    return;
-  }
-  if (bytecode.HasSourcePositions() && !function.IsLocalFunction()) {
-    CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
-    // Find closure functions in the object pool.
-    const ObjectPool& pool = ObjectPool::Handle(zone, bytecode.object_pool());
-    Object& object = Object::Handle(zone);
-    Function& closure = Function::Handle(zone);
-    for (intptr_t i = 0; i < pool.Length(); i++) {
-      ObjectPool::EntryType entry_type = pool.TypeAt(i);
-      if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-        continue;
-      }
-      object = pool.ObjectAt(i);
-      if (object.IsFunction()) {
-        closure ^= object.raw();
-        if (closure.kind() == FunctionLayout::kClosureFunction &&
-            closure.IsLocalFunction()) {
-          CollectTokenPosition(closure.token_pos(), token_positions);
-          CollectTokenPosition(closure.end_token_pos(), token_positions);
-          bytecode = closure.bytecode();
-          ASSERT(!bytecode.IsNull());
-          ASSERT(bytecode.function() != Function::null());
-          ASSERT(bytecode.HasSourcePositions());
-          CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
-        }
-      }
-    }
-  }
-}
-
 void CollectTokenPositionsFor(const Script& interesting_script) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -328,22 +262,11 @@
           token_positions.Add(klass.token_pos().value());
           token_positions.Add(klass.end_token_pos().value());
         }
-        // If class is declared in bytecode, its members should be loaded
-        // (via class finalization) before their token positions could be
-        // collected.
-        if (klass.is_declared_in_bytecode() && !klass.is_finalized()) {
-          const Error& error =
-              Error::Handle(zone, klass.EnsureIsFinalized(thread));
-          if (!error.IsNull()) {
-            Exceptions::PropagateError(error);
-          }
-        }
         if (klass.is_finalized()) {
           temp_array = klass.fields();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_field ^= temp_array.At(i);
-            if (!temp_field.is_declared_in_bytecode() &&
-                temp_field.kernel_offset() <= 0) {
+            if (temp_field.kernel_offset() <= 0) {
               // Skip artificially injected fields.
               continue;
             }
@@ -351,23 +274,12 @@
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
-            if (temp_field.is_declared_in_bytecode()) {
-              token_positions.Add(temp_field.token_pos().value());
-              token_positions.Add(temp_field.end_token_pos().value());
-              if (temp_field.is_static() &&
-                  temp_field.has_nontrivial_initializer()) {
-                temp_function = temp_field.EnsureInitializerFunction();
-                CollectBytecodeFunctionTokenPositions(temp_function,
-                                                      &token_positions);
-              }
-            } else {
-              data = temp_field.KernelData();
-              CollectKernelDataTokenPositions(
-                  data, interesting_script, entry_script,
-                  temp_field.kernel_offset(),
-                  temp_field.KernelDataProgramOffset(), zone, &helper,
-                  &token_positions);
-            }
+            data = temp_field.KernelData();
+            CollectKernelDataTokenPositions(
+                data, interesting_script, entry_script,
+                temp_field.kernel_offset(),
+                temp_field.KernelDataProgramOffset(), zone, &helper,
+                &token_positions);
           }
           temp_array = klass.current_functions();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
@@ -376,21 +288,15 @@
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
-            if (temp_function.is_declared_in_bytecode()) {
-              CollectBytecodeFunctionTokenPositions(temp_function,
-                                                    &token_positions);
-            } else {
-              data = temp_function.KernelData();
-              CollectKernelDataTokenPositions(
-                  data, interesting_script, entry_script,
-                  temp_function.kernel_offset(),
-                  temp_function.KernelDataProgramOffset(), zone, &helper,
-                  &token_positions);
-            }
+            data = temp_function.KernelData();
+            CollectKernelDataTokenPositions(
+                data, interesting_script, entry_script,
+                temp_function.kernel_offset(),
+                temp_function.KernelDataProgramOffset(), zone, &helper,
+                &token_positions);
           }
         } else {
           // Class isn't finalized yet: read the data attached to it.
-          ASSERT(!klass.is_declared_in_bytecode());
           ASSERT(klass.kernel_offset() > 0);
           data = lib.kernel_data();
           ASSERT(!data.IsNull());
@@ -412,20 +318,14 @@
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
         }
-        if (temp_function.is_declared_in_bytecode()) {
-          CollectBytecodeFunctionTokenPositions(temp_function,
-                                                &token_positions);
-        } else {
-          data = temp_function.KernelData();
-          CollectKernelDataTokenPositions(
-              data, interesting_script, entry_script,
-              temp_function.kernel_offset(),
-              temp_function.KernelDataProgramOffset(), zone, &helper,
-              &token_positions);
-        }
+        data = temp_function.KernelData();
+        CollectKernelDataTokenPositions(data, interesting_script, entry_script,
+                                        temp_function.kernel_offset(),
+                                        temp_function.KernelDataProgramOffset(),
+                                        zone, &helper, &token_positions);
       } else if (entry.IsField()) {
         const Field& field = Field::Cast(entry);
-        if (!field.is_declared_in_bytecode() && field.kernel_offset() <= 0) {
+        if (field.kernel_offset() <= 0) {
           // Skip artificially injected fields.
           continue;
         }
@@ -433,20 +333,10 @@
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
         }
-        if (field.is_declared_in_bytecode()) {
-          token_positions.Add(field.token_pos().value());
-          token_positions.Add(field.end_token_pos().value());
-          if (field.is_static() && field.has_nontrivial_initializer()) {
-            temp_function = field.EnsureInitializerFunction();
-            CollectBytecodeFunctionTokenPositions(temp_function,
-                                                  &token_positions);
-          }
-        } else {
-          data = field.KernelData();
-          CollectKernelDataTokenPositions(
-              data, interesting_script, entry_script, field.kernel_offset(),
-              field.KernelDataProgramOffset(), zone, &helper, &token_positions);
-        }
+        data = field.KernelData();
+        CollectKernelDataTokenPositions(
+            data, interesting_script, entry_script, field.kernel_offset(),
+            field.KernelDataProgramOffset(), zone, &helper, &token_positions);
       }
     }
   }
@@ -627,15 +517,6 @@
     Script& script = Script::Handle(zone, function.script());
     helper.InitFromScript(script);
 
-    if (function.is_declared_in_bytecode()) {
-      BytecodeComponentData bytecode_component(
-          &Array::Handle(zone, helper.GetBytecodeComponent()));
-      ActiveClass active_class;
-      BytecodeReaderHelper bytecode_reader_helper(&helper, &active_class,
-                                                  &bytecode_component);
-      return bytecode_reader_helper.BuildParameterDescriptor(function);
-    }
-
     const Class& owner_class = Class::Handle(zone, function.Owner());
     ActiveClass active_class;
     ActiveClassScope active_class_scope(&active_class, &owner_class);
@@ -665,14 +546,6 @@
   TranslationHelper translation_helper(thread);
   translation_helper.InitFromScript(script);
 
-  if (function.is_declared_in_bytecode()) {
-    BytecodeReaderHelper bytecode_reader_helper(&translation_helper, nullptr,
-                                                nullptr);
-    bytecode_reader_helper.ReadParameterCovariance(function, is_covariant,
-                                                   is_generic_covariant_impl);
-    return;
-  }
-
   KernelReaderHelper reader_helper(
       zone, &translation_helper, script,
       ExternalTypedData::Handle(zone, function.KernelData()),
@@ -809,55 +682,8 @@
   return attrs;
 }
 
-static void BytecodeProcedureAttributesError(const Object& function_or_field,
-                                             const Object& value) {
-  FATAL3("Unexpected value of %s bytecode attribute on %s: %s",
-         Symbols::vm_procedure_attributes_metadata().ToCString(),
-         function_or_field.ToCString(), value.ToCString());
-}
-
-static ProcedureAttributesMetadata ProcedureAttributesFromBytecodeAttribute(
-    Zone* zone,
-    const Object& function_or_field) {
-  ProcedureAttributesMetadata attrs;
-  const Object& value = Object::Handle(
-      zone,
-      BytecodeReader::GetBytecodeAttribute(
-          function_or_field, Symbols::vm_procedure_attributes_metadata()));
-  if (!value.IsNull()) {
-    const intptr_t kBytecodeAttributeLength = 3;
-    int32_t elements[kBytecodeAttributeLength];
-    if (!value.IsArray()) {
-      BytecodeProcedureAttributesError(function_or_field, value);
-    }
-    const Array& array = Array::Cast(value);
-    if (array.Length() != kBytecodeAttributeLength) {
-      BytecodeProcedureAttributesError(function_or_field, value);
-    }
-    Object& element = Object::Handle(zone);
-    for (intptr_t i = 0; i < kBytecodeAttributeLength; i++) {
-      element = array.At(i);
-      if (!element.IsSmi()) {
-        BytecodeProcedureAttributesError(function_or_field, value);
-      }
-      elements[i] = Smi::Cast(element).Value();
-    }
-    attrs.InitializeFromFlags(elements[0]);
-    attrs.method_or_setter_selector_id = elements[1];
-    attrs.getter_selector_id = elements[2];
-  }
-  return attrs;
-}
-
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone) {
-  if (function.is_declared_in_bytecode()) {
-    if (function.IsImplicitGetterOrSetter()) {
-      const Field& field = Field::Handle(zone, function.accessor_field());
-      return ProcedureAttributesFromBytecodeAttribute(zone, field);
-    }
-    return ProcedureAttributesFromBytecodeAttribute(zone, function);
-  }
   const Script& script = Script::Handle(zone, function.script());
   return ProcedureAttributesOf(
       zone, script, ExternalTypedData::Handle(zone, function.KernelData()),
@@ -866,9 +692,6 @@
 
 ProcedureAttributesMetadata ProcedureAttributesOf(const Field& field,
                                                   Zone* zone) {
-  if (field.is_declared_in_bytecode()) {
-    return ProcedureAttributesFromBytecodeAttribute(zone, field);
-  }
   const Class& parent = Class::Handle(zone, field.Owner());
   const Script& script = Script::Handle(zone, parent.script());
   return ProcedureAttributesOf(
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 2ac42a1..c31b045 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -214,11 +214,6 @@
 // as such function already checks all of its parameters.
 bool NeedsDynamicInvocationForwarder(const Function& function);
 
-// Returns a list of ParameterTypeChecks needed by a dynamic invocation
-// forwarder that targets [function]. Indices in these checks correspond to
-// bytecode frame indices.
-ArrayPtr CollectDynamicInvocationChecks(const Function& function);
-
 ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
                                                   Zone* zone);
 
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index d2cdbb5..3b34856 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -647,11 +647,6 @@
     experimental_flags_object.value.as_array.values = experimental_flags_array;
     experimental_flags_object.value.as_array.length = num_experimental_flags;
 
-    Dart_CObject bytecode;
-    bytecode.type = Dart_CObject_kBool;
-    bytecode.value.as_bool =
-        FLAG_enable_interpreter || FLAG_use_bytecode_compiler;
-
     Dart_CObject message;
     message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
@@ -668,8 +663,7 @@
                                    &num_blob_loads,
                                    &suppress_warnings,
                                    &enable_asserts,
-                                   &experimental_flags_object,
-                                   &bytecode};
+                                   &experimental_flags_object};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
 
@@ -813,11 +807,6 @@
     experimental_flags_object.value.as_array.values = experimental_flags_array;
     experimental_flags_object.value.as_array.length = num_experimental_flags;
 
-    Dart_CObject bytecode;
-    bytecode.type = Dart_CObject_kBool;
-    bytecode.value.as_bool =
-        FLAG_enable_interpreter || FLAG_use_bytecode_compiler;
-
     Dart_CObject package_config_uri;
     if (package_config != NULL) {
       package_config_uri.type = Dart_CObject_kString;
@@ -875,7 +864,6 @@
                                    &suppress_warnings,
                                    &enable_asserts,
                                    &experimental_flags_object,
-                                   &bytecode,
                                    &package_config_uri,
                                    &multiroot_filepaths_object,
                                    &multiroot_scheme_object,
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 5b5ea0d..e3860d0 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -210,7 +210,6 @@
                        &active_class_,
                        /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
-      bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -450,8 +449,6 @@
     script = LoadScriptAt(index, uri_to_source_table);
     scripts.SetAt(index, script);
   }
-
-  bytecode_metadata_helper_.ReadBytecodeComponent();
 }
 
 KernelLoader::KernelLoader(const Script& script,
@@ -478,7 +475,6 @@
                        &active_class_,
                        /* finalize= */ false),
       inferred_type_metadata_helper_(&helper_, &constant_reader_),
-      bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
@@ -653,64 +649,49 @@
   for (intptr_t i = 0; i < length; ++i) {
     library ^= potential_extension_libraries.At(i);
 
-    if (library.is_declared_in_bytecode()) {
-      const auto& imports = Array::Handle(Z, library.imports());
-      auto& ns = Namespace::Handle(Z);
-      auto& importee = Library::Handle(Z);
-      for (intptr_t j = 0; j < imports.Length(); ++j) {
-        ns ^= imports.At(j);
-        if (ns.IsNull()) continue;
-        importee = ns.library();
-        uri_path = importee.url();
-        if (uri_path.StartsWith(Symbols::DartExtensionScheme())) {
-          LoadNativeExtension(library, uri_path);
+    helper_.SetOffset(library.kernel_offset());
+
+    LibraryHelper library_helper(&helper_, kernel_binary_version_);
+    library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
+
+    const intptr_t annotation_count = helper_.ReadListLength();
+    for (intptr_t j = 0; j < annotation_count; ++j) {
+      uri_path = String::null();
+
+      const intptr_t tag = helper_.PeekTag();
+      if (tag == kConstantExpression) {
+        helper_.ReadByte();      // Skip the tag.
+        helper_.ReadPosition();  // Skip fileOffset.
+        helper_.SkipDartType();  // Skip type.
+
+        // We have a candidate. Let's look if it's an instance of the
+        // ExternalName class.
+        const intptr_t constant_table_offset = helper_.ReadUInt();
+        if (constant_reader.IsInstanceConstant(constant_table_offset,
+                                               external_name_class_)) {
+          constant = constant_reader.ReadConstant(constant_table_offset);
+          ASSERT(constant.clazz() == external_name_class_.raw());
+          uri_path ^= constant.GetField(external_name_field_);
         }
+      } else if (tag == kConstructorInvocation ||
+                 tag == kConstConstructorInvocation) {
+        uri_path = DetectExternalNameCtor();
+      } else {
+        helper_.SkipExpression();
       }
-    } else {
-      helper_.SetOffset(library.kernel_offset());
 
-      LibraryHelper library_helper(&helper_, kernel_binary_version_);
-      library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
+      if (uri_path.IsNull()) continue;
 
-      const intptr_t annotation_count = helper_.ReadListLength();
-      for (intptr_t j = 0; j < annotation_count; ++j) {
-        uri_path = String::null();
+      LoadNativeExtension(library, uri_path);
 
-        const intptr_t tag = helper_.PeekTag();
-        if (tag == kConstantExpression) {
-          helper_.ReadByte();      // Skip the tag.
-          helper_.ReadPosition();  // Skip fileOffset.
-          helper_.SkipDartType();  // Skip type.
-
-          // We have a candidate. Let's look if it's an instance of the
-          // ExternalName class.
-          const intptr_t constant_table_offset = helper_.ReadUInt();
-          if (constant_reader.IsInstanceConstant(constant_table_offset,
-                                                 external_name_class_)) {
-            constant = constant_reader.ReadConstant(constant_table_offset);
-            ASSERT(constant.clazz() == external_name_class_.raw());
-            uri_path ^= constant.GetField(external_name_field_);
-          }
-        } else if (tag == kConstructorInvocation ||
-                   tag == kConstConstructorInvocation) {
-          uri_path = DetectExternalNameCtor();
-        } else {
-          helper_.SkipExpression();
-        }
-
-        if (uri_path.IsNull()) continue;
-
-        LoadNativeExtension(library, uri_path);
-
-        // Create a dummy library and add it as an import to the current
-        // library. This allows later to discover and reload this native
-        // extension, e.g. when running from an app-jit snapshot.
-        // See Loader::ReloadNativeExtensions(...) which relies on
-        // Dart_GetImportsOfScheme('dart-ext').
-        const auto& native_library = Library::Handle(Library::New(uri_path));
-        library.AddImport(Namespace::Handle(Namespace::New(
-            native_library, Array::null_array(), Array::null_array())));
-      }
+      // Create a dummy library and add it as an import to the current
+      // library. This allows later to discover and reload this native
+      // extension, e.g. when running from an app-jit snapshot.
+      // See Loader::ReloadNativeExtensions(...) which relies on
+      // Dart_GetImportsOfScheme('dart-ext').
+      const auto& native_library = Library::Handle(Library::New(uri_path));
+      library.AddImport(Namespace::Handle(Namespace::New(
+          native_library, Array::null_array(), Array::null_array())));
     }
   }
 }
@@ -745,12 +726,10 @@
 
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    if (!bytecode_metadata_helper_.ReadLibraries()) {
-      // Note that `problemsAsJson` on Component is implicitly skipped.
-      const intptr_t length = program_->library_count();
-      for (intptr_t i = 0; i < length; i++) {
-        LoadLibrary(i);
-      }
+    // Note that `problemsAsJson` on Component is implicitly skipped.
+    const intptr_t length = program_->library_count();
+    for (intptr_t i = 0; i < length; i++) {
+      LoadLibrary(i);
     }
 
     // Finalize still pending classes if requested.
@@ -780,7 +759,7 @@
       return LookupLibrary(main_library);
     }
 
-    return bytecode_metadata_helper_.GetMainLibrary();
+    return Library::null();
   }
 
   // Either class finalization failed or we caught a compile error.
@@ -791,10 +770,6 @@
 void KernelLoader::LoadLibrary(const Library& library) {
   ASSERT(!library.Loaded());
 
-  bytecode_metadata_helper_.ReadLibrary(library);
-  if (library.Loaded()) {
-    return;
-  }
   const auto& uri = String::Handle(Z, library.url());
   const intptr_t num_libraries = program_->library_count();
   for (intptr_t i = 0; i < num_libraries; ++i) {
@@ -840,13 +815,10 @@
   // Make the expression evaluation function have the right script,
   // kernel data and parent.
   const auto& eval_script = Script::Handle(Z, function.script());
-  auto& kernel_data = ExternalTypedData::Handle(Z);
-  intptr_t kernel_offset = -1;
-  if (!function.is_declared_in_bytecode()) {
-    ASSERT(!expression_evaluation_library_.IsNull());
-    kernel_data = expression_evaluation_library_.kernel_data();
-    kernel_offset = expression_evaluation_library_.kernel_offset();
-  }
+  ASSERT(!expression_evaluation_library_.IsNull());
+  auto& kernel_data = ExternalTypedData::Handle(
+      Z, expression_evaluation_library_.kernel_data());
+  intptr_t kernel_offset = expression_evaluation_library_.kernel_offset();
   function.SetKernelDataAndScript(eval_script, kernel_data, kernel_offset);
 
   function.set_owner(real_class);
@@ -924,10 +896,6 @@
                                            bool* is_empty_program,
                                            intptr_t* p_num_classes,
                                            intptr_t* p_num_procedures) {
-  if (bytecode_metadata_helper_.FindModifiedLibrariesForHotReload(
-          modified_libs, is_empty_program, p_num_classes, p_num_procedures)) {
-    return;
-  }
   intptr_t length = program_->library_count();
   *is_empty_program = *is_empty_program && (length == 0);
   bool collect_library_stats =
@@ -1146,7 +1114,7 @@
   if (FLAG_enable_mirrors && annotation_count > 0) {
     ASSERT(annotations_kernel_offset > 0);
     library.AddLibraryMetadata(toplevel_class, TokenPosition::kNoSource,
-                               annotations_kernel_offset, 0);
+                               annotations_kernel_offset);
   }
 
   if (register_class) {
@@ -1267,8 +1235,7 @@
     }
     if ((FLAG_enable_mirrors || has_pragma_annotation) &&
         annotation_count > 0) {
-      library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
-                               0);
+      library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
     }
     fields_.Add(&field);
   }
@@ -1533,7 +1500,7 @@
   if ((FLAG_enable_mirrors || has_pragma_annotation) && annotation_count > 0) {
     library.AddClassMetadata(*out_class, toplevel_class,
                              TokenPosition::kNoSource,
-                             class_offset - correction_offset_, 0);
+                             class_offset - correction_offset_);
   }
 
   // We do not register expression evaluation classes with the VM:
@@ -1640,8 +1607,7 @@
       }
       if ((FLAG_enable_mirrors || has_pragma_annotation) &&
           annotation_count > 0) {
-        library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
-                                 0);
+        library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset);
       }
       fields_.Add(&field);
     }
@@ -1740,7 +1706,7 @@
     if ((FLAG_enable_mirrors || has_pragma_annotation) &&
         annotation_count > 0) {
       library.AddFunctionMetadata(function, TokenPosition::kNoSource,
-                                  constructor_offset, 0);
+                                  constructor_offset);
     }
   }
 
@@ -1779,7 +1745,6 @@
 }
 
 void KernelLoader::FinishLoading(const Class& klass) {
-  ASSERT(!klass.is_declared_in_bytecode());
   ASSERT(klass.IsTopLevel() || (klass.kernel_offset() > 0));
 
   Zone* zone = Thread::Current()->zone();
@@ -2087,7 +2052,7 @@
 
   if (annotation_count > 0) {
     library.AddFunctionMetadata(function, TokenPosition::kNoSource,
-                                procedure_offset, 0);
+                                procedure_offset);
   }
 
   if (has_pragma_annotation) {
@@ -2410,11 +2375,9 @@
   const PatchClass& initializer_owner =
       PatchClass::Handle(zone, PatchClass::New(field_owner, script));
   const Library& lib = Library::Handle(zone, field_owner.library());
-  if (!lib.is_declared_in_bytecode()) {
-    initializer_owner.set_library_kernel_data(
-        ExternalTypedData::Handle(zone, lib.kernel_data()));
-    initializer_owner.set_library_kernel_offset(lib.kernel_offset());
-  }
+  initializer_owner.set_library_kernel_data(
+      ExternalTypedData::Handle(zone, lib.kernel_data()));
+  initializer_owner.set_library_kernel_offset(lib.kernel_offset());
 
   // Create a static initializer.
   const Function& initializer_fun = Function::Handle(
@@ -2441,7 +2404,7 @@
   initializer_fun.set_token_pos(field.token_pos());
   initializer_fun.set_end_token_pos(field.end_token_pos());
   initializer_fun.set_accessor_field(field);
-  initializer_fun.InheritBinaryDeclarationFrom(field);
+  initializer_fun.InheritKernelOffsetFrom(field);
   initializer_fun.set_is_extension_member(field.is_extension_member());
   field.SetInitializerFunction(initializer_fun);
   return initializer_fun.raw();
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index 7826867..1129956 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -8,7 +8,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 #include "vm/bit_vector.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/constant_reader.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/hash_map.h"
@@ -410,7 +409,6 @@
   ConstantReader constant_reader_;
   TypeTranslator type_translator_;
   InferredTypeMetadataHelper inferred_type_metadata_helper_;
-  BytecodeMetadataHelper bytecode_metadata_helper_;
 
   Class& external_name_class_;
   Field& external_name_field_;
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index 4c46acb..0090ccc 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -322,6 +322,7 @@
 
 #if defined(DEBUG)
   bool IsCurrentThreadReader() {
+    SafepointMonitorLocker ml(&monitor_);
     ThreadId id = OSThread::GetCurrentThreadId();
     if (IsCurrentThreadWriter()) {
       return true;
@@ -333,7 +334,7 @@
     }
     return false;
   }
-#endif // defined(DEBUG)
+#endif  // defined(DEBUG)
 
   bool IsCurrentThreadWriter() {
     return writer_id_ == OSThread::GetCurrentThreadId();
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 388d6cb..1c7c43a 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -207,26 +207,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT Dart_Handle Dart_ReadAllBytecode() {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot read bytecode on an AOT runtime.",
-                       CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Dart_Handle result = Api::CheckAndFinalizePendingClasses(T);
-  if (Api::IsError(result)) {
-    return result;
-  }
-  CHECK_CALLBACK_STATE(T);
-  const Error& error = Error::Handle(T->zone(), Library::ReadAllBytecode());
-  if (!error.IsNull()) {
-    return Api::NewHandle(T, error.raw());
-  }
-  return Api::Success();
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_FinalizeAllClasses() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: All classes are already finalized in AOT runtime.",
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 18fdad6..b942e80 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -234,10 +234,9 @@
       : public BitField<intptr_t, bool, kReverseArgOrderBit, 1> {};
   friend class Api;
   friend class NativeEntry;
-  friend class Interpreter;
   friend class Simulator;
 
-  // Allow simulator and interpreter to create NativeArguments in reverse order
+  // Allow simulator to create NativeArguments in reverse order
   // on the stack.
   NativeArguments(Thread* thread,
                   int argc_tag,
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 7a13118..445ccf0 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -273,16 +273,8 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* caller_frame = iterator.NextFrame();
 
-    Code& code = Code::Handle(zone);
-    Bytecode& bytecode = Bytecode::Handle(zone);
-    Function& func = Function::Handle(zone);
-    if (caller_frame->is_interpreted()) {
-      bytecode = caller_frame->LookupDartBytecode();
-      func = bytecode.function();
-    } else {
-      code = caller_frame->LookupDartCode();
-      func = code.function();
-    }
+    Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
+    Function& func = Function::Handle(zone, code.function());
 
     if (FLAG_trace_natives) {
       THR_Print("Resolving native target for %s\n", func.ToCString());
@@ -295,63 +287,29 @@
 
 #if defined(DEBUG)
     NativeFunction current_function = NULL;
-    if (caller_frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      ASSERT(FLAG_enable_interpreter);
-      NativeFunctionWrapper current_trampoline = KBCPatcher::GetNativeCallAt(
-          caller_frame->pc(), bytecode, &current_function);
-      ASSERT(current_function ==
-             reinterpret_cast<NativeFunction>(LinkNativeCall));
-      ASSERT(current_trampoline == &BootstrapNativeCallWrapper ||
-             current_trampoline == &AutoScopeNativeCallWrapper ||
-             current_trampoline == &NoScopeNativeCallWrapper);
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    } else {
-      const Code& current_trampoline =
-          Code::Handle(zone, CodePatcher::GetNativeCallAt(
-                                 caller_frame->pc(), code, &current_function));
-      // Some other isolate(with code being shared in AOT) might have updated
-      // target function/trampoline already.
-      ASSERT(current_function ==
-                 reinterpret_cast<NativeFunction>(LinkNativeCall) ||
-             current_function == target_function);
-      ASSERT(current_trampoline.raw() ==
-                 StubCode::CallBootstrapNative().raw() ||
-             current_function == target_function);
-    }
+    const Code& current_trampoline =
+        Code::Handle(zone, CodePatcher::GetNativeCallAt(
+                               caller_frame->pc(), code, &current_function));
+    // Some other isolate(with code being shared in AOT) might have updated
+    // target function/trampoline already.
+    ASSERT(current_function ==
+               reinterpret_cast<NativeFunction>(LinkNativeCall) ||
+           current_function == target_function);
+    ASSERT(current_trampoline.raw() == StubCode::CallBootstrapNative().raw() ||
+           current_function == target_function);
 #endif
 
     NativeFunction patch_target_function = target_function;
-    if (caller_frame->is_interpreted()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      ASSERT(FLAG_enable_interpreter);
-      NativeFunctionWrapper trampoline;
-      if (is_bootstrap_native) {
-        trampoline = &BootstrapNativeCallWrapper;
-      } else if (is_auto_scope) {
-        trampoline = &AutoScopeNativeCallWrapper;
-      } else {
-        trampoline = &NoScopeNativeCallWrapper;
-      }
-      KBCPatcher::PatchNativeCallAt(caller_frame->pc(), bytecode,
-                                    patch_target_function, trampoline);
-#else
-      UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+    Code& trampoline = Code::Handle(zone);
+    if (is_bootstrap_native) {
+      trampoline = StubCode::CallBootstrapNative().raw();
+    } else if (is_auto_scope) {
+      trampoline = StubCode::CallAutoScopeNative().raw();
     } else {
-      Code& trampoline = Code::Handle(zone);
-      if (is_bootstrap_native) {
-        trampoline = StubCode::CallBootstrapNative().raw();
-      } else if (is_auto_scope) {
-        trampoline = StubCode::CallAutoScopeNative().raw();
-      } else {
-        trampoline = StubCode::CallNoScopeNative().raw();
-      }
-      CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
-                                     patch_target_function, trampoline);
+      trampoline = StubCode::CallNoScopeNative().raw();
     }
+    CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
+                                   patch_target_function, trampoline);
 
     if (FLAG_trace_natives) {
       THR_Print("    -> %p (%s)\n", target_function,
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index fae4261..2be609e 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -171,7 +171,6 @@
 
   const TypedData& data_;
 
-  friend class Interpreter;
   friend class ObjectPoolSerializationCluster;
   DISALLOW_COPY_AND_ASSIGN(NativeEntryData);
 };
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 4b878a8..e5af575 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "include/dart_api.h"
-#include "lib/stacktrace.h"
 #include "platform/assert.h"
 #include "platform/text_buffer.h"
 #include "platform/unaligned.h"
@@ -20,7 +19,6 @@
 #include "vm/code_descriptors.h"
 #include "vm/code_observers.h"
 #include "vm/compiler/assembler/disassembler.h"
-#include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/cpu.h"
@@ -67,8 +65,6 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/backend/code_statistics.h"
 #include "vm/compiler/compiler_state.h"
-#include "vm/compiler/frontend/bytecode_fingerprints.h"
-#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_fingerprints.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
 #include "vm/compiler/intrinsifier.h"
@@ -157,7 +153,6 @@
 ClassPtr Object::namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::code_class_ = static_cast<ClassPtr>(RAW_NULL);
-ClassPtr Object::bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -168,7 +163,6 @@
 ClassPtr Object::exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::context_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
-ClassPtr Object::dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
 ClassPtr Object::monomorphicsmiablecall_class_ =
@@ -519,21 +513,6 @@
   return '\0';
 }
 
-static BytecodePtr CreateVMInternalBytecode(KernelBytecode::Opcode opcode) {
-  const KBCInstr* instructions = nullptr;
-  intptr_t instructions_size = 0;
-
-  KernelBytecode::GetVMInternalBytecodeInstructions(opcode, &instructions,
-                                                    &instructions_size);
-
-  const auto& bytecode = Bytecode::Handle(
-      Bytecode::New(reinterpret_cast<uword>(instructions), instructions_size,
-                    -1, Object::empty_object_pool()));
-  bytecode.set_pc_descriptors(Object::empty_descriptors());
-  bytecode.set_exception_handlers(Object::empty_exception_handlers());
-  return bytecode.raw();
-}
-
 void Object::InitNullAndBool(Isolate* isolate) {
   // Should only be run by the vm isolate.
   ASSERT(isolate == Dart::vm_isolate());
@@ -840,9 +819,6 @@
   cls = Class::New<Code, RTN::Code>(isolate);
   code_class_ = cls.raw();
 
-  cls = Class::New<Bytecode, RTN::Bytecode>(isolate);
-  bytecode_class_ = cls.raw();
-
   cls = Class::New<Instructions, RTN::Instructions>(isolate);
   instructions_class_ = cls.raw();
 
@@ -873,9 +849,6 @@
   cls = Class::New<ContextScope, RTN::ContextScope>(isolate);
   context_scope_class_ = cls.raw();
 
-  cls = Class::New<ParameterTypeCheck, RTN::ParameterTypeCheck>(isolate);
-  dyncalltypecheck_class_ = cls.raw();
-
   cls = Class::New<SingleTargetCache, RTN::SingleTargetCache>(isolate);
   singletargetcache_class_ = cls.raw();
 
@@ -1160,30 +1133,6 @@
   // needs to be created earlier as VM isolate snapshot reader references it
   // before Object::FinalizeVMIsolate.
 
-  *implicit_getter_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_ImplicitGetter);
-
-  *implicit_setter_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_ImplicitSetter);
-
-  *implicit_static_getter_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_ImplicitStaticGetter);
-
-  *method_extractor_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_MethodExtractor);
-
-  *invoke_closure_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_InvokeClosure);
-
-  *invoke_field_bytecode_ =
-      CreateVMInternalBytecode(KernelBytecode::kVMInternal_InvokeField);
-
-  *nsm_dispatcher_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_NoSuchMethodDispatcher);
-
-  *dynamic_invocation_forwarder_bytecode_ = CreateVMInternalBytecode(
-      KernelBytecode::kVMInternal_ForwardDynamicInvocation);
-
   // Some thread fields need to be reinitialized as null constants have not been
   // initialized until now.
   Thread* thr = Thread::Current();
@@ -1252,22 +1201,6 @@
   ASSERT(extractor_parameter_types_->IsArray());
   ASSERT(!extractor_parameter_names_->IsSmi());
   ASSERT(extractor_parameter_names_->IsArray());
-  ASSERT(!implicit_getter_bytecode_->IsSmi());
-  ASSERT(implicit_getter_bytecode_->IsBytecode());
-  ASSERT(!implicit_setter_bytecode_->IsSmi());
-  ASSERT(implicit_setter_bytecode_->IsBytecode());
-  ASSERT(!implicit_static_getter_bytecode_->IsSmi());
-  ASSERT(implicit_static_getter_bytecode_->IsBytecode());
-  ASSERT(!method_extractor_bytecode_->IsSmi());
-  ASSERT(method_extractor_bytecode_->IsBytecode());
-  ASSERT(!invoke_closure_bytecode_->IsSmi());
-  ASSERT(invoke_closure_bytecode_->IsBytecode());
-  ASSERT(!invoke_field_bytecode_->IsSmi());
-  ASSERT(invoke_field_bytecode_->IsBytecode());
-  ASSERT(!nsm_dispatcher_bytecode_->IsSmi());
-  ASSERT(nsm_dispatcher_bytecode_->IsBytecode());
-  ASSERT(!dynamic_invocation_forwarder_bytecode_->IsSmi());
-  ASSERT(dynamic_invocation_forwarder_bytecode_->IsBytecode());
 }
 
 void Object::FinishInit(Isolate* isolate) {
@@ -1303,7 +1236,6 @@
   namespace_class_ = static_cast<ClassPtr>(RAW_NULL);
   kernel_program_info_class_ = static_cast<ClassPtr>(RAW_NULL);
   code_class_ = static_cast<ClassPtr>(RAW_NULL);
-  bytecode_class_ = static_cast<ClassPtr>(RAW_NULL);
   instructions_class_ = static_cast<ClassPtr>(RAW_NULL);
   instructions_section_class_ = static_cast<ClassPtr>(RAW_NULL);
   object_pool_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -1314,7 +1246,6 @@
   exception_handlers_class_ = static_cast<ClassPtr>(RAW_NULL);
   context_class_ = static_cast<ClassPtr>(RAW_NULL);
   context_scope_class_ = static_cast<ClassPtr>(RAW_NULL);
-  dyncalltypecheck_class_ = static_cast<ClassPtr>(RAW_NULL);
   singletargetcache_class_ = static_cast<ClassPtr>(RAW_NULL);
   unlinkedcall_class_ = static_cast<ClassPtr>(RAW_NULL);
   monomorphicsmiablecall_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -1406,7 +1337,6 @@
   SET_CLASS_NAME(namespace, Namespace);
   SET_CLASS_NAME(kernel_program_info, KernelProgramInfo);
   SET_CLASS_NAME(code, Code);
-  SET_CLASS_NAME(bytecode, Bytecode);
   SET_CLASS_NAME(instructions, Instructions);
   SET_CLASS_NAME(instructions_section, InstructionsSection);
   SET_CLASS_NAME(object_pool, ObjectPool);
@@ -1417,7 +1347,6 @@
   SET_CLASS_NAME(exception_handlers, ExceptionHandlers);
   SET_CLASS_NAME(context, Context);
   SET_CLASS_NAME(context_scope, ContextScope);
-  SET_CLASS_NAME(dyncalltypecheck, ParameterTypeCheck);
   SET_CLASS_NAME(singletargetcache, SingleTargetCache);
   SET_CLASS_NAME(unlinkedcall, UnlinkedCall);
   SET_CLASS_NAME(monomorphicsmiablecall, MonomorphicSmiableCall);
@@ -2888,8 +2817,7 @@
     // references, but do not recompute size.
     result.set_is_prefinalized();
   }
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.InitEmptyFields();
   if (register_class) {
     isolate->class_table()->Register(result);
@@ -3166,7 +3094,7 @@
 
 void Class::set_type_parameters(const TypeArguments& value) const {
   ASSERT((num_type_arguments() == kUnknownNumTypeArguments) ||
-         is_declared_in_bytecode() || is_prefinalized());
+         is_prefinalized());
   StorePointer(&raw_ptr()->type_parameters_, value.raw());
 }
 
@@ -3674,7 +3602,7 @@
   extractor.set_parameter_names(Object::extractor_parameter_names());
   extractor.set_result_type(Object::dynamic_type());
 
-  extractor.InheritBinaryDeclarationFrom(*this);
+  extractor.InheritKernelOffsetFrom(*this);
 
   extractor.set_extracted_method_closure(closure_function);
   extractor.set_is_debuggable(false);
@@ -3815,7 +3743,6 @@
   forwarder.set_is_visible(false);
 
   forwarder.ClearICDataArray();
-  forwarder.ClearBytecode();
   forwarder.ClearCode();
   forwarder.set_usage_counter(0);
   forwarder.set_deoptimization_counter(0);
@@ -3823,7 +3750,7 @@
   forwarder.set_inlining_depth(0);
   forwarder.set_optimized_call_site_count(0);
 
-  forwarder.InheritBinaryDeclarationFrom(*this);
+  forwarder.InheritKernelOffsetFrom(*this);
 
   const Array& checks = Array::Handle(zone, Array::New(1));
   checks.SetAt(0, *this);
@@ -4351,14 +4278,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    // Loading of class declaration can be postponed until needed
-    // if class comes from bytecode.
-    if (!is_declared_in_bytecode()) {
-      FATAL1("Unable to use class %s which is not loaded yet.", ToCString());
-    }
-    kernel::BytecodeReader::LoadClassDeclaration(*this);
-    ASSERT(is_declaration_loaded());
-    ASSERT(is_type_finalized());
+    FATAL1("Unable to use class %s which is not loaded yet.", ToCString());
 #endif
   }
 }
@@ -4549,8 +4469,7 @@
   result.set_num_type_arguments(kUnknownNumTypeArguments);
   result.set_num_native_fields(0);
   result.set_state_bits(0);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.InitEmptyFields();
   return result.raw();
 }
@@ -4863,8 +4782,6 @@
       return Symbols::KernelProgramInfo().ToCString();
     case kCodeCid:
       return Symbols::Code().ToCString();
-    case kBytecodeCid:
-      return Symbols::Bytecode().ToCString();
     case kInstructionsCid:
       return Symbols::Instructions().ToCString();
     case kInstructionsSectionCid:
@@ -4885,8 +4802,6 @@
       return Symbols::Context().ToCString();
     case kContextScopeCid:
       return Symbols::ContextScope().ToCString();
-    case kParameterTypeCheckCid:
-      return Symbols::ParameterTypeCheck().ToCString();
     case kSingleTargetCacheCid:
       return Symbols::SingleTargetCache().ToCString();
     case kICDataCid:
@@ -4947,9 +4862,6 @@
 
 int32_t Class::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return 0;  // TODO(37353): Implement or remove.
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateClassFingerprint(
       *this);
 #else
@@ -6800,76 +6712,13 @@
 bool Function::HasCode() const {
   NoSafepointScope no_safepoint;
   ASSERT(raw_ptr()->code_ != Code::null());
-#if defined(DART_PRECOMPILED_RUNTIME)
   return raw_ptr()->code_ != StubCode::LazyCompile().raw();
-#else
-  return raw_ptr()->code_ != StubCode::LazyCompile().raw() &&
-         raw_ptr()->code_ != StubCode::InterpretCall().raw();
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-bool Function::IsBytecodeAllowed(Zone* zone) const {
-  if (FLAG_intrinsify) {
-    // Bigint intrinsics should not be interpreted, because their Dart version
-    // is only to be used when intrinsics are disabled. Mixing an interpreted
-    // Dart version with a compiled intrinsified version results in a mismatch
-    // in the number of digits processed by each call.
-    switch (recognized_kind()) {
-      case MethodRecognizer::kBigint_lsh:
-      case MethodRecognizer::kBigint_rsh:
-      case MethodRecognizer::kBigint_absAdd:
-      case MethodRecognizer::kBigint_absSub:
-      case MethodRecognizer::kBigint_mulAdd:
-      case MethodRecognizer::kBigint_sqrAdd:
-      case MethodRecognizer::kBigint_estimateQuotientDigit:
-      case MethodRecognizer::kMontgomery_mulMod:
-        return false;
-      default:
-        break;
-    }
-  }
-  switch (kind()) {
-    case FunctionLayout::kDynamicInvocationForwarder:
-      return is_declared_in_bytecode();
-    case FunctionLayout::kImplicitClosureFunction:
-    case FunctionLayout::kIrregexpFunction:
-    case FunctionLayout::kFfiTrampoline:
-      return false;
-    default:
-      return true;
-  }
-}
-
-void Function::AttachBytecode(const Bytecode& value) const {
-  DEBUG_ASSERT(IsMutatorOrAtSafepoint());
-  ASSERT(!value.IsNull());
-  // Finish setting up code before activating it.
-  if (!value.InVMIsolateHeap()) {
-    value.set_function(*this);
-  }
-  StorePointer(&raw_ptr()->bytecode_, value.raw());
-
-  // We should not have loaded the bytecode if the function had code.
-  // However, we may load the bytecode to access source positions (see
-  // ProcessBytecodeTokenPositionsEntry in kernel.cc).
-  // In that case, do not install InterpretCall stub below.
-  if (FLAG_enable_interpreter && !HasCode()) {
-    // Set the code entry_point to InterpretCall stub.
-    SetInstructions(StubCode::InterpretCall());
-  }
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 bool Function::HasCode(FunctionPtr function) {
   NoSafepointScope no_safepoint;
   ASSERT(function->ptr()->code_ != Code::null());
-#if defined(DART_PRECOMPILED_RUNTIME)
   return function->ptr()->code_ != StubCode::LazyCompile().raw();
-#else
-  return function->ptr()->code_ != StubCode::LazyCompile().raw() &&
-         function->ptr()->code_ != StubCode::InterpretCall().raw();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Function::ClearCode() const {
@@ -6880,19 +6729,7 @@
 
   StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
 
-  if (FLAG_enable_interpreter && HasBytecode()) {
-    SetInstructions(StubCode::InterpretCall());
-  } else {
-    SetInstructions(StubCode::LazyCompile());
-  }
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-void Function::ClearBytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  StorePointer(&raw_ptr()->bytecode_, Bytecode::null());
+  SetInstructions(StubCode::LazyCompile());
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -6953,14 +6790,9 @@
 
   const Code& unopt_code = Code::Handle(zone, unoptimized_code());
   if (unopt_code.IsNull()) {
-    // Set the lazy compile or interpreter call stub code.
-    if (FLAG_enable_interpreter && HasBytecode()) {
-      TIR_Print("Switched to interpreter call stub for %s\n", ToCString());
-      SetInstructions(StubCode::InterpretCall());
-    } else {
-      TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
-      SetInstructions(StubCode::LazyCompile());
-    }
+    // Set the lazy compile stub code.
+    TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
+    SetInstructions(StubCode::LazyCompile());
     return;
   }
 
@@ -7550,7 +7382,6 @@
 //   ffi trampoline function: FfiTrampolineData  (Dart->C)
 //   dyn inv forwarder:       Array[0] = Function target
 //                            Array[1] = TypeArguments default type args
-//                            Array[i] = ParameterTypeCheck
 void Function::set_data(const Object& value) const {
   StorePointer(&raw_ptr()->data_, value.raw());
 }
@@ -8840,8 +8671,7 @@
   NOT_IN_PRECOMPILED(result.set_optimized_instruction_count(0));
   NOT_IN_PRECOMPILED(result.set_optimized_call_site_count(0));
   NOT_IN_PRECOMPILED(result.set_inlining_depth(0));
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.set_is_optimizable(is_native ? false : true);
   result.set_is_background_optimizable(is_native ? false : true);
   result.set_is_inlinable(true);
@@ -9048,7 +8878,7 @@
     }
   }
   closure_function.TruncateUnusedParameterFlags();
-  closure_function.InheritBinaryDeclarationFrom(*this);
+  closure_function.InheritKernelOffsetFrom(*this);
 
   // Change covariant parameter types to either Object? for an opted-in implicit
   // closure or to Object* for a legacy implicit closure.
@@ -9330,25 +9160,19 @@
   return PatchClass::Cast(obj).origin_class();
 }
 
-void Function::InheritBinaryDeclarationFrom(const Function& src) const {
+void Function::InheritKernelOffsetFrom(const Function& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  StoreNonPointer(&raw_ptr()->binary_declaration_,
-                  src.raw_ptr()->binary_declaration_);
+  StoreNonPointer(&raw_ptr()->kernel_offset_, src.raw_ptr()->kernel_offset_);
 #endif
 }
 
-void Function::InheritBinaryDeclarationFrom(const Field& src) const {
+void Function::InheritKernelOffsetFrom(const Field& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  if (src.is_declared_in_bytecode()) {
-    set_is_declared_in_bytecode(true);
-    set_bytecode_offset(src.bytecode_offset());
-  } else {
-    set_kernel_offset(src.kernel_offset());
-  }
+  set_kernel_offset(src.kernel_offset());
 #endif
 }
 
@@ -9427,7 +9251,6 @@
 }
 
 intptr_t Function::KernelDataProgramOffset() const {
-  ASSERT(!is_declared_in_bytecode());
   if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher() ||
       IsFfiTrampoline()) {
     return 0;
@@ -9448,7 +9271,6 @@
   const Object& obj = Object::Handle(raw_ptr()->owner_);
   if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
-    ASSERT(!lib.is_declared_in_bytecode());
     return lib.kernel_offset();
   }
   ASSERT(obj.IsPatchClass());
@@ -9459,12 +9281,6 @@
   return HasCode() && Code::Handle(CurrentCode()).is_optimized();
 }
 
-bool Function::ShouldCompilerOptimize() const {
-  return !FLAG_enable_interpreter ||
-         ((unoptimized_code() != Object::null()) && WasCompiled()) ||
-         ForceOptimize();
-}
-
 const char* Function::NameCString(NameVisibility name_visibility) const {
   switch (name_visibility) {
     case kInternalName:
@@ -9666,10 +9482,6 @@
 // arguments.
 int32_t Function::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return kernel::BytecodeFingerprintHelper::CalculateFunctionFingerprint(
-        *this);
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateFunctionFingerprint(
       *this);
 #else
@@ -9794,12 +9606,6 @@
     return true;  // The kernel structure has been altered, skip checking.
   }
 
-  if (is_declared_in_bytecode()) {
-    // AST and bytecode compute different fingerprints, and we only track one
-    // fingerprint set.
-    return true;
-  }
-
   if (SourceFingerprint() != fp) {
     // This output can be copied into a file, then used with sed
     // to replace the old values.
@@ -10311,17 +10117,15 @@
   return PatchClass::Cast(obj).library_kernel_data();
 }
 
-void Field::InheritBinaryDeclarationFrom(const Field& src) const {
+void Field::InheritKernelOffsetFrom(const Field& src) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
-  StoreNonPointer(&raw_ptr()->binary_declaration_,
-                  src.raw_ptr()->binary_declaration_);
+  StoreNonPointer(&raw_ptr()->kernel_offset_, src.raw_ptr()->kernel_offset_);
 #endif
 }
 
 intptr_t Field::KernelDataProgramOffset() const {
-  ASSERT(!is_declared_in_bytecode());
   const Object& obj = Object::Handle(raw_ptr()->owner_);
   // During background JIT compilation field objects are copied
   // and copy points to the original field via the owner field.
@@ -10329,7 +10133,6 @@
     return Field::Cast(obj).KernelDataProgramOffset();
   } else if (obj.IsClass()) {
     Library& lib = Library::Handle(Class::Cast(obj).library());
-    ASSERT(!lib.is_declared_in_bytecode());
     return lib.kernel_offset();
   }
   ASSERT(obj.IsPatchClass());
@@ -10386,8 +10189,7 @@
     result.set_is_unboxing_candidate(!is_final && !is_late && !is_static);
   }
   result.set_initializer_changed_after_initialization(false);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.set_has_pragma(false);
   result.set_static_type_exactness_state(
       StaticTypeExactnessState::NotTracking());
@@ -10459,15 +10261,12 @@
   Field& clone = Field::Handle();
   clone ^= Object::Clone(*this, Heap::kOld);
   clone.SetOriginal(original);
-  clone.InheritBinaryDeclarationFrom(original);
+  clone.InheritKernelOffsetFrom(original);
   return clone.raw();
 }
 
 int32_t Field::SourceFingerprint() const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (is_declared_in_bytecode()) {
-    return 0;  // TODO(37353): Implement or remove.
-  }
   return kernel::KernelSourceFingerprintHelper::CalculateFieldFingerprint(
       *this);
 #else
@@ -11363,7 +11162,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     // A well-formed line number array has a leading null.
     info.Add(line_separator);  // New line.
     return info.raw();
@@ -11484,8 +11282,7 @@
 
   Zone* zone = Thread::Current()->zone();
   TypedData& line_starts_data = TypedData::Handle(zone, line_starts());
-  // Scripts loaded from bytecode may have null line_starts().
-  if (line_starts_data.IsNull()) return false;
+  ASSERT(!line_starts_data.IsNull());
 
   kernel::KernelLineStartsReader line_starts_reader(line_starts_data, zone);
   line_starts_reader.LocationForPosition(target_token_pos.value(), line,
@@ -11525,7 +11322,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     *line = -1;
     if (column != NULL) {
       *column = -1;
@@ -11568,7 +11364,6 @@
   LookupSourceAndLineStarts(zone);
   if (line_starts() == TypedData::null()) {
     // Scripts in the AOT snapshot do not have a line starts array.
-    // Neither do some scripts coming from bytecode.
     *first_token_index = TokenPosition::kNoSource;
     *last_token_index = TokenPosition::kNoSource;
     return;
@@ -11915,8 +11710,7 @@
 void Library::AddMetadata(const Object& owner,
                           const String& name,
                           TokenPosition token_pos,
-                          intptr_t kernel_offset,
-                          intptr_t bytecode_offset) const {
+                          intptr_t kernel_offset) const {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
 #else
@@ -11933,12 +11727,7 @@
   field.SetFieldType(Object::dynamic_type());
   field.set_is_reflectable(false);
   field.SetStaticValue(Array::empty_array(), true);
-  if (bytecode_offset > 0) {
-    field.set_is_declared_in_bytecode(true);
-    field.set_bytecode_offset(bytecode_offset);
-  } else {
-    field.set_kernel_offset(kernel_offset);
-  }
+  field.set_kernel_offset(kernel_offset);
   GrowableObjectArray& metadata =
       GrowableObjectArray::Handle(zone, this->metadata());
   metadata.Add(field, Heap::kOld);
@@ -11948,39 +11737,36 @@
 void Library::AddClassMetadata(const Class& cls,
                                const Object& tl_owner,
                                TokenPosition token_pos,
-                               intptr_t kernel_offset,
-                               intptr_t bytecode_offset) const {
+                               intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   // We use the toplevel class as the owner of a class's metadata field because
   // a class's metadata is in scope of the library, not the class.
   AddMetadata(tl_owner,
               String::Handle(zone, MakeClassMetaName(thread, zone, cls)),
-              token_pos, kernel_offset, bytecode_offset);
+              token_pos, kernel_offset);
 }
 
 void Library::AddFieldMetadata(const Field& field,
                                TokenPosition token_pos,
-                               intptr_t kernel_offset,
-                               intptr_t bytecode_offset) const {
+                               intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const auto& owner = Object::Handle(zone, field.RawOwner());
   const auto& name =
       String::Handle(zone, MakeFieldMetaName(thread, zone, field));
-  AddMetadata(owner, name, token_pos, kernel_offset, bytecode_offset);
+  AddMetadata(owner, name, token_pos, kernel_offset);
 }
 
 void Library::AddFunctionMetadata(const Function& func,
                                   TokenPosition token_pos,
-                                  intptr_t kernel_offset,
-                                  intptr_t bytecode_offset) const {
+                                  intptr_t kernel_offset) const {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const auto& owner = Object::Handle(zone, func.RawOwner());
   const auto& name =
       String::Handle(zone, MakeFunctionMetaName(thread, zone, func));
-  AddMetadata(owner, name, token_pos, kernel_offset, bytecode_offset);
+  AddMetadata(owner, name, token_pos, kernel_offset);
 }
 
 void Library::AddTypeParameterMetadata(const TypeParameter& param,
@@ -11990,15 +11776,13 @@
   const auto& owner = Class::Handle(zone, param.parameterized_class());
   const auto& name =
       String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param));
-  AddMetadata(owner, name, token_pos, 0, 0);
+  AddMetadata(owner, name, token_pos, 0);
 }
 
 void Library::AddLibraryMetadata(const Object& tl_owner,
                                  TokenPosition token_pos,
-                                 intptr_t kernel_offset,
-                                 intptr_t bytecode_offset) const {
-  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos, kernel_offset,
-              bytecode_offset);
+                                 intptr_t kernel_offset) const {
+  AddMetadata(tl_owner, Symbols::TopLevel(), token_pos, kernel_offset);
 }
 
 StringPtr Library::MakeMetadataName(const Object& obj) const {
@@ -12042,13 +11826,8 @@
   const Field& from_field =
       Field::Handle(from_library.GetMetadataField(metaname));
   if (!from_field.IsNull()) {
-    if (from_field.is_declared_in_bytecode()) {
-      AddFunctionMetadata(to_fun, from_field.token_pos(), 0,
-                          from_field.bytecode_offset());
-    } else {
-      AddFunctionMetadata(to_fun, from_field.token_pos(),
-                          from_field.kernel_offset(), 0);
-    }
+    AddFunctionMetadata(to_fun, from_field.token_pos(),
+                        from_field.kernel_offset());
   }
 }
 
@@ -12076,13 +11855,9 @@
   }
   Object& metadata = Object::Handle(field.StaticValue());
   if (metadata.raw() == Object::empty_array().raw()) {
-    if (field.is_declared_in_bytecode()) {
-      metadata = kernel::BytecodeReader::ReadAnnotation(field);
-    } else {
-      ASSERT(field.kernel_offset() > 0);
-      metadata = kernel::EvaluateMetadata(
-          field, /* is_annotations_offset = */ obj.IsLibrary());
-    }
+    ASSERT(field.kernel_offset() > 0);
+    metadata = kernel::EvaluateMetadata(
+        field, /* is_annotations_offset = */ obj.IsLibrary());
     if (metadata.IsArray() || metadata.IsNull()) {
       ASSERT(metadata.raw() != Object::empty_array().raw());
       if (!Compiler::IsBackgroundCompilation()) {
@@ -12100,22 +11875,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-ArrayPtr Library::GetExtendedMetadata(const Object& obj, intptr_t count) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Object::empty_array().raw();
-#else
-  RELEASE_ASSERT(obj.IsFunction() || obj.IsLibrary());
-  const String& metaname = String::Handle(MakeMetadataName(obj));
-  Field& field = Field::Handle(GetMetadataField(metaname));
-  if (field.IsNull()) {
-    // There is no metadata for this object.
-    return Object::empty_array().raw();
-  }
-  ASSERT(field.is_declared_in_bytecode());
-  return kernel::BytecodeReader::ReadExtendedAnnotations(field, count);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 static bool ShouldBePrivate(const String& name) {
   return (name.Length() >= 1 && name.CharAt(0) == '_') ||
          (name.Length() >= 5 &&
@@ -12967,8 +12726,7 @@
     result.set_debuggable(true);
   }
   result.set_is_dart_scheme(dart_scheme);
-  NOT_IN_PRECOMPILED(result.set_is_declared_in_bytecode(false));
-  NOT_IN_PRECOMPILED(result.set_binary_declaration_offset(0));
+  NOT_IN_PRECOMPILED(result.set_kernel_offset(0));
   result.StoreNonPointer(&result.raw_ptr()->load_state_,
                          LibraryLayout::kAllocated);
   result.StoreNonPointer(&result.raw_ptr()->index_, -1);
@@ -13354,18 +13112,6 @@
     result = DartEntry::InvokeFunction(callee, real_arguments, args_desc);
   }
 
-  if (callee.is_declared_in_bytecode()) {
-    // Expression evaluation binary expires immediately after evaluation is
-    // finished. However, hot reload may still find corresponding
-    // KernelProgramInfo object in the heap and it would try to patch it.
-    // To prevent accessing stale kernel binary in ResetObjectTable, bytecode
-    // component of the callee's KernelProgramInfo is reset here.
-    const auto& script = Script::Handle(zone, callee.script());
-    const auto& info =
-        KernelProgramInfo::Handle(zone, script.kernel_program_info());
-    info.set_bytecode_component(Object::null_array());
-  }
-
   return result.raw();
 #endif
 }
@@ -14045,11 +13791,6 @@
   return result.raw();
 }
 
-void KernelProgramInfo::set_bytecode_component(
-    const Array& bytecode_component) const {
-  StorePointer(&raw_ptr()->bytecode_component_, bytecode_component.raw());
-}
-
 ErrorPtr Library::CompileAll(bool ignore_error /* = false */) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -14130,33 +13871,6 @@
   return Error::null();
 }
 
-ErrorPtr Library::ReadAllBytecode() {
-  Thread* thread = Thread::Current();
-  ASSERT(thread->IsMutatorThread());
-  Zone* zone = thread->zone();
-  Error& error = Error::Handle(zone);
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      Isolate::Current()->object_store()->libraries());
-  Library& lib = Library::Handle(zone);
-  Class& cls = Class::Handle(zone);
-  for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
-    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
-    while (it.HasNext()) {
-      cls = it.GetNextClass();
-      error = cls.EnsureIsFinalized(thread);
-      if (!error.IsNull()) {
-        return error.raw();
-      }
-      error = Compiler::ReadAllBytecode(cls);
-      if (!error.IsNull()) {
-        return error.raw();
-      }
-    }
-  }
-
-  return Error::null();
-}
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 // Return Function::null() if function does not exist in libs.
@@ -14417,8 +14131,7 @@
   for (intptr_t i = 0; i < Length(); i++) {
     intptr_t offset = OffsetFromIndex(i);
     THR_Print("  [pp+0x%" Px "] ", offset);
-    if ((TypeAt(i) == EntryType::kTaggedObject) ||
-        (TypeAt(i) == EntryType::kNativeEntryData)) {
+    if (TypeAt(i) == EntryType::kTaggedObject) {
       const Object& obj = Object::Handle(ObjectAt(i));
       THR_Print("%s (obj)\n", obj.ToCString());
     } else if (TypeAt(i) == EntryType::kNativeFunction) {
@@ -15136,43 +14849,6 @@
 #undef FORMAT2
 }
 
-void ParameterTypeCheck::set_type_or_bound(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->type_or_bound_, value.raw());
-}
-
-void ParameterTypeCheck::set_param(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->param_, value.raw());
-}
-
-void ParameterTypeCheck::set_name(const String& value) const {
-  StorePointer(&raw_ptr()->name_, value.raw());
-}
-
-void ParameterTypeCheck::set_cache(const SubtypeTestCache& value) const {
-  StorePointer(&raw_ptr()->cache_, value.raw());
-}
-
-const char* ParameterTypeCheck::ToCString() const {
-  Zone* zone = Thread::Current()->zone();
-  return zone->PrintToString("ParameterTypeCheck(%" Pd " %s %s %s)", index(),
-                             Object::Handle(zone, param()).ToCString(),
-                             Object::Handle(zone, type_or_bound()).ToCString(),
-                             Object::Handle(zone, name()).ToCString());
-}
-
-ParameterTypeCheckPtr ParameterTypeCheck::New() {
-  ParameterTypeCheck& result = ParameterTypeCheck::Handle();
-  {
-    ObjectPtr raw =
-        Object::Allocate(ParameterTypeCheck::kClassId,
-                         ParameterTypeCheck::InstanceSize(), Heap::kOld);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-  }
-  result.set_index(0);
-  return result.raw();
-}
-
 void SingleTargetCache::set_target(const Code& value) const {
   StorePointer(&raw_ptr()->target_, value.raw());
 }
@@ -17266,235 +16942,6 @@
   reader.DumpSourcePositions(relative_addresses ? 0 : PayloadStart());
 }
 
-void Bytecode::Disassemble(DisassemblyFormatter* formatter) const {
-#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (!FLAG_support_disassembler) {
-    return;
-  }
-  uword start = PayloadStart();
-  intptr_t size = Size();
-  if (formatter == NULL) {
-    KernelBytecodeDisassembler::Disassemble(start, start + size, *this);
-  } else {
-    KernelBytecodeDisassembler::Disassemble(start, start + size, formatter,
-                                            *this);
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-}
-
-BytecodePtr Bytecode::New(uword instructions,
-                          intptr_t instructions_size,
-                          intptr_t instructions_offset,
-                          const ObjectPool& object_pool) {
-  ASSERT(Object::bytecode_class() != Class::null());
-  Bytecode& result = Bytecode::Handle();
-  {
-    uword size = Bytecode::InstanceSize();
-    ObjectPtr raw = Object::Allocate(Bytecode::kClassId, size, Heap::kOld);
-    NoSafepointScope no_safepoint;
-    result ^= raw;
-    result.set_instructions(instructions);
-    result.set_instructions_size(instructions_size);
-    result.set_object_pool(object_pool);
-    result.set_pc_descriptors(Object::empty_descriptors());
-    result.set_instructions_binary_offset(instructions_offset);
-    result.set_source_positions_binary_offset(0);
-    result.set_local_variables_binary_offset(0);
-  }
-  return result.raw();
-}
-
-ExternalTypedDataPtr Bytecode::GetBinary(Zone* zone) const {
-  const Function& func = Function::Handle(zone, function());
-  if (func.IsNull()) {
-    return ExternalTypedData::null();
-  }
-  const Script& script = Script::Handle(zone, func.script());
-  const KernelProgramInfo& info =
-      KernelProgramInfo::Handle(zone, script.kernel_program_info());
-  return info.metadata_payloads();
-}
-
-TokenPosition Bytecode::GetTokenIndexOfPC(uword return_address) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  if (!HasSourcePositions()) {
-    return TokenPosition::kNoSource;
-  }
-  uword pc_offset = return_address - PayloadStart();
-  // pc_offset could equal to bytecode size if the last instruction is Throw.
-  ASSERT(pc_offset <= static_cast<uword>(Size()));
-  kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                               *this);
-  TokenPosition token_pos = TokenPosition::kNoSource;
-  while (iter.MoveNext()) {
-    if (pc_offset <= iter.PcOffset()) {
-      break;
-    }
-    token_pos = iter.TokenPos();
-  }
-  return token_pos;
-#endif
-}
-
-intptr_t Bytecode::GetTryIndexAtPc(uword return_address) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  intptr_t try_index = -1;
-  const uword pc_offset = return_address - PayloadStart();
-  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-  while (iter.MoveNext()) {
-    // PC descriptors for try blocks in bytecode are generated in pairs,
-    // marking start and end of a try block.
-    // See BytecodeReaderHelper::ReadExceptionsTable for details.
-    const intptr_t current_try_index = iter.TryIndex();
-    const uword start_pc = iter.PcOffset();
-    if (pc_offset < start_pc) {
-      break;
-    }
-    const bool has_next = iter.MoveNext();
-    ASSERT(has_next);
-    const uword end_pc = iter.PcOffset();
-    if (start_pc <= pc_offset && pc_offset < end_pc) {
-      ASSERT(try_index < current_try_index);
-      try_index = current_try_index;
-    }
-  }
-  return try_index;
-#endif
-}
-
-uword Bytecode::GetFirstDebugCheckOpcodePc() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  uword pc = PayloadStart();
-  const uword end_pc = pc + Size();
-  while (pc < end_pc) {
-    if (KernelBytecode::IsDebugCheckOpcode(
-            reinterpret_cast<const KBCInstr*>(pc))) {
-      return pc;
-    }
-    pc = KernelBytecode::Next(pc);
-  }
-  return 0;
-#endif
-}
-
-uword Bytecode::GetDebugCheckedOpcodeReturnAddress(uword from_offset,
-                                                   uword to_offset) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  uword pc = PayloadStart() + from_offset;
-  const uword end_pc = pc + (to_offset - from_offset);
-  while (pc < end_pc) {
-    uword next_pc = KernelBytecode::Next(pc);
-    if (KernelBytecode::IsDebugCheckedOpcode(
-            reinterpret_cast<const KBCInstr*>(pc))) {
-      // Return the pc after the opcode, i.e. its 'return address'.
-      return next_pc;
-    }
-    pc = next_pc;
-  }
-  return 0;
-#endif
-}
-
-const char* Bytecode::ToCString() const {
-  return Thread::Current()->zone()->PrintToString("Bytecode(%s)",
-                                                  QualifiedName());
-}
-
-static const char* BytecodeStubName(const Bytecode& bytecode) {
-  if (bytecode.raw() == Object::implicit_getter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitGetter";
-  } else if (bytecode.raw() == Object::implicit_setter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitSetter";
-  } else if (bytecode.raw() ==
-             Object::implicit_static_getter_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_ImplicitStaticGetter";
-  } else if (bytecode.raw() == Object::method_extractor_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_MethodExtractor";
-  } else if (bytecode.raw() == Object::invoke_closure_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_InvokeClosure";
-  } else if (bytecode.raw() == Object::invoke_field_bytecode().raw()) {
-    return "[Bytecode Stub] VMInternal_InvokeField";
-  }
-  return "[unknown stub]";
-}
-
-const char* Bytecode::Name() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name =
-      String::Handle(zone, fun.UserVisibleName()).ToCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-const char* Bytecode::QualifiedName() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name =
-      String::Handle(zone, fun.QualifiedScrubbedName()).ToCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-const char* Bytecode::FullyQualifiedName() const {
-  Zone* zone = Thread::Current()->zone();
-  const Function& fun = Function::Handle(zone, function());
-  if (fun.IsNull()) {
-    return BytecodeStubName(*this);
-  }
-  const char* function_name = fun.ToFullyQualifiedCString();
-  return zone->PrintToString("[Bytecode] %s", function_name);
-}
-
-bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(ObjectPtr raw_obj) const {
-  return BytecodeLayout::ContainsPC(raw_obj, pc_);
-}
-
-BytecodePtr Bytecode::FindCode(uword pc) {
-  Thread* thread = Thread::Current();
-  HeapIterationScope heap_iteration_scope(thread);
-  SlowFindRawBytecodeVisitor visitor(pc);
-  ObjectPtr needle = thread->heap()->FindOldObject(&visitor);
-  if (needle != Bytecode::null()) {
-    return static_cast<BytecodePtr>(needle);
-  }
-  return Bytecode::null();
-}
-
-LocalVarDescriptorsPtr Bytecode::GetLocalVarDescriptors() const {
-#if defined(PRODUCT) || defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-  return LocalVarDescriptors::null();
-#else
-  Zone* zone = Thread::Current()->zone();
-  auto& var_descs = LocalVarDescriptors::Handle(zone, var_descriptors());
-  if (var_descs.IsNull()) {
-    const auto& func = Function::Handle(zone, function());
-    ASSERT(!func.IsNull());
-    var_descs =
-        kernel::BytecodeReader::ComputeLocalVarDescriptors(zone, func, *this);
-    ASSERT(!var_descs.IsNull());
-    set_var_descriptors(var_descs);
-  }
-  return var_descs.raw();
-#endif
-}
-
 intptr_t Context::GetLevel() const {
   intptr_t level = 0;
   Context& parent_ctx = Context::Handle(parent());
@@ -24358,7 +23805,6 @@
 }
 
 ReceivePortPtr ReceivePort::New(Dart_Port id,
-                                const String& debug_name,
                                 bool is_control_port,
                                 Heap::Space space) {
   ASSERT(id != ILLEGAL_PORT);
@@ -24366,8 +23812,6 @@
   Zone* zone = thread->zone();
   const SendPort& send_port =
       SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id()));
-  const StackTrace& allocation_location_ =
-      HasStack() ? GetCurrentStackTrace(0) : StackTrace::Handle();
 
   ReceivePort& result = ReceivePort::Handle(zone);
   {
@@ -24376,9 +23820,6 @@
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
-    result.StorePointer(&result.raw_ptr()->debug_name_, debug_name.raw());
-    result.StorePointer(&result.raw_ptr()->allocation_location_,
-                        allocation_location_.raw());
   }
   if (is_control_port) {
     PortMap::SetPortState(id, PortMap::kControlPort);
@@ -24767,7 +24208,6 @@
   auto& function = Function::Handle(zone);
   auto& code_object = Object::Handle(zone);
   auto& code = Code::Handle(zone);
-  auto& bytecode = Bytecode::Handle(zone);
 
   NoSafepointScope no_allocation;
   GrowableArray<const Function*> inlined_functions;
@@ -24841,77 +24281,65 @@
         buffer.AddString("<asynchronous suspension>\n");
       } else {
         intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
-        if (code_object.IsCode()) {
-          code ^= code_object.raw();
-          ASSERT(code.IsFunctionCode());
-          function = code.function();
-          const uword pc = code.PayloadStart() + pc_offset;
+        ASSERT(code_object.IsCode());
+        code ^= code_object.raw();
+        ASSERT(code.IsFunctionCode());
+        function = code.function();
+        const uword pc = code.PayloadStart() + pc_offset;
 #if defined(DART_PRECOMPILED_RUNTIME)
-          // When printing non-symbolic frames, we normally print call
-          // addresses, not return addresses, by subtracting one from the PC to
-          // get an address within the preceding instruction.
-          //
-          // The one exception is a normal closure registered as a listener on a
-          // future. In this case, the returned pc_offset is 0, as the closure
-          // is invoked with the value of the resolved future. Thus, we must
-          // report the return address, as returning a value before the closure
-          // payload will cause failures to decode the frame using DWARF info.
-          const bool is_future_listener = pc_offset == 0;
-          const uword call_addr = is_future_listener ? pc : pc - 1;
-          if (FLAG_dwarf_stack_traces_mode) {
-            // If we have access to the owning function and it would be
-            // invisible in a symbolic stack trace, don't show this frame.
-            // (We can't do the same for inlined functions, though.)
-            if (!FLAG_show_invisible_frames && !function.IsNull() &&
-                !function.is_visible()) {
-              continue;
-            }
-            // This output is formatted like Android's debuggerd. Note debuggerd
-            // prints call addresses instead of return addresses.
-            buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
-            PrintNonSymbolicStackFrameBody(
-                &buffer, call_addr, isolate_instructions, vm_instructions);
-            frame_index++;
-            continue;
-          } else if (function.IsNull()) {
-            // We can't print the symbolic information since the owner was not
-            // retained, so instead print the static symbol + offset like the
-            // non-symbolic stack traces.
-            PrintSymbolicStackFrameIndex(&buffer, frame_index);
-            PrintNonSymbolicStackFrameBody(
-                &buffer, call_addr, isolate_instructions, vm_instructions);
-            frame_index++;
+        // When printing non-symbolic frames, we normally print call
+        // addresses, not return addresses, by subtracting one from the PC to
+        // get an address within the preceding instruction.
+        //
+        // The one exception is a normal closure registered as a listener on a
+        // future. In this case, the returned pc_offset is 0, as the closure
+        // is invoked with the value of the resolved future. Thus, we must
+        // report the return address, as returning a value before the closure
+        // payload will cause failures to decode the frame using DWARF info.
+        const bool is_future_listener = pc_offset == 0;
+        const uword call_addr = is_future_listener ? pc : pc - 1;
+        if (FLAG_dwarf_stack_traces_mode) {
+          // If we have access to the owning function and it would be
+          // invisible in a symbolic stack trace, don't show this frame.
+          // (We can't do the same for inlined functions, though.)
+          if (!FLAG_show_invisible_frames && !function.IsNull() &&
+              !function.is_visible()) {
             continue;
           }
+          // This output is formatted like Android's debuggerd. Note debuggerd
+          // prints call addresses instead of return addresses.
+          buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
+          PrintNonSymbolicStackFrameBody(&buffer, call_addr,
+                                         isolate_instructions, vm_instructions);
+          frame_index++;
+          continue;
+        } else if (function.IsNull()) {
+          // We can't print the symbolic information since the owner was not
+          // retained, so instead print the static symbol + offset like the
+          // non-symbolic stack traces.
+          PrintSymbolicStackFrameIndex(&buffer, frame_index);
+          PrintNonSymbolicStackFrameBody(&buffer, call_addr,
+                                         isolate_instructions, vm_instructions);
+          frame_index++;
+          continue;
+        }
 #endif
-          if (code.is_optimized() && stack_trace.expand_inlined()) {
-            code.GetInlinedFunctionsAtReturnAddress(
-                pc_offset, &inlined_functions, &inlined_token_positions);
-            ASSERT(inlined_functions.length() >= 1);
-            for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
-              const auto& inlined = *inlined_functions[j];
-              auto const pos = inlined_token_positions[j];
-              if (FLAG_show_invisible_frames || function.is_visible()) {
-                PrintSymbolicStackFrame(zone, &buffer, inlined, pos,
-                                        frame_index);
-                frame_index++;
-              }
+        if (code.is_optimized() && stack_trace.expand_inlined()) {
+          code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
+                                                  &inlined_token_positions);
+          ASSERT(inlined_functions.length() >= 1);
+          for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
+            const auto& inlined = *inlined_functions[j];
+            auto const pos = inlined_token_positions[j];
+            if (FLAG_show_invisible_frames || function.is_visible()) {
+              PrintSymbolicStackFrame(zone, &buffer, inlined, pos, frame_index);
+              frame_index++;
             }
-          } else if (FLAG_show_invisible_frames || function.is_visible()) {
-            auto const pos = code.GetTokenIndexOfPC(pc);
-            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
-            frame_index++;
           }
-        } else {
-          ASSERT(code_object.IsBytecode());
-          bytecode ^= code_object.raw();
-          function = bytecode.function();
-          if (FLAG_show_invisible_frames || function.is_visible()) {
-            uword pc = bytecode.PayloadStart() + pc_offset;
-            auto const pos = bytecode.GetTokenIndexOfPC(pc);
-            PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
-            frame_index++;
-          }
+        } else if (FLAG_show_invisible_frames || function.is_visible()) {
+          auto const pos = code.GetTokenIndexOfPC(pc);
+          PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
+          frame_index++;
         }
       }
     }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index aa9b52e..903ad3d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -429,14 +429,6 @@
   V(ExceptionHandlers, empty_exception_handlers)                               \
   V(Array, extractor_parameter_types)                                          \
   V(Array, extractor_parameter_names)                                          \
-  V(Bytecode, implicit_getter_bytecode)                                        \
-  V(Bytecode, implicit_setter_bytecode)                                        \
-  V(Bytecode, implicit_static_getter_bytecode)                                 \
-  V(Bytecode, method_extractor_bytecode)                                       \
-  V(Bytecode, invoke_closure_bytecode)                                         \
-  V(Bytecode, invoke_field_bytecode)                                           \
-  V(Bytecode, nsm_dispatcher_bytecode)                                         \
-  V(Bytecode, dynamic_invocation_forwarder_bytecode)                           \
   V(Instance, sentinel)                                                        \
   V(Instance, transition_sentinel)                                             \
   V(Instance, unknown_constant)                                                \
@@ -486,7 +478,6 @@
     return kernel_program_info_class_;
   }
   static ClassPtr code_class() { return code_class_; }
-  static ClassPtr bytecode_class() { return bytecode_class_; }
   static ClassPtr instructions_class() { return instructions_class_; }
   static ClassPtr instructions_section_class() {
     return instructions_section_class_;
@@ -510,7 +501,6 @@
     return unhandled_exception_class_;
   }
   static ClassPtr unwind_error_class() { return unwind_error_class_; }
-  static ClassPtr dyncalltypecheck_class() { return dyncalltypecheck_class_; }
   static ClassPtr singletargetcache_class() { return singletargetcache_class_; }
   static ClassPtr unlinkedcall_class() { return unlinkedcall_class_; }
   static ClassPtr monomorphicsmiablecall_class() {
@@ -792,7 +782,7 @@
   static ClassPtr kernel_program_info_class_;  // Class of KernelProgramInfo vm
                                                // object.
   static ClassPtr code_class_;                 // Class of the Code vm object.
-  static ClassPtr bytecode_class_;      // Class of the Bytecode vm object.
+
   static ClassPtr instructions_class_;  // Class of the Instructions vm object.
   static ClassPtr instructions_section_class_;  // Class of InstructionsSection.
   static ClassPtr object_pool_class_;      // Class of the ObjectPool vm object.
@@ -804,7 +794,6 @@
   static ClassPtr deopt_info_class_;            // Class of DeoptInfo.
   static ClassPtr context_class_;            // Class of the Context vm object.
   static ClassPtr context_scope_class_;      // Class of ContextScope vm object.
-  static ClassPtr dyncalltypecheck_class_;   // Class of ParameterTypeCheck.
   static ClassPtr singletargetcache_class_;  // Class of SingleTargetCache.
   static ClassPtr unlinkedcall_class_;       // Class of UnlinkedCall.
   static ClassPtr
@@ -1436,25 +1425,11 @@
   CodePtr allocation_stub() const { return raw_ptr()->allocation_stub_; }
   void set_allocation_stub(const Code& value) const;
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return ClassLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    ClassLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -1462,46 +1437,11 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return ClassLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    ClassLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   void DisableAllocationStub() const;
 
   ArrayPtr constants() const;
@@ -1791,7 +1731,6 @@
   friend class Instance;
   friend class Object;
   friend class Type;
-  friend class InterpreterHelpers;
   friend class Intrinsifier;
   friend class ProgramWalker;
   friend class Precompiler;
@@ -1850,41 +1789,6 @@
   friend class Class;
 };
 
-class ParameterTypeCheck : public Object {
- public:
-  // The FP-relative index of the parameter in a bytecode frame (after optional
-  // parameter marshalling) whose assignability needs to be checked, or 0 if
-  // this is a type parameter check.
-  intptr_t index() const { return raw_ptr()->index_; }
-  void set_index(intptr_t i) const { StoreNonPointer(&raw_ptr()->index_, i); }
-
-  // The type parameter to whose bound needs to be checked, or null if this is
-  // an ordinary parameter check.
-  AbstractTypePtr param() const { return raw_ptr()->param_; }
-  void set_param(const AbstractType& t) const;
-
-  // FP[index] assignable to type, OR param is subtype of bound.
-  AbstractTypePtr type_or_bound() const { return raw_ptr()->type_or_bound_; }
-  void set_type_or_bound(const AbstractType& t) const;
-
-  // The parameter or type parameter's name to use in an error message.
-  StringPtr name() const { return raw_ptr()->name_; }
-  void set_name(const String& n) const;
-
-  SubtypeTestCachePtr cache() const { return raw_ptr()->cache_; }
-  void set_cache(const SubtypeTestCache& c) const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(ParameterTypeCheckLayout));
-  }
-
-  static ParameterTypeCheckPtr New();
-
- private:
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck, Object);
-  friend class Class;
-};
-
 class SingleTargetCache : public Object {
  public:
   CodePtr target() const { return raw_ptr()->target_; }
@@ -2424,7 +2328,6 @@
   friend class Class;
   friend class VMDeserializationRoots;
   friend class ICDataTestTask;
-  friend class Interpreter;
   friend class VMSerializationRoots;
   friend class SnapshotWriter;
 };
@@ -2693,7 +2596,6 @@
   void AttachCode(const Code& value) const;
   void SetInstructions(const Code& value) const;
   void ClearCode() const;
-  void ClearBytecode() const;
 
   // Disables optimized code and switches to unoptimized code.
   void SwitchToUnoptimizedCode() const;
@@ -2731,9 +2633,6 @@
   void set_unoptimized_code(const Code& value) const;
   bool HasCode() const;
   static bool HasCode(FunctionPtr function);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  static inline bool HasBytecode(FunctionPtr function);
-#endif
 
   static intptr_t code_offset() { return OFFSET_OF(FunctionLayout, code_); }
 
@@ -2757,15 +2656,6 @@
     return OFFSET_OF(FunctionLayout, unchecked_entry_point_);
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  bool IsBytecodeAllowed(Zone* zone) const;
-  void AttachBytecode(const Bytecode& bytecode) const;
-  BytecodePtr bytecode() const { return raw_ptr()->bytecode_; }
-  inline bool HasBytecode() const;
-#else
-  inline bool HasBytecode() const { return false; }
-#endif
-
   virtual intptr_t Hash() const;
 
   // Returns true if there is at least one debugger breakpoint
@@ -2952,10 +2842,6 @@
     return (kind() == FunctionLayout::kConstructor) && is_static();
   }
 
-  static bool ClosureBodiesContainNonCovariantTypeArgumentChecks() {
-    return FLAG_enable_interpreter;
-  }
-
   static bool ClosureBodiesContainNonCovariantArgumentChecks() {
     return FLAG_precompiled_mode || FLAG_lazy_dispatchers;
   }
@@ -3034,9 +2920,7 @@
   }
 
   bool NeedsTypeArgumentTypeChecks() const {
-    return (IsClosureFunction() &&
-            ClosureBodiesContainNonCovariantTypeArgumentChecks()) ||
-           !(is_static() || (kind() == FunctionLayout::kConstructor));
+    return !(is_static() || (kind() == FunctionLayout::kConstructor));
   }
 
   bool NeedsMonomorphicCheckedEntry(Zone* zone) const;
@@ -3140,25 +3024,11 @@
 
 #undef DEFINE_GETTERS_AND_SETTERS
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return FunctionLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FunctionLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -3166,48 +3036,13 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return FunctionLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FunctionLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  void InheritBinaryDeclarationFrom(const Function& src) const;
-  void InheritBinaryDeclarationFrom(const Field& src) const;
+  void InheritKernelOffsetFrom(const Function& src) const;
+  void InheritKernelOffsetFrom(const Field& src) const;
 
   static const intptr_t kMaxInstructionCount = (1 << 16) - 1;
 
@@ -3256,9 +3091,6 @@
 
   bool HasOptimizedCode() const;
 
-  // Whether the function is ready for compiler optimizations.
-  bool ShouldCompilerOptimize() const;
-
   // Returns true if the argument counts are valid for calling this function.
   // Otherwise, it returns false and the reason (if error_message is not NULL).
   bool AreValidArgumentCounts(intptr_t num_type_arguments,
@@ -4206,25 +4038,11 @@
         GenericCovariantImplBit::update(value, raw_ptr()->kind_bits_));
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return FieldLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FieldLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -4232,47 +4050,12 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return FieldLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    FieldLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  void InheritBinaryDeclarationFrom(const Field& src) const;
+  void InheritKernelOffsetFrom(const Field& src) const;
 
   ExternalTypedDataPtr KernelData() const;
 
@@ -4600,7 +4383,6 @@
                             const Object& owner,
                             TokenPosition token_pos,
                             TokenPosition end_token_pos);
-  friend class Interpreter;              // Access to bit field.
   friend class StoreInstanceFieldInstr;  // Generated code access to bit field.
 
   enum {
@@ -4947,27 +4729,22 @@
   void AddClassMetadata(const Class& cls,
                         const Object& tl_owner,
                         TokenPosition token_pos,
-                        intptr_t kernel_offset,
-                        intptr_t bytecode_offset) const;
+                        intptr_t kernel_offset) const;
   void AddFieldMetadata(const Field& field,
                         TokenPosition token_pos,
-                        intptr_t kernel_offset,
-                        intptr_t bytecode_offset) const;
+                        intptr_t kernel_offset) const;
   void AddFunctionMetadata(const Function& func,
                            TokenPosition token_pos,
-                           intptr_t kernel_offset,
-                           intptr_t bytecode_offset) const;
+                           intptr_t kernel_offset) const;
   void AddLibraryMetadata(const Object& tl_owner,
                           TokenPosition token_pos,
-                          intptr_t kernel_offset,
-                          intptr_t bytecode_offset) const;
+                          intptr_t kernel_offset) const;
   void AddTypeParameterMetadata(const TypeParameter& param,
                                 TokenPosition token_pos) const;
   void CloneMetadataFrom(const Library& from_library,
                          const Function& from_fun,
                          const Function& to_fun) const;
   ObjectPtr GetMetadata(const Object& obj) const;
-  ArrayPtr GetExtendedMetadata(const Object& obj, intptr_t count) const;
 
   // Tries to finds a @pragma annotation on [object].
   //
@@ -5089,25 +4866,11 @@
   ExternalTypedDataPtr kernel_data() const { return raw_ptr()->kernel_data_; }
   void set_kernel_data(const ExternalTypedData& data) const;
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  intptr_t binary_declaration_offset() const {
-    return LibraryLayout::BinaryDeclarationOffset::decode(
-        raw_ptr()->binary_declaration_);
-  }
-  void set_binary_declaration_offset(intptr_t value) const {
-    ASSERT(value >= 0);
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    LibraryLayout::BinaryDeclarationOffset::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
 #else
-    ASSERT(!is_declared_in_bytecode());
-    return binary_declaration_offset();
+    return raw_ptr()->kernel_offset_;
 #endif
   }
 
@@ -5115,46 +4878,11 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    ASSERT(!is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
+    ASSERT(value >= 0);
+    StoreNonPointer(&raw_ptr()->kernel_offset_, value);
 #endif
   }
 
-  intptr_t bytecode_offset() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return 0;
-#else
-    ASSERT(is_declared_in_bytecode());
-    return binary_declaration_offset();
-#endif
-  }
-
-  void set_bytecode_offset(intptr_t value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    UNREACHABLE();
-#else
-    ASSERT(is_declared_in_bytecode());
-    set_binary_declaration_offset(value);
-#endif
-  }
-
-  bool is_declared_in_bytecode() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    return LibraryLayout::IsDeclaredInBytecode::decode(
-        raw_ptr()->binary_declaration_);
-#endif
-  }
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  void set_is_declared_in_bytecode(bool value) const {
-    StoreNonPointer(&raw_ptr()->binary_declaration_,
-                    LibraryLayout::IsDeclaredInBytecode::update(
-                        value, raw_ptr()->binary_declaration_));
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   static LibraryPtr LookupLibrary(Thread* thread, const String& url);
   static LibraryPtr GetLibrary(intptr_t index);
 
@@ -5184,8 +4912,6 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Finalize all classes in all libraries.
   static ErrorPtr FinalizeAllClasses();
-  // Eagerly read all bytecode.
-  static ErrorPtr ReadAllBytecode();
 #endif
 
 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -5278,8 +5004,7 @@
   void AddMetadata(const Object& owner,
                    const String& name,
                    TokenPosition token_pos,
-                   intptr_t kernel_offset,
-                   intptr_t bytecode_offset) const;
+                   intptr_t kernel_offset) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Library, Object);
 
@@ -5411,9 +5136,6 @@
                        const Smi& name_index,
                        const Class& klass) const;
 
-  ArrayPtr bytecode_component() const { return raw_ptr()->bytecode_component_; }
-  void set_bytecode_component(const Array& bytecode_component) const;
-
  private:
   static KernelProgramInfoPtr New();
 
@@ -5486,15 +5208,13 @@
 
   template <std::memory_order order = std::memory_order_relaxed>
   ObjectPtr ObjectAt(intptr_t index) const {
-    ASSERT((TypeAt(index) == EntryType::kTaggedObject) ||
-           (TypeAt(index) == EntryType::kNativeEntryData));
+    ASSERT(TypeAt(index) == EntryType::kTaggedObject);
     return LoadPointer<ObjectPtr, order>(&(EntryAddr(index)->raw_obj_));
   }
 
   template <std::memory_order order = std::memory_order_relaxed>
   void SetObjectAt(intptr_t index, const Object& obj) const {
     ASSERT((TypeAt(index) == EntryType::kTaggedObject) ||
-           (TypeAt(index) == EntryType::kNativeEntryData) ||
            (TypeAt(index) == EntryType::kImmediate && obj.IsSmi()));
     StorePointer<ObjectPtr, order>(&EntryAddr(index)->raw_obj_, obj.raw());
   }
@@ -6920,151 +6640,6 @@
   friend class CodeKeyValueTrait;  // for UncheckedEntryPointOffset
 };
 
-class Bytecode : public Object {
- public:
-  uword instructions() const { return raw_ptr()->instructions_; }
-
-  uword PayloadStart() const { return instructions(); }
-  intptr_t Size() const { return raw_ptr()->instructions_size_; }
-
-  ObjectPoolPtr object_pool() const { return raw_ptr()->object_pool_; }
-
-  bool ContainsInstructionAt(uword addr) const {
-    return BytecodeLayout::ContainsPC(raw(), addr);
-  }
-
-  PcDescriptorsPtr pc_descriptors() const { return raw_ptr()->pc_descriptors_; }
-  void set_pc_descriptors(const PcDescriptors& descriptors) const {
-    ASSERT(descriptors.IsOld());
-    StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
-  }
-
-  void Disassemble(DisassemblyFormatter* formatter = NULL) const;
-
-  ExceptionHandlersPtr exception_handlers() const {
-    return raw_ptr()->exception_handlers_;
-  }
-  void set_exception_handlers(const ExceptionHandlers& handlers) const {
-    ASSERT(handlers.IsOld());
-    StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
-  }
-
-  FunctionPtr function() const { return raw_ptr()->function_; }
-
-  void set_function(const Function& function) const {
-    ASSERT(function.IsOld());
-    StorePointer(&raw_ptr()->function_, function.raw());
-  }
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(BytecodeLayout));
-  }
-  static BytecodePtr New(uword instructions,
-                         intptr_t instructions_size,
-                         intptr_t instructions_offset,
-                         const ObjectPool& object_pool);
-
-  ExternalTypedDataPtr GetBinary(Zone* zone) const;
-
-  TokenPosition GetTokenIndexOfPC(uword return_address) const;
-  intptr_t GetTryIndexAtPc(uword return_address) const;
-
-  // Return the pc of the first 'DebugCheck' opcode of the bytecode.
-  // Return 0 if none is found.
-  uword GetFirstDebugCheckOpcodePc() const;
-
-  // Return the pc after the first 'debug checked' opcode in the range.
-  // Return 0 if none is found.
-  uword GetDebugCheckedOpcodeReturnAddress(uword from_offset,
-                                           uword to_offset) const;
-
-  intptr_t instructions_binary_offset() const {
-    return raw_ptr()->instructions_binary_offset_;
-  }
-  void set_instructions_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->instructions_binary_offset_, value);
-  }
-
-  intptr_t source_positions_binary_offset() const {
-    return raw_ptr()->source_positions_binary_offset_;
-  }
-  void set_source_positions_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->source_positions_binary_offset_, value);
-  }
-  bool HasSourcePositions() const {
-    return (source_positions_binary_offset() != 0);
-  }
-
-  intptr_t local_variables_binary_offset() const {
-    return raw_ptr()->local_variables_binary_offset_;
-  }
-  void set_local_variables_binary_offset(intptr_t value) const {
-    StoreNonPointer(&raw_ptr()->local_variables_binary_offset_, value);
-  }
-  bool HasLocalVariablesInfo() const {
-    return (local_variables_binary_offset() != 0);
-  }
-
-  LocalVarDescriptorsPtr var_descriptors() const {
-#if defined(PRODUCT)
-    UNREACHABLE();
-    return nullptr;
-#else
-    return raw_ptr()->var_descriptors_;
-#endif
-  }
-  void set_var_descriptors(const LocalVarDescriptors& value) const {
-#if defined(PRODUCT)
-    UNREACHABLE();
-#else
-    ASSERT(value.IsOld());
-    StorePointer(&raw_ptr()->var_descriptors_, value.raw());
-#endif
-  }
-
-  // Will compute local var descriptors if necessary.
-  LocalVarDescriptorsPtr GetLocalVarDescriptors() const;
-
-  const char* Name() const;
-  const char* QualifiedName() const;
-  const char* FullyQualifiedName() const;
-
-  class SlowFindRawBytecodeVisitor : public FindObjectVisitor {
-   public:
-    explicit SlowFindRawBytecodeVisitor(uword pc) : pc_(pc) {}
-    virtual ~SlowFindRawBytecodeVisitor() {}
-
-    // Check if object matches find condition.
-    virtual bool FindObject(ObjectPtr obj) const;
-
-   private:
-    const uword pc_;
-
-    DISALLOW_COPY_AND_ASSIGN(SlowFindRawBytecodeVisitor);
-  };
-
-  static BytecodePtr FindCode(uword pc);
-
- private:
-  void set_instructions(uword instructions) const {
-    StoreNonPointer(&raw_ptr()->instructions_, instructions);
-  }
-  void set_instructions_size(intptr_t size) const {
-    StoreNonPointer(&raw_ptr()->instructions_size_, size);
-  }
-  void set_object_pool(const ObjectPool& object_pool) const {
-    StorePointer(&raw_ptr()->object_pool_, object_pool.raw());
-  }
-
-  friend class BytecodeDeserializationCluster;
-  friend class ObjectLayout;  // For ObjectLayout::SizeFromClass().
-  friend class BytecodeLayout;
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(Bytecode, Object);
-  friend class Class;
-  friend class SnapshotWriter;
-};
-
 class Context : public Object {
  public:
   ContextPtr parent() const { return raw_ptr()->parent_; }
@@ -10038,7 +9613,6 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
   friend class Class;
   friend class ImmutableArray;
-  friend class Interpreter;
   friend class Object;
   friend class String;
 };
@@ -10986,17 +10560,10 @@
   InstancePtr handler() const { return raw_ptr()->handler_; }
   void set_handler(const Instance& value) const;
 
-  StackTracePtr allocation_location() const {
-    return raw_ptr()->allocation_location_;
-  }
-
-  StringPtr debug_name() const { return raw_ptr()->debug_name_; }
-
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(ReceivePortLayout));
   }
   static ReceivePortPtr New(Dart_Port id,
-                            const String& debug_name,
                             bool is_control_port,
                             Heap::Space space = Heap::kNew);
 
@@ -11499,16 +11066,6 @@
 #endif
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-bool Function::HasBytecode() const {
-  return raw_ptr()->bytecode_ != Bytecode::null();
-}
-
-bool Function::HasBytecode(FunctionPtr function) {
-  return function->ptr()->bytecode_ != Bytecode::null();
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 intptr_t Field::HostOffset() const {
   ASSERT(is_instance());  // Valid only for dart instance fields.
   return (Smi::Value(raw_ptr()->host_offset_or_field_id_) * kWordSize);
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 866ae6c..bea8d14 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -176,57 +176,6 @@
   }
 }
 
-void CallSiteResetter::RebindStaticTargets(const Bytecode& bytecode) {
-  // Iterate over the Bytecode's object pool and reset all ICDatas.
-  pool_ = bytecode.object_pool();
-  ASSERT(!pool_.IsNull());
-
-  for (intptr_t i = 0; i < pool_.Length(); i++) {
-    ObjectPool::EntryType entry_type = pool_.TypeAt(i);
-    if (entry_type != ObjectPool::EntryType::kTaggedObject) {
-      continue;
-    }
-    object_ = pool_.ObjectAt(i);
-    if (object_.IsFunction()) {
-      const Function& old_function = Function::Cast(object_);
-      if (old_function.IsClosureFunction()) {
-        continue;
-      }
-      name_ = old_function.name();
-      new_cls_ = old_function.Owner();
-      if (new_cls_.IsTopLevel()) {
-        new_lib_ = new_cls_.library();
-        new_function_ = new_lib_.LookupLocalFunction(name_);
-      } else {
-        new_function_ = Resolver::ResolveFunction(zone_, new_cls_, name_);
-      }
-      if (!new_function_.IsNull() &&
-          (new_function_.is_static() == old_function.is_static()) &&
-          (new_function_.kind() == old_function.kind())) {
-        pool_.SetObjectAt(i, new_function_);
-      } else {
-        VTIR_Print("Cannot rebind function %s\n", old_function.ToCString());
-      }
-    } else if (object_.IsField()) {
-      const Field& old_field = Field::Cast(object_);
-      name_ = old_field.name();
-      new_cls_ = old_field.Owner();
-      if (new_cls_.IsTopLevel()) {
-        new_lib_ = new_cls_.library();
-        new_field_ = new_lib_.LookupLocalField(name_);
-      } else {
-        new_field_ = new_cls_.LookupField(name_);
-      }
-      if (!new_field_.IsNull() &&
-          (new_field_.is_static() == old_field.is_static())) {
-        pool_.SetObjectAt(i, new_field_);
-      } else {
-        VTIR_Print("Cannot rebind field %s\n", old_field.ToCString());
-      }
-    }
-  }
-}
-
 void CallSiteResetter::ResetCaches(const ObjectPool& pool) {
   for (intptr_t i = 0; i < pool.Length(); i++) {
     ObjectPool::EntryType entry_type = pool.TypeAt(i);
@@ -493,10 +442,8 @@
       PatchClass::Handle(PatchClass::New(*this, Script::Handle(script())));
   ASSERT(!patch.IsNull());
   const Library& lib = Library::Handle(library());
-  if (!lib.is_declared_in_bytecode()) {
-    patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
-    patch.set_library_kernel_offset(lib.kernel_offset());
-  }
+  patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
+  patch.set_library_kernel_offset(lib.kernel_offset());
 
   const Array& funcs = Array::Handle(current_functions());
   Function& func = Function::Handle();
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 0af790b..0d6553e 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -321,12 +321,6 @@
   if (!code.IsNull()) {
     jsobj.AddProperty("code", code);
   }
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Bytecode& bytecode = Bytecode::Handle(this->bytecode());
-  if (!bytecode.IsNull()) {
-    jsobj.AddProperty("_bytecode", bytecode);
-  }
-#endif  // !DART_PRECOMPILED_RUNTIME
   Array& ics = Array::Handle(ic_data_array());
   if (!ics.IsNull()) {
     jsobj.AddProperty("_icDataArray", ics);
@@ -575,53 +569,6 @@
         }
       }
     }
-
-    if (is_declared_in_bytecode()) {
-      // Make sure top level class (containing annotations) is fully loaded.
-      EnsureTopLevelClassIsFinalized();
-      Array& metadata = Array::Handle(GetExtendedMetadata(*this, 1));
-      if (metadata.Length() != 0) {
-        // Library has the only element in the extended metadata.
-        metadata ^= metadata.At(0);
-        if (!metadata.IsNull()) {
-          Thread* thread = Thread::Current();
-          auto& desc = Array::Handle();
-          auto& target_uri = String::Handle();
-          auto& is_export = Bool::Handle();
-          auto& is_deferred = Bool::Handle();
-          for (intptr_t i = 0, n = metadata.Length(); i < n; ++i) {
-            desc ^= metadata.At(i);
-            // Each dependency is represented as an array with the following
-            // layout:
-            //  [0] = target library URI (String)
-            //  [1] = is_export (bool)
-            //  [2] = is_deferred (bool)
-            //  [3] = prefix (String or null)
-            //  ...
-            // The library dependencies are encoded by getLibraryAnnotations(),
-            // pkg/vm/lib/bytecode/gen_bytecode.dart.
-            target_uri ^= desc.At(0);
-            is_export ^= desc.At(1);
-            is_deferred ^= desc.At(2);
-            prefix_name ^= desc.At(3);
-
-            target = Library::LookupLibrary(thread, target_uri);
-            if (target.IsNull()) {
-              continue;
-            }
-
-            JSONObject jsdep(&jsarr);
-            jsdep.AddProperty("isDeferred", is_deferred.value());
-            jsdep.AddProperty("isExport", is_export.value());
-            jsdep.AddProperty("isImport", !is_export.value());
-            if (!prefix_name.IsNull()) {
-              jsdep.AddProperty("prefix", prefix_name.ToCString());
-            }
-            jsdep.AddProperty("target", target);
-          }
-        }
-      }
-    }
   }
   {
     JSONArray jsarr(&jsobj, "variables");
@@ -723,11 +670,6 @@
           jsentry.AddProperty("kind", "Immediate");
           jsentry.AddProperty64("value", imm);
           break;
-        case ObjectPool::EntryType::kNativeEntryData:
-          obj = ObjectAt(i);
-          jsentry.AddProperty("kind", "NativeEntryData");
-          jsentry.AddProperty("value", obj);
-          break;
         case ObjectPool::EntryType::kNativeFunction:
           imm = RawValueAt(i);
           jsentry.AddProperty("kind", "NativeFunction");
@@ -809,10 +751,6 @@
   Object::PrintJSONImpl(stream, ref);
 }
 
-void ParameterTypeCheck::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Object::PrintJSONImpl(stream, ref);
-}
-
 void SingleTargetCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Object", ref);
@@ -894,8 +832,6 @@
 }
 
 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  // N.B. This is polymorphic with Bytecode.
-
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Code", ref);
   jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp(),
@@ -957,47 +893,6 @@
   PrintJSONInlineIntervals(&jsobj);
 }
 
-void Bytecode::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  // N.B. This is polymorphic with Code.
-
-  JSONObject jsobj(stream);
-  AddCommonObjectProperties(&jsobj, "Code", ref);
-  int64_t compile_timestamp = 0;
-  jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp,
-                          PayloadStart());
-  const char* qualified_name = QualifiedName();
-  const char* vm_name = Name();
-  AddNameProperties(&jsobj, qualified_name, vm_name);
-
-  jsobj.AddProperty("kind", "Dart");
-  jsobj.AddProperty("_optimized", false);
-  jsobj.AddProperty("_intrinsic", false);
-  jsobj.AddProperty("_native", false);
-  if (ref) {
-    return;
-  }
-  const Function& fun = Function::Handle(function());
-  jsobj.AddProperty("function", fun);
-  jsobj.AddPropertyF("_startAddress", "%" Px "", PayloadStart());
-  jsobj.AddPropertyF("_endAddress", "%" Px "", PayloadStart() + Size());
-  jsobj.AddProperty("_alive", true);
-  const ObjectPool& obj_pool = ObjectPool::Handle(object_pool());
-  jsobj.AddProperty("_objectPool", obj_pool);
-  {
-    JSONArray jsarr(&jsobj, "_disassembly");
-    DisassembleToJSONStream formatter(jsarr);
-    Disassemble(&formatter);
-  }
-  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
-  if (!descriptors.IsNull()) {
-    JSONObject desc(&jsobj, "_descriptors");
-    descriptors.PrintToJSONObject(&desc, false);
-  }
-
-  { JSONArray inlined_functions(&jsobj, "_inlinedFunctions"); }
-  { JSONArray inline_intervals(&jsobj, "_inlinedIntervals"); }
-}
-
 void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   // TODO(turnidge): Should the user level type for Context be Context
@@ -1557,15 +1452,7 @@
 }
 
 void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  JSONObject obj(stream);
-  Instance::PrintSharedInstanceJSON(&obj, ref);
-  const StackTrace& allocation_location_ =
-      StackTrace::Handle(allocation_location());
-  const String& debug_name_ = String::Handle(debug_name());
-  obj.AddProperty("kind", "ReceivePort");
-  obj.AddProperty64("portId", Id());
-  obj.AddProperty("debugName", debug_name_.ToCString());
-  obj.AddProperty("allocationLocation", allocation_location_);
+  Instance::PrintJSONImpl(stream, ref);
 }
 
 void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index fe789af..dc51e07 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -160,7 +160,6 @@
   RW(Instance, stack_overflow)                                                 \
   RW(Instance, out_of_memory)                                                  \
   RW(Function, lookup_port_handler)                                            \
-  RW(Function, lookup_open_ports)                                              \
   RW(Function, handle_message_function)                                        \
   RW(Function, growable_list_factory)                                          \
   RW(Function, simple_instance_of_function)                                    \
@@ -171,7 +170,6 @@
   RW(Function, async_star_move_next_helper)                                    \
   RW(Function, complete_on_async_return)                                       \
   RW(Class, async_star_stream_controller)                                      \
-  RW(Array, bytecode_attributes)                                               \
   RW(GrowableObjectArray, llvm_constant_pool)                                  \
   RW(GrowableObjectArray, llvm_function_pool)                                  \
   RW(Array, llvm_constant_hash_table)                                          \
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 4941d60..f4bf134 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -308,12 +308,6 @@
   num_stack_locals_ = num_stack_locals;
 }
 
-void ParsedFunction::AllocateBytecodeVariables(intptr_t num_stack_locals) {
-  ASSERT(!function().IsIrregexpFunction());
-  first_parameter_index_ = VariableIndex(function().num_fixed_parameters());
-  num_stack_locals_ = num_stack_locals;
-}
-
 void ParsedFunction::SetCovariantParameters(
     const BitVector* covariant_parameters) {
   ASSERT(covariant_parameters_ == nullptr);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 42eaf4b..76b6249 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -165,7 +165,6 @@
 
   void AllocateVariables();
   void AllocateIrregexpVariables(intptr_t num_stack_locals);
-  void AllocateBytecodeVariables(intptr_t num_stack_locals);
 
   void record_await() { have_seen_await_expr_ = true; }
   bool have_seen_await() const { return have_seen_await_expr_; }
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index bc8199f..d12a763 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -557,16 +557,6 @@
         pc_(reinterpret_cast<uword*>(pc)),
         fp_(reinterpret_cast<uword*>(fp)) {}
 
-  bool IsInterpretedFrame(uword* fp) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-    return false;
-#else
-    Interpreter* interpreter = thread_->interpreter();
-    if (interpreter == nullptr) return false;
-    return interpreter->HasFrame(reinterpret_cast<uword>(fp));
-#endif
-  }
-
   void walk() {
     RELEASE_ASSERT(StubCode::HasBeenInitialized());
     if (thread_->isolate()->IsDeoptimizing()) {
@@ -575,45 +565,21 @@
     }
 
     uword* exit_fp = reinterpret_cast<uword*>(thread_->top_exit_frame_info());
-    bool in_interpreted_frame;
     bool has_exit_frame = exit_fp != 0;
     if (has_exit_frame) {
-      if (IsInterpretedFrame(exit_fp)) {
-        // Exited from interpreter.
-        pc_ = 0;
-        fp_ = exit_fp;
-        in_interpreted_frame = true;
-        RELEASE_ASSERT(IsInterpretedFrame(fp_));
-      } else {
-        // Exited from compiled code.
-        pc_ = 0;
-        fp_ = exit_fp;
-        in_interpreted_frame = false;
-      }
+      // Exited from compiled code.
+      pc_ = 0;
+      fp_ = exit_fp;
 
       // Skip exit frame.
-      pc_ = CallerPC(in_interpreted_frame);
-      fp_ = CallerFP(in_interpreted_frame);
+      pc_ = CallerPC();
+      fp_ = CallerFP();
 
-      // Can only move between interpreted and compiled frames after an exit
-      // frame.
-      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
     } else {
-      if (thread_->vm_tag() == VMTag::kDartCompiledTagId) {
+      if (thread_->vm_tag() == VMTag::kDartTagId) {
         // Running compiled code.
         // Use the FP and PC from the thread interrupt or simulator; already set
         // in the constructor.
-        in_interpreted_frame = false;
-      } else if (thread_->vm_tag() == VMTag::kDartInterpretedTagId) {
-        // Running interpreter.
-#if defined(DART_PRECOMPILED_RUNTIME)
-        UNREACHABLE();
-#else
-        pc_ = reinterpret_cast<uword*>(thread_->interpreter()->get_pc());
-        fp_ = reinterpret_cast<uword*>(thread_->interpreter()->get_fp());
-#endif
-        in_interpreted_frame = true;
-        RELEASE_ASSERT(IsInterpretedFrame(fp_));
       } else {
         // No Dart on the stack; caller shouldn't use this walker.
         UNREACHABLE();
@@ -622,8 +588,7 @@
 
     sample_->set_exit_frame_sample(has_exit_frame);
 
-    if (!has_exit_frame && !in_interpreted_frame &&
-        (CallerPC(in_interpreted_frame) == EntryMarker(in_interpreted_frame))) {
+    if (!has_exit_frame && (CallerPC() == EntryMarker())) {
       // During the prologue of a function, CallerPC will return the caller's
       // caller. For most frames, the missing PC will be added during profile
       // processing. However, during this stack walk, it can cause us to fail
@@ -637,62 +602,53 @@
 
     for (;;) {
       // Skip entry frame.
-      if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
-                                     in_interpreted_frame)) {
+      if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_))) {
         pc_ = 0;
-        fp_ = ExitLink(in_interpreted_frame);
+        fp_ = ExitLink();
         if (fp_ == 0) {
           break;  // End of Dart stack.
         }
-        in_interpreted_frame = IsInterpretedFrame(fp_);
 
         // Skip exit frame.
-        pc_ = CallerPC(in_interpreted_frame);
-        fp_ = CallerFP(in_interpreted_frame);
+        pc_ = CallerPC();
+        fp_ = CallerFP();
 
         // At least one frame between exit and next entry frame.
-        RELEASE_ASSERT(!StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
-                                                   in_interpreted_frame));
+        RELEASE_ASSERT(
+            !StubCode::InInvocationStub(reinterpret_cast<uword>(pc_)));
       }
 
       if (!Append(reinterpret_cast<uword>(pc_), reinterpret_cast<uword>(fp_))) {
         break;  // Sample is full.
       }
 
-      pc_ = CallerPC(in_interpreted_frame);
-      fp_ = CallerFP(in_interpreted_frame);
-
-      // Can only move between interpreted and compiled frames after an exit
-      // frame.
-      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
+      pc_ = CallerPC();
+      fp_ = CallerFP();
     }
   }
 
  private:
-  uword* CallerPC(bool interp) const {
+  uword* CallerPC() const {
     ASSERT(fp_ != NULL);
-    uword* caller_pc_ptr =
-        fp_ + (interp ? kKBCSavedCallerPcSlotFromFp : kSavedCallerPcSlotFromFp);
+    uword* caller_pc_ptr = fp_ + kSavedCallerPcSlotFromFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_pc_ptr, kWordSize);
     ASAN_UNPOISON(caller_pc_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_pc_ptr);
   }
 
-  uword* CallerFP(bool interp) const {
+  uword* CallerFP() const {
     ASSERT(fp_ != NULL);
-    uword* caller_fp_ptr =
-        fp_ + (interp ? kKBCSavedCallerFpSlotFromFp : kSavedCallerFpSlotFromFp);
+    uword* caller_fp_ptr = fp_ + kSavedCallerFpSlotFromFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_fp_ptr, kWordSize);
     ASAN_UNPOISON(caller_fp_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_fp_ptr);
   }
 
-  uword* ExitLink(bool interp) const {
+  uword* ExitLink() const {
     ASSERT(fp_ != NULL);
-    uword* exit_link_ptr =
-        fp_ + (interp ? kKBCExitLinkSlotFromEntryFp : kExitLinkSlotFromEntryFp);
+    uword* exit_link_ptr = fp_ + kExitLinkSlotFromEntryFp;
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(exit_link_ptr, kWordSize);
     ASAN_UNPOISON(exit_link_ptr, kWordSize);
@@ -701,8 +657,7 @@
 
   // Note because of stack guards, it is important that this marker lives
   // above FP.
-  uword* EntryMarker(bool interp) const {
-    ASSERT(!interp);
+  uword* EntryMarker() const {
     ASSERT(fp_ != NULL);
     uword* entry_marker_ptr = fp_ + kSavedCallerPcSlotFromFp + 1;
     // MSan/ASan are unaware of frames initialized by generated code.
@@ -1454,8 +1409,6 @@
   void VisitObject(ObjectPtr raw_obj) {
     if (raw_obj->IsCode()) {
       table_->Add(Code::Handle(Code::RawCast(raw_obj)));
-    } else if (raw_obj->IsBytecode()) {
-      table_->Add(Bytecode::Handle(Bytecode::RawCast(raw_obj)));
     }
   }
 
@@ -1506,7 +1459,7 @@
 
 void CodeLookupTable::Add(const Object& code) {
   ASSERT(!code.IsNull());
-  ASSERT(code.IsCode() || code.IsBytecode());
+  ASSERT(code.IsCode());
   CodeDescriptor* cd = new CodeDescriptor(AbstractCode(code.raw()));
   code_objects_.Add(cd);
 }
@@ -1683,11 +1636,6 @@
                                                uword pc_marker,
                                                uword* stack_buffer) {
   ASSERT(cd != NULL);
-  if (cd->code().IsBytecode()) {
-    // Bytecode frame build is atomic from the profiler's perspective: no
-    // missing frame.
-    return;
-  }
   const Code& code = Code::Handle(Code::RawCast(cd->code().raw()));
   ASSERT(!code.IsNull());
   // Some stubs (and intrinsics) do not push a frame onto the stack leaving
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index fad8a30..4f92d72 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -457,26 +457,20 @@
 class AbstractCode {
  public:
   explicit AbstractCode(ObjectPtr code) : code_(Object::Handle(code)) {
-    ASSERT(code_.IsNull() || code_.IsCode() || code_.IsBytecode());
+    ASSERT(code_.IsNull() || code_.IsCode());
   }
 
   ObjectPtr raw() const { return code_.raw(); }
   const Object* handle() const { return &code_; }
 
   uword PayloadStart() const {
-    if (code_.IsCode()) {
-      return Code::Cast(code_).PayloadStart();
-    } else {
-      return Bytecode::Cast(code_).PayloadStart();
-    }
+    ASSERT(code_.IsCode());
+    return Code::Cast(code_).PayloadStart();
   }
 
   uword Size() const {
-    if (code_.IsCode()) {
-      return Code::Cast(code_).Size();
-    } else {
-      return Bytecode::Cast(code_).Size();
-    }
+    ASSERT(code_.IsCode());
+    return Code::Cast(code_).Size();
   }
 
   int64_t compile_timestamp() const {
@@ -490,8 +484,6 @@
   const char* Name() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).Name();
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).Name();
     } else {
       return "";
     }
@@ -501,8 +493,6 @@
     if (code_.IsCode()) {
       return Code::Cast(code_).QualifiedName(
           NameFormattingParams(Object::kUserVisibleName));
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).QualifiedName();
     } else {
       return "";
     }
@@ -511,8 +501,6 @@
   bool IsStubCode() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).IsStubCode();
-    } else if (code_.IsBytecode()) {
-      return (Bytecode::Cast(code_).function() == Function::null());
     } else {
       return false;
     }
@@ -537,8 +525,6 @@
   ObjectPtr owner() const {
     if (code_.IsCode()) {
       return Code::Cast(code_).owner();
-    } else if (code_.IsBytecode()) {
-      return Bytecode::Cast(code_).function();
     } else {
       return Object::null();
     }
@@ -546,7 +532,6 @@
 
   bool IsNull() const { return code_.IsNull(); }
   bool IsCode() const { return code_.IsCode(); }
-  bool IsBytecode() const { return code_.IsBytecode(); }
 
   bool is_optimized() const {
     if (code_.IsCode()) {
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 3c91049..4f88ae4 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -1218,11 +1218,6 @@
                     (*inlined_token_positions)[i].ToCString());
         }
       }
-    } else if (profile_code->code().IsBytecode()) {
-      // No inlining in bytecode.
-      const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                   profile_code->code().raw());
-      token_position = bc.GetTokenIndexOfPC(pc);
     }
 
     if (code.IsNull() || (inlined_functions == NULL) ||
@@ -1676,11 +1671,6 @@
                   (*inlined_token_positions)[i].ToCString());
       }
     }
-  } else if (profile_code->code().IsBytecode()) {
-    // No inlining in bytecode.
-    const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                 profile_code->code().raw());
-    token_position = bc.GetTokenIndexOfPC(pc);
   }
 
   if (code.IsNull() || (inlined_functions == NULL) ||
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 1ff4b49..6c3589e 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -372,11 +372,6 @@
       inlined_functions_cache_.Get(pc, code, sample_, index_,
                                    &inlined_functions_,
                                    &inlined_token_positions_, &token_position);
-    } else if (profile_code->code().IsBytecode()) {
-      // No inlining in bytecode.
-      const Bytecode& bc = Bytecode::CheckedHandle(Thread::Current()->zone(),
-                                                   profile_code->code().raw());
-      token_position = bc.GetTokenIndexOfPC(pc);
     }
 
     if (code.IsNull() || (inlined_functions_ == NULL) ||
@@ -458,23 +453,16 @@
 
     // Move down from the root.
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   // Query with a time filter where no allocations occurred.
@@ -658,23 +646,16 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   // Turn off allocation tracing for A.
@@ -754,30 +735,20 @@
 
     // Move down from the root.
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT_EQ(0, walker.CurrentExclusiveTicks());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(3, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT_EQ(3, walker.CurrentInclusiveTicks());
-      EXPECT_EQ(0, walker.CurrentExclusiveTicks());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_EQ(3, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT_EQ(3, walker.CurrentInclusiveTicks());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT_EQ(3, walker.CurrentInclusiveTicks());
+    EXPECT_EQ(0, walker.CurrentExclusiveTicks());
+    EXPECT(!walker.Down());
   }
 }
 ISOLATE_UNIT_TEST_CASE(Profiler_FunctionTicks) {
@@ -839,15 +810,13 @@
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
 
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(3, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(3, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT(walker.Down());
@@ -902,19 +871,13 @@
     EXPECT_EQ(1, profile.sample_count());
     ProfileStackWalker walker(&profile);
 
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("Double_add", walker.VMTagName());
-      EXPECT_STREQ("[Unoptimized] double._add", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] double.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("Double_add", walker.VMTagName());
+    EXPECT_STREQ("[Unoptimized] double._add", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] double.+", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   double_class.SetTraceAllocation(false);
@@ -971,19 +934,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateArray", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] new _List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateArray", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] new _List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateArray", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] new _List", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   array_class.SetTraceAllocation(false);
@@ -1065,15 +1021,10 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateContext", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateContext", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateContext", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   context_class.SetTraceAllocation(false);
@@ -1131,14 +1082,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_SUBSTRING("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate _Closure", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate _Closure", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-    }
+    EXPECT(walker.Down());
     EXPECT_SUBSTRING("foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
@@ -1204,19 +1153,12 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateTypedData", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] new Float32List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Stub] AllocateFloat32Array", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] new Float32List", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Stub] AllocateFloat32Array", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] new Float32List", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   float32_list_class.SetTraceAllocation(false);
@@ -1291,17 +1233,10 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("String_concat", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] _StringBase.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("[Unoptimized] _StringBase.+", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT_STREQ("[Unoptimized] _StringBase.+", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
@@ -1376,31 +1311,16 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
-                   walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
-      EXPECT_STREQ("Internal_allocateOneByteString", walker.VMTagName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
-                   walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] String._allocate", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] String._concatAll", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
+                 walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
@@ -1435,7 +1355,6 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -1562,7 +1481,6 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -1728,95 +1646,52 @@
     ProfileStackWalker walker(&profile);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (FLAG_enable_interpreter) {
-      EXPECT_STREQ("[Bytecode] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] orange", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] napkin", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] mayo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] lemon", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] kindle", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] jeep", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] ice", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] haystack", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] granola", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] fred", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] elephant", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] dog", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] cantaloupe", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] banana", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] apple", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] secondInit", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] init", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] go", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Bytecode] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    } else {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] orange", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] napkin", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] mayo", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] lemon", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] kindle", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] jeep", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] ice", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] haystack", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] granola", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] fred", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] elephant", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] dog", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] cantaloupe", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] banana", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] apple", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] secondInit", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] init", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] go", walker.CurrentName());
-      EXPECT(walker.Down());
-      EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
-      EXPECT(!walker.Down());
-    }
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] orange", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] napkin", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] mayo", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] lemon", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] kindle", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] jeep", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] ice", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] haystack", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] granola", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] fred", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] elephant", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] dog", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] cantaloupe", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] banana", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] apple", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] secondInit", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] init", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] go", walker.CurrentName());
+    EXPECT(walker.Down());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
+    EXPECT(!walker.Down());
   }
 }
 
@@ -1866,15 +1741,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -1893,7 +1766,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -2029,15 +1901,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -2071,7 +1941,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
@@ -2237,15 +2106,13 @@
     ProfileStackWalker walker(&profile, true);
 
     EXPECT_STREQ("DRT_AllocateObject", walker.VMTagName());
-    if (!FLAG_enable_interpreter) {
 #if defined(TARGET_ARCH_IA32)  // Alloc. stub not impl. for ia32.
-      EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
+    EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
 #else
-      EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
+    EXPECT_STREQ("[Stub] AllocateObjectSlow", walker.CurrentName());
 #endif
-      EXPECT_EQ(1, walker.CurrentExclusiveTicks());
-      EXPECT(walker.Down());
-    }
+    EXPECT_EQ(1, walker.CurrentExclusiveTicks());
+    EXPECT(walker.Down());
     EXPECT_STREQ("B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.CurrentInclusiveTicks());
     EXPECT_STREQ("A", walker.CurrentToken());
@@ -2284,7 +2151,6 @@
   DisableBackgroundCompilationScope dbcs;
   // Optimize quickly.
   SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 5);
-  SetFlagScope<int> sfs2(&FLAG_compilation_counter_threshold, 0);
 
   const char* kScript =
       "class A {\n"
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index a0917e3..5b7319c 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -749,7 +749,6 @@
    public:
     explicit DedupPcDescriptorsVisitor(Zone* zone)
         : Dedupper(zone),
-          bytecode_(Bytecode::Handle(zone)),
           pc_descriptor_(PcDescriptors::Handle(zone)) {
       if (Snapshot::IncludesCode(Dart::vm_snapshot_kind())) {
         // Prefer existing objects in the VM isolate.
@@ -763,17 +762,7 @@
       code.set_pc_descriptors(pc_descriptor_);
     }
 
-    void VisitFunction(const Function& function) {
-      bytecode_ = function.bytecode();
-      if (bytecode_.IsNull()) return;
-      if (bytecode_.InVMIsolateHeap()) return;
-      pc_descriptor_ = bytecode_.pc_descriptors();
-      pc_descriptor_ = Dedup(pc_descriptor_);
-      bytecode_.set_pc_descriptors(pc_descriptor_);
-    }
-
    private:
-    Bytecode& bytecode_;
     PcDescriptors& pc_descriptor_;
   };
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 3dfd910..1feb330 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -505,7 +505,6 @@
   }
 
 REGULAR_VISITOR(Class)
-REGULAR_VISITOR(Bytecode)
 REGULAR_VISITOR(Type)
 REGULAR_VISITOR(TypeRef)
 REGULAR_VISITOR(TypeParameter)
@@ -520,7 +519,6 @@
 REGULAR_VISITOR(Library)
 REGULAR_VISITOR(LibraryPrefix)
 REGULAR_VISITOR(Namespace)
-REGULAR_VISITOR(ParameterTypeCheck)
 REGULAR_VISITOR(SingleTargetCache)
 REGULAR_VISITOR(UnlinkedCall)
 REGULAR_VISITOR(MonomorphicSmiableCall)
@@ -645,16 +643,6 @@
 #endif
 }
 
-bool BytecodeLayout::ContainsPC(ObjectPtr raw_obj, uword pc) {
-  if (raw_obj->IsBytecode()) {
-    BytecodePtr raw_bytecode = static_cast<BytecodePtr>(raw_obj);
-    uword start = raw_bytecode->ptr()->instructions_;
-    uword size = raw_bytecode->ptr()->instructions_size_;
-    return (pc - start) <= size;  // pc may point past last instruction.
-  }
-  return false;
-}
-
 intptr_t ObjectPoolLayout::VisitObjectPoolPointers(
     ObjectPoolPtr raw_obj,
     ObjectPointerVisitor* visitor) {
@@ -664,8 +652,7 @@
   for (intptr_t i = 0; i < length; ++i) {
     ObjectPool::EntryType entry_type =
         ObjectPool::TypeBits::decode(entry_bits[i]);
-    if ((entry_type == ObjectPool::EntryType::kTaggedObject) ||
-        (entry_type == ObjectPool::EntryType::kNativeEntryData)) {
+    if (entry_type == ObjectPool::EntryType::kTaggedObject) {
       visitor->VisitPointer(&entries[i].raw_obj_);
     }
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 21a02e7..4a713b6 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -92,8 +92,6 @@
   friend class object;                                                         \
   friend class ObjectLayout;                                                   \
   friend class Heap;                                                           \
-  friend class Interpreter;                                                    \
-  friend class InterpreterHelpers;                                             \
   friend class Simulator;                                                      \
   friend class SimulatorHelpers;                                               \
   friend class OffsetsTable;                                                   \
@@ -694,8 +692,6 @@
   friend class Instance;                // StorePointer
   friend class StackFrame;              // GetCodeObject assertion.
   friend class CodeLookupTableBuilder;  // profiler
-  friend class Interpreter;
-  friend class InterpreterHelpers;
   friend class Simulator;
   friend class SimulatorHelpers;
   friend class ObjectLocator;
@@ -804,9 +800,7 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   friend class Instance;
@@ -943,7 +937,7 @@
   // an integer or a double. It includes the two bits for the receiver, even
   // though currently we do not have information from TFA that allows the
   // receiver to be unboxed.
-  class UnboxedParameterBitmap {
+  class alignas(8) UnboxedParameterBitmap {
    public:
     static constexpr intptr_t kBitsPerParameter = 2;
     static constexpr intptr_t kParameterBitmask = (1 << kBitsPerParameter) - 1;
@@ -1044,7 +1038,6 @@
     return reinterpret_cast<ObjectPtr*>(&ic_data_array_);
   }
   CodePtr code_;  // Currently active code. Accessed from generated code.
-  NOT_IN_PRECOMPILED(BytecodePtr bytecode_);
   NOT_IN_PRECOMPILED(CodePtr unoptimized_code_);  // Unoptimized code, keep it
                                                   // after optimization.
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -1053,6 +1046,7 @@
   VISIT_TO(ObjectPtr, unoptimized_code_);
 #endif
 
+  NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
   NOT_IN_PRECOMPILED(TokenPosition token_pos_);
   NOT_IN_PRECOMPILED(TokenPosition end_token_pos_);
   uint32_t kind_tag_;  // See Function::KindTagBits.
@@ -1093,17 +1087,13 @@
   F(int, int8_t, inlining_depth)
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 
 #define DECLARE(return_type, type, name) type name##_;
   JIT_FUNCTION_COUNTERS(DECLARE)
 #undef DECLARE
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-  NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
 };
 
 class ClosureDataLayout : public ObjectLayout {
@@ -1226,9 +1216,7 @@
                                 // kInvalidCid otherwise.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   // Offset to the guarded length field inside an instance of class matching
@@ -1376,9 +1364,7 @@
   uint8_t flags_;         // BitField for LibraryFlags.
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  typedef BitField<uint32_t, bool, 0, 1> IsDeclaredInBytecode;
-  typedef BitField<uint32_t, uint32_t, 1, 31> BinaryDeclarationOffset;
-  uint32_t binary_declaration_;
+  uint32_t kernel_offset_;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   friend class Class;
@@ -1409,7 +1395,6 @@
   ExternalTypedDataPtr metadata_mappings_;
   ArrayPtr scripts_;
   ArrayPtr constants_;
-  ArrayPtr bytecode_component_;
   GrowableObjectArrayPtr potential_natives_;
   GrowableObjectArrayPtr potential_pragma_functions_;
   ExternalTypedDataPtr constants_table_;
@@ -1553,39 +1538,6 @@
   friend class CallSiteResetter;
 };
 
-class BytecodeLayout : public ObjectLayout {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(Bytecode);
-
-  uword instructions_;
-  intptr_t instructions_size_;
-
-  VISIT_FROM(ObjectPtr, object_pool_);
-  ObjectPoolPtr object_pool_;
-  FunctionPtr function_;
-  ArrayPtr closures_;
-  ExceptionHandlersPtr exception_handlers_;
-  PcDescriptorsPtr pc_descriptors_;
-  NOT_IN_PRODUCT(LocalVarDescriptorsPtr var_descriptors_);
-#if defined(PRODUCT)
-  VISIT_TO(ObjectPtr, pc_descriptors_);
-#else
-  VISIT_TO(ObjectPtr, var_descriptors_);
-#endif
-
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) {
-    return reinterpret_cast<ObjectPtr*>(&pc_descriptors_);
-  }
-
-  int32_t instructions_binary_offset_;
-  int32_t source_positions_binary_offset_;
-  int32_t local_variables_binary_offset_;
-
-  static bool ContainsPC(ObjectPtr raw_obj, uword pc);
-
-  friend class Function;
-  friend class StackFrame;
-};
-
 class ObjectPoolLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool);
 
@@ -2014,18 +1966,6 @@
   friend class SnapshotReader;
 };
 
-class ParameterTypeCheckLayout : public ObjectLayout {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck);
-  intptr_t index_;
-  VISIT_FROM(ObjectPtr, param_);
-  AbstractTypePtr param_;
-  AbstractTypePtr type_or_bound_;
-  StringPtr name_;
-  SubtypeTestCachePtr cache_;
-  VISIT_TO(ObjectPtr, cache_);
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
-};
-
 class SingleTargetCacheLayout : public ObjectLayout {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
   VISIT_FROM(ObjectPtr, target_);
@@ -2744,8 +2684,6 @@
  protected:
   VISIT_FROM(RawCompressed, length_)
   VISIT_TO(RawCompressed, length_)
-
-  friend class BytecodeLayout;
 };
 
 class PointerLayout : public PointerBaseLayout {
@@ -2788,9 +2726,7 @@
   VISIT_FROM(ObjectPtr, send_port_)
   SendPortPtr send_port_;
   InstancePtr handler_;
-  StringPtr debug_name_;
-  StackTracePtr allocation_location_;
-  VISIT_TO(ObjectPtr, allocation_location_)
+  VISIT_TO(ObjectPtr, handler_)
 };
 
 class TransferableTypedDataLayout : public InstanceLayout {
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 6a6bc68..7276a25 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -89,7 +89,6 @@
   F(KernelProgramInfo, metadata_mappings_)                                     \
   F(KernelProgramInfo, scripts_)                                               \
   F(KernelProgramInfo, constants_)                                             \
-  F(KernelProgramInfo, bytecode_component_)                                    \
   F(KernelProgramInfo, potential_natives_)                                     \
   F(KernelProgramInfo, potential_pragma_functions_)                            \
   F(KernelProgramInfo, constants_table_)                                       \
@@ -105,18 +104,8 @@
   F(Code, compressed_stackmaps_)                                               \
   F(Code, inlined_id_to_function_)                                             \
   F(Code, code_source_map_)                                                    \
-  F(Bytecode, object_pool_)                                                    \
-  F(Bytecode, instructions_)                                                   \
-  F(Bytecode, function_)                                                       \
-  F(Bytecode, exception_handlers_)                                             \
-  F(Bytecode, pc_descriptors_)                                                 \
-  F(Bytecode, closures_)                                                       \
   F(ExceptionHandlers, handled_types_data_)                                    \
   F(Context, parent_)                                                          \
-  F(ParameterTypeCheck, param_)                                                \
-  F(ParameterTypeCheck, type_or_bound_)                                        \
-  F(ParameterTypeCheck, name_)                                                 \
-  F(ParameterTypeCheck, cache_)                                                \
   F(SingleTargetCache, target_)                                                \
   F(UnlinkedCall, target_name_)                                                \
   F(UnlinkedCall, args_descriptor_)                                            \
@@ -182,8 +171,6 @@
   F(ExternalTypedData, length_)                                                \
   F(ReceivePort, send_port_)                                                   \
   F(ReceivePort, handler_)                                                     \
-  F(ReceivePort, debug_name_)                                                  \
-  F(ReceivePort, allocation_location_)                                         \
   F(StackTrace, async_link_)                                                   \
   F(StackTrace, code_array_)                                                   \
   F(StackTrace, pc_offset_array_)                                              \
@@ -217,7 +204,6 @@
   F(Code, deopt_info_array_)                                                   \
   F(Code, static_calls_target_table_)                                          \
   F(ICData, receivers_static_type_)                                            \
-  F(Function, bytecode_)                                                       \
   F(Function, unoptimized_code_)                                               \
   F(Field, saved_initial_value_)                                               \
   F(Field, type_test_cache_)                                                   \
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 2f36c97..0ec7de3 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -545,7 +545,6 @@
 
 MESSAGE_SNAPSHOT_UNREACHABLE(AbstractType);
 MESSAGE_SNAPSHOT_UNREACHABLE(Bool);
-MESSAGE_SNAPSHOT_UNREACHABLE(Bytecode);
 MESSAGE_SNAPSHOT_UNREACHABLE(ClosureData);
 MESSAGE_SNAPSHOT_UNREACHABLE(Code);
 MESSAGE_SNAPSHOT_UNREACHABLE(CodeSourceMap);
@@ -566,7 +565,6 @@
 MESSAGE_SNAPSHOT_UNREACHABLE(MegamorphicCache);
 MESSAGE_SNAPSHOT_UNREACHABLE(Namespace);
 MESSAGE_SNAPSHOT_UNREACHABLE(ObjectPool);
-MESSAGE_SNAPSHOT_UNREACHABLE(ParameterTypeCheck);
 MESSAGE_SNAPSHOT_UNREACHABLE(PatchClass);
 MESSAGE_SNAPSHOT_UNREACHABLE(PcDescriptors);
 MESSAGE_SNAPSHOT_UNREACHABLE(RedirectionData);
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 2c06da9..7c452bc 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -86,8 +86,6 @@
   ReusableClassHandleScope reused_class_handle(thread);
 #define REUSABLE_CODE_HANDLESCOPE(thread)                                      \
   ReusableCodeHandleScope reused_code_handle(thread);
-#define REUSABLE_BYTECODE_HANDLESCOPE(thread)                                  \
-  ReusableBytecodeHandleScope reused_bytecode_handle(thread);
 #define REUSABLE_ERROR_HANDLESCOPE(thread)                                     \
   ReusableErrorHandleScope reused_error_handle(thread);
 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread)                        \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 4219416..0b4ceb7 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -17,7 +17,6 @@
 #include "vm/flags.h"
 #include "vm/heap/verifier.h"
 #include "vm/instructions.h"
-#include "vm/interpreter.h"
 #include "vm/kernel_isolate.h"
 #include "vm/message.h"
 #include "vm/message_handler.h"
@@ -61,7 +60,6 @@
             false,
             "Trace deoptimization verbose");
 
-DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(int, max_deoptimization_counter_threshold);
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, trace_optimizing_compiler);
@@ -179,7 +177,6 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   const StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame->IsDartFrame());
-  ASSERT(!caller_frame->is_interpreted());
   const Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
   const uword pc_offset = caller_frame->pc() - code.PayloadStart();
 
@@ -496,13 +493,6 @@
   UNREACHABLE();
 }
 
-// Allocate a new SubtypeTestCache for use in interpreted implicit setters.
-// Return value: newly allocated SubtypeTestCache.
-DEFINE_RUNTIME_ENTRY(AllocateSubtypeTestCache, 0) {
-  ASSERT(FLAG_enable_interpreter);
-  arguments.SetReturn(SubtypeTestCache::Handle(zone, SubtypeTestCache::New()));
-}
-
 // Allocate a new context large enough to hold the given number of variables.
 // Arg0: number of variables.
 // Return value: newly allocated context.
@@ -530,76 +520,6 @@
   arguments.SetReturn(cloned_ctx);
 }
 
-// Invoke field getter before dispatch.
-// Arg0: instance.
-// Arg1: field name (may be demangled during call).
-// Return value: field value.
-DEFINE_RUNTIME_ENTRY(GetFieldForDispatch, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  String& name = String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Class& receiver_class = Class::Handle(zone, receiver.clazz());
-  if (Function::IsDynamicInvocationForwarderName(name)) {
-    name = Function::DemangleDynamicInvocationForwarderName(name);
-    arguments.SetArgAt(1, name);  // Reflect change in arguments.
-  }
-  const String& getter_name = String::Handle(zone, Field::GetterName(name));
-  const int kTypeArgsLen = 0;
-  const int kNumArguments = 1;
-  ArgumentsDescriptor args_desc(Array::Handle(
-      zone, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, kNumArguments)));
-  const Function& getter =
-      Function::Handle(zone, Resolver::ResolveDynamicForReceiverClass(
-                                 receiver_class, getter_name, args_desc));
-  ASSERT(!getter.IsNull());  // An InvokeFieldDispatcher function was created.
-  const Array& args = Array::Handle(zone, Array::New(kNumArguments));
-  args.SetAt(0, receiver);
-  const Object& result =
-      Object::Handle(zone, DartEntry::InvokeFunction(getter, args));
-  ThrowIfError(result);
-  arguments.SetReturn(result);
-}
-
-// Check that arguments are valid for the given closure.
-// Arg0: closure
-// Arg1: arguments descriptor
-// Return value: whether the arguments are valid
-DEFINE_RUNTIME_ENTRY(ClosureArgumentsValid, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const auto& closure = Closure::CheckedHandle(zone, arguments.ArgAt(0));
-  const auto& descriptor = Array::CheckedHandle(zone, arguments.ArgAt(1));
-
-  const auto& function = Function::Handle(zone, closure.function());
-  const ArgumentsDescriptor args_desc(descriptor);
-  if (!function.AreValidArguments(args_desc, nullptr)) {
-    arguments.SetReturn(Bool::False());
-  } else if (!closure.IsGeneric(thread) && args_desc.TypeArgsLen() > 0) {
-    // The arguments may be valid for the closure function itself, but if the
-    // closure has delayed type arguments, no type arguments should be provided.
-    arguments.SetReturn(Bool::False());
-  } else {
-    arguments.SetReturn(Bool::True());
-  }
-}
-
-// Resolve 'call' function of receiver.
-// Arg0: receiver (not a closure).
-// Arg1: arguments descriptor
-// Return value: 'call' function'.
-DEFINE_RUNTIME_ENTRY(ResolveCallFunction, 2) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const Array& descriptor = Array::CheckedHandle(zone, arguments.ArgAt(1));
-  ArgumentsDescriptor args_desc(descriptor);
-  ASSERT(!receiver.IsClosure());  // Interpreter tests for closure.
-  Class& cls = Class::Handle(zone, receiver.clazz());
-  Function& call_function = Function::Handle(
-      zone,
-      Resolver::ResolveDynamicForReceiverClass(cls, Symbols::Call(), args_desc,
-                                               /*allow_add=*/false));
-  arguments.SetReturn(call_function);
-}
-
 // Helper routine for tracing a type check.
 static void PrintTypeCheck(const char* message,
                            const Instance& instance,
@@ -888,7 +808,6 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
-      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
@@ -971,7 +890,6 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
-      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
@@ -1059,7 +977,6 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
-  ASSERT(!caller_frame->is_interpreted());
   const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   ASSERT(!caller_code.IsNull());
   ASSERT(caller_code.is_optimized());
@@ -1100,9 +1017,7 @@
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
   Code& orig_stub = Code::Handle(zone);
-  if (!caller_frame->is_interpreted()) {
-    orig_stub = isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
-  }
+  orig_stub = isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
   const Error& error =
       Error::Handle(zone, isolate->debugger()->PauseBreakpoint());
   ThrowIfError(error);
@@ -1217,7 +1132,6 @@
   ASSERT(caller_frame->IsDartFrame());
 
   // Monomorphic/megamorphic calls are only for unoptimized code.
-  if (caller_frame->is_interpreted()) return;
   Zone* zone = thread->zone();
   const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   if (caller_code.is_optimized()) return;
@@ -1249,12 +1163,6 @@
       return;
     }
 
-    // Avoid forcing foreground compilation if target function is still
-    // interpreted.
-    if (FLAG_enable_interpreter && !target_function.HasCode()) {
-      return;
-    }
-
     const Array& data = Array::Handle(zone, ic_data.entries());
     const Code& target = Code::Handle(zone, target_function.EnsureHasCode());
     CodePatcher::PatchInstanceCallAt(caller_frame->pc(), caller_code, data,
@@ -2168,41 +2076,6 @@
       /*use_force_growth=*/true);
 }
 
-// Handles interpreted interface call cache miss.
-//   Arg0: receiver
-//   Arg1: target name
-//   Arg2: arguments descriptor
-//   Returns: target function (can only be null if !FLAG_lazy_dispatchers)
-// Modifies the instance call table in current interpreter.
-DEFINE_RUNTIME_ENTRY(InterpretedInstanceCallMissHandler, 3) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const String& target_name = String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Array& arg_desc = Array::CheckedHandle(zone, arguments.ArgAt(2));
-
-  ArgumentsDescriptor arguments_descriptor(arg_desc);
-  const Class& receiver_class = Class::Handle(zone, receiver.clazz());
-  Function& target_function = Function::Handle(zone);
-  if (receiver_class.EnsureIsFinalized(thread) == Error::null()) {
-    target_function =
-        Resolver::ResolveDynamic(receiver, target_name, arguments_descriptor);
-  }
-
-  // TODO(regis): In order to substitute 'simple_instance_of_function', the 2nd
-  // arg to the call, the type, is needed.
-
-  if (target_function.IsNull()) {
-    target_function =
-        InlineCacheMissHelper(receiver_class, arg_desc, target_name);
-  }
-  ASSERT(!target_function.IsNull() || !FLAG_lazy_dispatchers);
-  arguments.SetReturn(target_function);
-#endif
-}
-
 // Used to find the correct receiver and function to invoke or to fall back to
 // invoking noSuchMethod when lazy dispatchers are disabled. Returns the
 // result of the invocation or an Error.
@@ -2390,37 +2263,6 @@
   arguments.SetReturn(result);
 }
 
-// Invoke appropriate noSuchMethod function (or in the case of no lazy
-// dispatchers, walk the receiver to find the correct method to call).
-// Arg0: receiver
-// Arg1: function name.
-// Arg2: arguments descriptor array.
-// Arg3: arguments array.
-DEFINE_RUNTIME_ENTRY(InvokeNoSuchMethod, 4) {
-  ASSERT(FLAG_enable_interpreter);
-  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
-  const String& original_function_name =
-      String::CheckedHandle(zone, arguments.ArgAt(1));
-  const Array& orig_arguments_desc =
-      Array::CheckedHandle(zone, arguments.ArgAt(2));
-  const Array& orig_arguments = Array::CheckedHandle(zone, arguments.ArgAt(3));
-
-  auto& result = Object::Handle(zone);
-  if (!FLAG_lazy_dispatchers) {
-    // Failing to find the method could be due to the lack of lazy invoke field
-    // dispatchers, so attempt a deeper search before calling noSuchMethod.
-    result = InvokeCallThroughGetterOrNoSuchMethod(
-        thread, zone, receiver, original_function_name, orig_arguments,
-        orig_arguments_desc);
-  } else {
-    result =
-        DartEntry::InvokeNoSuchMethod(thread, receiver, original_function_name,
-                                      orig_arguments, orig_arguments_desc);
-  }
-  ThrowIfError(result);
-  arguments.SetReturn(result);
-}
-
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 // The following code is used to stress test
 //  - deoptimization
@@ -2469,13 +2311,9 @@
     ASSERT(frame != nullptr);
     Code& code = Code::Handle();
     Function& function = Function::Handle();
-    if (frame->is_interpreted()) {
-      function = frame->LookupDartFunction();
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(!code.IsNull());
-      function = code.function();
-    }
+    code = frame->LookupDartCode();
+    ASSERT(!code.IsNull());
+    function = code.function();
     ASSERT(!function.IsNull());
     const char* function_name = nullptr;
     if ((FLAG_deoptimize_filter != nullptr) ||
@@ -2557,13 +2395,9 @@
       int num_vars = 0;
       // Variable locations and number are unknown when precompiling.
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      // NumLocalVariables() can call EnsureHasUnoptimizedCode() for
-      // non-interpreted functions.
       if (!frame->function().ForceOptimize()) {
-        if (!frame->IsInterpreted()) {
-          // Ensure that we have unoptimized code.
-          frame->function().EnsureHasCompiledUnoptimizedCode();
-        }
+        // Ensure that we have unoptimized code.
+        frame->function().EnsureHasCompiledUnoptimizedCode();
         num_vars = frame->NumLocalVariables();
       }
 #endif
@@ -2652,8 +2486,7 @@
 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
 #if defined(USING_SIMULATOR)
   uword stack_pos = Simulator::Current()->get_sp();
-  // If simulator was never called (for example, in pure
-  // interpreted mode) it may return 0 as a value of SPREG.
+  // If simulator was never called it may return 0 as a value of SPREG.
   if (stack_pos == 0) {
     // Use any reasonable value which would not be treated
     // as stack overflow.
@@ -2667,36 +2500,15 @@
   // persist.
   uword stack_overflow_flags = thread->GetAndClearStackOverflowFlags();
 
-  bool interpreter_stack_overflow = false;
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_enable_interpreter) {
-    // Do not allocate an interpreter, if none is allocated yet.
-    Interpreter* interpreter = thread->interpreter();
-    if (interpreter != NULL) {
-      interpreter_stack_overflow =
-          interpreter->get_sp() >= interpreter->overflow_stack_limit();
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
   // If an interrupt happens at the same time as a stack overflow, we
   // process the stack overflow now and leave the interrupt for next
   // time.
-  if (interpreter_stack_overflow || !thread->os_thread()->HasStackHeadroom() ||
+  if (!thread->os_thread()->HasStackHeadroom() ||
       IsCalleeFrameOf(thread->saved_stack_limit(), stack_pos)) {
     if (FLAG_verbose_stack_overflow) {
-      OS::PrintErr("Stack overflow in %s\n",
-                   interpreter_stack_overflow ? "interpreter" : "native code");
+      OS::PrintErr("Stack overflow\n");
       OS::PrintErr("  Native SP = %" Px ", stack limit = %" Px "\n", stack_pos,
                    thread->saved_stack_limit());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      if (thread->interpreter() != nullptr) {
-        OS::PrintErr("  Interpreter SP = %" Px ", stack limit = %" Px "\n",
-                     thread->interpreter()->get_sp(),
-                     thread->interpreter()->overflow_stack_limit());
-      }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
       OS::PrintErr("Call stack:\n");
       OS::PrintErr("size | frame\n");
       StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
@@ -2704,14 +2516,9 @@
       uword fp = stack_pos;
       StackFrame* frame = frames.NextFrame();
       while (frame != NULL) {
-        if (frame->is_interpreted() == interpreter_stack_overflow) {
-          uword delta = interpreter_stack_overflow ? (fp - frame->fp())
-                                                   : (frame->fp() - fp);
-          fp = frame->fp();
-          OS::PrintErr("%4" Pd " %s\n", delta, frame->ToCString());
-        } else {
-          OS::PrintErr("     %s\n", frame->ToCString());
-        }
+        uword delta = (frame->fp() - fp);
+        fp = frame->fp();
+        OS::PrintErr("%4" Pd " %s\n", delta, frame->ToCString());
         frame = frames.NextFrame();
       }
     }
@@ -2756,46 +2563,6 @@
       ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
 }
 
-// This is called from interpreter when function usage counter reached
-// compilation threshold and function needs to be compiled.
-DEFINE_RUNTIME_ENTRY(CompileInterpretedFunction, 1) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
-  ASSERT(!function.IsNull());
-  ASSERT(FLAG_enable_interpreter);
-
-#if !defined(PRODUCT)
-  if (Debugger::IsDebugging(thread, function)) {
-    return;
-  }
-#endif  // !defined(PRODUCT)
-
-  if (FLAG_background_compilation) {
-    if (!BackgroundCompiler::IsDisabled(isolate,
-                                        /* optimizing_compilation = */ false) &&
-        function.is_background_optimizable()) {
-      // Ensure background compiler is running, if not start it.
-      BackgroundCompiler::Start(isolate);
-      // Reduce the chance of triggering a compilation while the function is
-      // being compiled in the background. INT32_MIN should ensure that it
-      // takes long time to trigger a compilation.
-      // Note that the background compilation queue rejects duplicate entries.
-      function.SetUsageCounter(INT32_MIN);
-      isolate->background_compiler()->Compile(function);
-      return;
-    }
-  }
-
-  // Reset usage counter for future optimization.
-  function.SetUsageCounter(0);
-  Object& result =
-      Object::Handle(zone, Compiler::CompileFunction(thread, function));
-  ThrowIfError(result);
-#else
-  UNREACHABLE();
-#endif  // !DART_PRECOMPILED_RUNTIME
-}
-
 // This is called from function that needs to be optimized.
 // The requesting function can be already optimized (reoptimization).
 // Returns the Code object where to continue execution.
@@ -3035,7 +2802,6 @@
 
     // N.B.: Update the pending deopt table before updating the frame. The
     // profiler may attempt a stack walk in between.
-    ASSERT(!frame->is_interpreted());
     thread->isolate()->AddPendingDeopt(frame->fp(), deopt_pc);
     frame->MarkForLazyDeopt();
 
@@ -3057,12 +2823,9 @@
   StackFrame* frame = iterator.NextFrame();
   Code& optimized_code = Code::Handle();
   while (frame != NULL) {
-    if (!frame->is_interpreted()) {
-      optimized_code = frame->LookupDartCode();
-      if (optimized_code.is_optimized() &&
-          !optimized_code.is_force_optimized()) {
-        DeoptimizeAt(optimized_code, frame);
-      }
+    optimized_code = frame->LookupDartCode();
+    if (optimized_code.is_optimized() && !optimized_code.is_force_optimized()) {
+      DeoptimizeAt(optimized_code, frame);
     }
     frame = iterator.NextFrame();
   }
@@ -3410,65 +3173,6 @@
     true /* is_float */,
     reinterpret_cast<RuntimeFunction>(static_cast<UnaryMathCFunction>(&atan)));
 
-// Interpret a function call. Should be called only for non-jitted functions.
-// argc indicates the number of arguments, including the type arguments.
-// argv points to the first argument.
-// If argc < 0, arguments are passed at decreasing memory addresses from argv.
-extern "C" uword /*ObjectPtr*/ InterpretCall(uword /*FunctionPtr*/ function_in,
-                                             uword /*ArrayPtr*/ argdesc_in,
-                                             intptr_t argc,
-                                             ObjectPtr* argv,
-                                             Thread* thread) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  FunctionPtr function = static_cast<FunctionPtr>(function_in);
-  ArrayPtr argdesc = static_cast<ArrayPtr>(argdesc_in);
-  ASSERT(FLAG_enable_interpreter);
-  Interpreter* interpreter = Interpreter::Current();
-#if defined(DEBUG)
-  uword exit_fp = thread->top_exit_frame_info();
-  ASSERT(exit_fp != 0);
-  ASSERT(thread == Thread::Current());
-  // Caller is InterpretCall stub called from generated code.
-  // We stay in "in generated code" execution state when interpreting code.
-  ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
-  ASSERT(!Function::HasCode(function));
-  ASSERT(Function::HasBytecode(function));
-  ASSERT(interpreter != NULL);
-#endif
-  // Tell MemorySanitizer 'argv' is initialized by generated code.
-  if (argc < 0) {
-    MSAN_UNPOISON(argv - argc, -argc * sizeof(ObjectPtr));
-  } else {
-    MSAN_UNPOISON(argv, argc * sizeof(ObjectPtr));
-  }
-  ObjectPtr result = interpreter->Call(function, argdesc, argc, argv, thread);
-  DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
-  if (IsErrorClassId(result->GetClassIdMayBeSmi())) {
-    // Must not leak handles in the caller's zone.
-    HANDLESCOPE(thread);
-    // Protect the result in a handle before transitioning, which may trigger
-    // GC.
-    const Error& error = Error::Handle(Error::RawCast(result));
-    // Propagating an error may cause allocation. Check if we need to block for
-    // a safepoint by switching to "in VM" execution state.
-    TransitionGeneratedToVM transition(thread);
-    Exceptions::PropagateError(error);
-  }
-  return static_cast<uword>(result);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-uword RuntimeEntry::InterpretCallEntry() {
-  uword entry = reinterpret_cast<uword>(InterpretCall);
-#if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry,
-                                               Simulator::kLeafRuntimeCall, 5);
-#endif
-  return entry;
-}
-
 extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
   CHECK_STACK_ALIGNMENT;
   TRACE_RUNTIME_CALL("%s", "EnterSafepoint");
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index bede33e..d4ce293 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -57,8 +57,6 @@
   NOT_IN_PRECOMPILED(void Call(compiler::Assembler* assembler,
                                intptr_t argument_count) const);
 
-  static uword InterpretCallEntry();
-
  protected:
   NOT_IN_PRECOMPILED(static void CallInternal(const RuntimeEntry* runtime_entry,
                                               compiler::Assembler* assembler,
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 9502b49..752ca63 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -56,7 +56,7 @@
     __ str(TMP,
            compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     __ blx(TMP);
-    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ LoadImmediate(TMP, VMTag::kDartTagId);
     __ str(TMP,
            compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 5fd14b5..1580e1a 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -69,7 +69,7 @@
            compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
     __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ blr(TMP);
-    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ LoadImmediate(TMP, VMTag::kDartTagId);
     __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ mov(SP, kCallLeafRuntimeCalleeSaveScratch2);
     __ mov(CSP, kCallLeafRuntimeCalleeSaveScratch1);
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 22f67d7..8bba816 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -36,7 +36,7 @@
     __ movl(compiler::Assembler::VMTagAddress(), EAX);
     __ call(EAX);
     __ movl(compiler::Assembler::VMTagAddress(),
-            compiler::Immediate(VMTag::kDartCompiledTagId));
+            compiler::Immediate(VMTag::kDartTagId));
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 394c01d..40f5bd8 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -12,13 +12,9 @@
   V(AllocateTypedData)                                                         \
   V(AllocateContext)                                                           \
   V(AllocateObject)                                                            \
-  V(AllocateSubtypeTestCache)                                                  \
   V(BreakpointRuntimeHandler)                                                  \
   V(SingleStepHandler)                                                         \
   V(CloneContext)                                                              \
-  V(GetFieldForDispatch)                                                       \
-  V(ClosureArgumentsValid)                                                     \
-  V(ResolveCallFunction)                                                       \
   V(FixCallersTarget)                                                          \
   V(FixCallersTargetMonomorphic)                                               \
   V(FixAllocationStubTarget)                                                   \
@@ -26,7 +22,6 @@
   V(InlineCacheMissHandlerTwoArgs)                                             \
   V(StaticCallMissHandlerOneArg)                                               \
   V(StaticCallMissHandlerTwoArgs)                                              \
-  V(InterpretedInstanceCallMissHandler)                                        \
   V(Instanceof)                                                                \
   V(SubtypeCheck)                                                              \
   V(TypeCheck)                                                                 \
@@ -35,7 +30,6 @@
   V(InstantiateTypeArguments)                                                  \
   V(NoSuchMethodFromCallStub)                                                  \
   V(NoSuchMethodFromPrologue)                                                  \
-  V(InvokeNoSuchMethod)                                                        \
   V(OptimizeInvokedFunction)                                                   \
   V(TraceICCall)                                                               \
   V(PatchStaticCall)                                                           \
@@ -58,7 +52,6 @@
   V(InitStaticField)                                                           \
   V(LateInitializationError)                                                   \
   V(CompileFunction)                                                           \
-  V(CompileInterpretedFunction)                                                \
   V(SwitchableCallMiss)                                                        \
   V(NotLoaded)
 
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index caaa2a4..78d3ead 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -37,7 +37,7 @@
     __ movq(compiler::Assembler::VMTagAddress(), RAX);
     __ CallCFunction(RAX);
     __ movq(compiler::Assembler::VMTagAddress(),
-            compiler::Immediate(VMTag::kDartCompiledTagId));
+            compiler::Immediate(VMTag::kDartTagId));
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << THR)) != 0);
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << PP)) != 0);
   } else {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index db9f85b..23dfdde 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -1986,10 +1986,6 @@
   if (!code.IsNull()) {
     return code.raw();
   }
-  Bytecode& bytecode = Bytecode::Handle(Bytecode::FindCode(pc));
-  if (!bytecode.IsNull()) {
-    return bytecode.raw();
-  }
 
   // Not found.
   return Object::sentinel().raw();
@@ -3146,30 +3142,6 @@
   return true;
 }
 
-static const MethodParameter* get_ports_params[] = {
-    RUNNABLE_ISOLATE_PARAMETER,
-    NULL,
-};
-
-static bool GetPorts(Thread* thread, JSONStream* js) {
-  // Ensure the array and handles created below are promptly destroyed.
-  StackZone zone(thread);
-  HANDLESCOPE(thread);
-  const GrowableObjectArray& ports = GrowableObjectArray::Handle(
-      GrowableObjectArray::RawCast(DartLibraryCalls::LookupOpenPorts()));
-  JSONObject jsobj(js);
-  jsobj.AddProperty("type", "PortList");
-  {
-    Instance& port = Instance::Handle(zone.GetZone());
-    JSONArray arr(&jsobj, "ports");
-    for (int i = 0; i < ports.Length(); ++i) {
-      port ^= ports.At(i);
-      arr.AddValue(port);
-    }
-  }
-  return true;
-}
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
 static const char* const report_enum_names[] = {
     SourceReport::kCallSitesStr,
@@ -4417,12 +4389,12 @@
   return true;
 }
 
-static const MethodParameter* get_ports_private_params[] = {
+static const MethodParameter* get_ports_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
     NULL,
 };
 
-static bool GetPortsPrivate(Thread* thread, JSONStream* js) {
+static bool GetPorts(Thread* thread, JSONStream* js) {
   MessageHandler* message_handler = thread->isolate()->message_handler();
   PortMap::PrintPortsForMessageHandler(message_handler, js);
   return true;
@@ -5082,8 +5054,6 @@
     get_inbound_references_params },
   { "getInstances", GetInstances,
     get_instances_params },
-  { "getPorts", GetPorts,
-    get_ports_params },
   { "getIsolate", GetIsolate,
     get_isolate_params },
   { "_getIsolateObjectStore", GetIsolateObjectStore,
@@ -5104,8 +5074,8 @@
     get_object_store_params },
   { "_getPersistentHandles", GetPersistentHandles,
       get_persistent_handles_params, },
-  { "_getPorts", GetPortsPrivate,
-    get_ports_private_params },
+  { "_getPorts", GetPorts,
+    get_ports_params },
   { "getProcessMemoryUsage", GetProcessMemoryUsage,
     get_process_memory_usage_params },
   { "_getReachableSize", GetReachableSize,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 9d09af1..bf1d99b 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 41
+#define SERVICE_PROTOCOL_MINOR_VERSION 40
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 6fe2fb8..b8d0906 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.41
+# Dart VM Service Protocol 3.40
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.41_ of the Dart VM Service Protocol. This
+This document describes of _version 3.40_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -47,7 +47,6 @@
   - [getIsolateGroup](#getisolategroup)
   - [getMemoryUsage](#getmemoryusage)
   - [getObject](#getobject)
-  - [getPorts](#getports)
   - [getProcessMemoryUsage](#getprocessmemoryusage)
   - [getRetainingPath](#getretainingpath)
   - [getScripts](#getscripts)
@@ -114,7 +113,6 @@
   - [NativeFunction](#nativefunction)
   - [Null](#null)
   - [Object](#object)
-  - [PortList](#portlist)
   - [ReloadReport](#reloadreport)
   - [Response](#response)
   - [RetainingObject](#retainingobject)
@@ -938,17 +936,6 @@
 Float32x4List, and Float64x2List.  These parameters are otherwise
 ignored.
 
-### getPorts
-
-```
-PortList getPorts(string isolateId)
-```
-
-The _getPorts_ RPC is used to retrieve the list of `ReceivePort` instances for a
-given isolate.
-
-See [PortList](#portlist).
-
 ### getRetainingPath
 
 ```
@@ -2439,24 +2426,6 @@
   // Provided for instance kinds:
   //   Closure
   @Context closureContext [optional];
-
-  // The port ID for a ReceivePort.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  int portId [optional];
-
-  // The stack trace associated with the allocation of a ReceivePort.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  @Instance allocationLocation [optional];
-
-  // A name associated with a ReceivePort used for debugging purposes.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  string debugName [optional];
 }
 ```
 
@@ -2477,7 +2446,6 @@
   //   Double (suitable for passing to Double.parse())
   //   Int (suitable for passing to int.parse())
   //   String (value may be truncated)
-  //   StackTrace
   string valueAsString [optional];
 
   // The valueAsString for String references may be truncated. If so,
@@ -2690,24 +2658,6 @@
   //   BoundedType
   //   TypeParameter
   @Instance bound [optional];
-
-  // The port ID for a ReceivePort.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  int portId [optional];
-
-  // The stack trace associated with the allocation of a ReceivePort.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  @Instance allocationLocation [optional];
-
-  // A name associated with a ReceivePort used for debugging purposes.
-  //
-  // Provided for instance kinds:
-  //   ReceivePort
-  string debugName [optional];
 }
 ```
 
@@ -2792,9 +2742,6 @@
 
   // An instance of the Dart class BoundedType.
   BoundedType,
-
-  // An instance of the Dart class ReceivePort.
-  ReceivePort,
 }
 ```
 
@@ -3237,18 +3184,6 @@
 
 An _Object_ is a  persistent object that is owned by some isolate.
 
-### PortList
-
-```
-class PortList extends Response {
-  @Instance[] ports;
-}
-```
-
-A _PortList_ contains a list of ports associated with some isolate.
-
-See [getPort](#getPort).
-
 ### ProfileFunction
 
 ```
@@ -3920,6 +3855,5 @@
 3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
 3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
 3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
-3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 40fbe7c..316a56b 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -320,7 +320,6 @@
   Code& unoptimized_code = Code::Handle(Z);
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
-      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -3660,7 +3659,7 @@
   set_register(FP, static_cast<int32_t>(fp));
   set_register(THR, reinterpret_cast<uword>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartCompiledTagId);
+  thread->set_vm_tag(VMTag::kDartTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 7869196..b80c933 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -348,7 +348,6 @@
   Code& unoptimized_code = Code::Handle(Z);
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
-      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -3715,7 +3714,7 @@
   set_register(NULL, FP, static_cast<int64_t>(fp));
   set_register(NULL, THR, reinterpret_cast<int64_t>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartCompiledTagId);
+  thread->set_vm_tag(VMTag::kDartTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 5c0d911..10a5996 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1138,7 +1138,7 @@
 
   // Check if it is a code object in that case just write a Null object
   // as we do not want code objects in the snapshot.
-  if ((cid == kCodeCid) || (cid == kBytecodeCid)) {
+  if (cid == kCodeCid) {
     WriteVMIsolateObject(kNullObject);
     return true;
   }
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 94aa3e7..90e62a0 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -138,9 +138,6 @@
   static bool IncludesCode(Kind kind) {
     return (kind == kFullJIT) || (kind == kFullAOT);
   }
-  static bool IncludesBytecode(Kind kind) {
-    return (kind == kFull) || (kind == kFullCore) || (kind == kFullJIT);
-  }
 
   const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
 
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index ed0383c..f793f2e 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -381,7 +381,6 @@
   TEST_ROUND_TRIP_IDENTICAL(Object::script_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::library_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::code_class());
-  TEST_ROUND_TRIP_IDENTICAL(Object::bytecode_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::instructions_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::pc_descriptors_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::exception_handlers_class());
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index ba45ab6..4ed6a46 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -108,11 +108,7 @@
       func.IsRedirectingFactory() || func.is_synthetic()) {
     return true;
   }
-  // Note that context_scope() remains null for closures declared in bytecode,
-  // because the same information is retrieved from the parent's local variable
-  // descriptors.
-  // See IsLocalFunction() case in BytecodeReader::ComputeLocalVarDescriptors.
-  if (!func.is_declared_in_bytecode() && func.IsNonImplicitClosureFunction() &&
+  if (func.IsNonImplicitClosureFunction() &&
       (func.context_scope() == ContextScope::null())) {
     // TODO(iposva): This can arise if we attempt to compile an inner function
     // before we have compiled its enclosing function or if the enclosing
@@ -198,10 +194,7 @@
 void SourceReport::PrintCallSitesData(JSONObject* jsobj,
                                       const Function& function,
                                       const Code& code) {
-  if (code.IsNull()) {
-    // TODO(regis): implement for bytecode.
-    return;
-  }
+  ASSERT(!code.IsNull());
   const TokenPosition begin_pos = function.token_pos();
   const TokenPosition end_pos = function.end_token_pos();
 
@@ -234,10 +227,7 @@
 void SourceReport::PrintCoverageData(JSONObject* jsobj,
                                      const Function& function,
                                      const Code& code) {
-  if (code.IsNull()) {
-    // TODO(regis): implement for bytecode.
-    return;
-  }
+  ASSERT(!code.IsNull());
   const TokenPosition begin_pos = function.token_pos();
   const TokenPosition end_pos = function.end_token_pos();
 
@@ -319,63 +309,24 @@
 
   BitVector possible(zone(), func_length);
 
-  if (code.IsNull()) {
-    const Bytecode& bytecode = Bytecode::Handle(func.bytecode());
-    ASSERT(!bytecode.IsNull());
-    kernel::BytecodeSourcePositionsIterator iter(zone(), bytecode);
-    intptr_t token_offset = -1;
-    uword pc_offset = kUwordMax;
-    // Ignore all possible breakpoint positions until the first DebugCheck
-    // opcode of the function.
-    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
-    if (debug_check_pc != 0) {
-      const uword debug_check_pc_offset =
-          debug_check_pc - bytecode.PayloadStart();
-      while (iter.MoveNext()) {
-        if (pc_offset != kUwordMax) {
-          // Check that there is at least one 'debug checked' opcode in the last
-          // source position range.
-          if (bytecode.GetDebugCheckedOpcodeReturnAddress(
-                  pc_offset, iter.PcOffset()) != 0) {
-            possible.Add(token_offset);
-          }
-          pc_offset = kUwordMax;
-        }
-        const TokenPosition token_pos = iter.TokenPos();
-        if ((token_pos < begin_pos) || (token_pos > end_pos)) {
-          // Does not correspond to a valid source position.
-          continue;
-        }
-        if (iter.PcOffset() < debug_check_pc_offset) {
-          // No breakpoints in prologue.
-          continue;
-        }
-        pc_offset = iter.PcOffset();
-        token_offset = token_pos.Pos() - begin_pos.Pos();
-      }
-    }
-    if (pc_offset != kUwordMax && bytecode.GetDebugCheckedOpcodeReturnAddress(
-                                      pc_offset, bytecode.Size()) != 0) {
-      possible.Add(token_offset);
-    }
-  } else {
-    const uint8_t kSafepointKind =
-        (PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
-         PcDescriptorsLayout::kRuntimeCall);
+  ASSERT(!code.IsNull());
 
-    const PcDescriptors& descriptors =
-        PcDescriptors::Handle(zone(), code.pc_descriptors());
+  const uint8_t kSafepointKind =
+      (PcDescriptorsLayout::kIcCall | PcDescriptorsLayout::kUnoptStaticCall |
+       PcDescriptorsLayout::kRuntimeCall);
 
-    PcDescriptors::Iterator iter(descriptors, kSafepointKind);
-    while (iter.MoveNext()) {
-      const TokenPosition token_pos = iter.TokenPos();
-      if ((token_pos < begin_pos) || (token_pos > end_pos)) {
-        // Does not correspond to a valid source position.
-        continue;
-      }
-      intptr_t token_offset = token_pos.Pos() - begin_pos.Pos();
-      possible.Add(token_offset);
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(zone(), code.pc_descriptors());
+
+  PcDescriptors::Iterator iter(descriptors, kSafepointKind);
+  while (iter.MoveNext()) {
+    const TokenPosition token_pos = iter.TokenPos();
+    if ((token_pos < begin_pos) || (token_pos > end_pos)) {
+      // Does not correspond to a valid source position.
+      continue;
     }
+    intptr_t token_offset = token_pos.Pos() - begin_pos.Pos();
+    possible.Add(token_offset);
   }
 
   JSONArray bpts(jsobj, "possibleBreakpoints");
@@ -454,16 +405,7 @@
   const TokenPosition end_pos = func.end_token_pos();
 
   Code& code = Code::Handle(zone(), func.unoptimized_code());
-  Bytecode& bytecode = Bytecode::Handle(zone());
-  if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
-    // When the bytecode of a function is loaded, the function code is not null,
-    // but pointing to the stub to interpret the bytecode. The various Print
-    // functions below take code as an argument and know to process the bytecode
-    // if code is null.
-    code = Code::null();  // Ignore installed stub to interpret bytecode.
-    bytecode = func.bytecode();
-  }
-  if (code.IsNull() && bytecode.IsNull()) {
+  if (code.IsNull()) {
     if (func.HasCode() || (compile_mode_ == kForceCompile)) {
       const Error& err =
           Error::Handle(Compiler::EnsureUnoptimizedCode(thread(), func));
@@ -478,10 +420,6 @@
         return;
       }
       code = func.unoptimized_code();
-      if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
-        code = Code::null();  // Ignore installed stub to interpret bytecode.
-        bytecode = func.bytecode();
-      }
     } else {
       // This function has not been compiled yet.
       JSONObject range(jsarr);
@@ -492,7 +430,7 @@
       return;
     }
   }
-  ASSERT(!code.IsNull() || !bytecode.IsNull());
+  ASSERT(!code.IsNull());
 
   // We skip compiled async functions.  Once an async function has
   // been compiled, there is another function with the same range which
@@ -503,7 +441,7 @@
     range.AddProperty("scriptIndex", GetScriptIndex(script));
     range.AddProperty("startPos", begin_pos);
     range.AddProperty("endPos", end_pos);
-    range.AddProperty("compiled", true);  // bytecode or code.
+    range.AddProperty("compiled", true);
 
     if (IsReportRequested(kCallSites)) {
       PrintCallSitesData(&range, func, code);
@@ -590,8 +528,6 @@
 }
 
 void SourceReport::VisitClosures(JSONArray* jsarr) {
-  // Note that closures declared in bytecode are not visited here, but in
-  // VisitFunction while traversing the object pool of their owner functions.
   const GrowableObjectArray& closures = GrowableObjectArray::Handle(
       thread()->isolate()->object_store()->closure_functions());
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 9df6e3c..6d6f013 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -26,8 +26,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 const FrameLayout invalid_frame_layout = {
     /*.first_object_from_fp = */ -1,
     /*.last_fixed_object_from_fp = */ -1,
@@ -151,10 +149,6 @@
 }
 
 bool StackFrame::IsStubFrame() const {
-  if (is_interpreted()) {
-    return false;
-  }
-
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     return IsBareInstructionsStubFrame();
   }
@@ -177,15 +171,6 @@
   ASSERT(thread_ == Thread::Current());
   Zone* zone = Thread::Current()->zone();
   if (IsDartFrame()) {
-    if (is_interpreted()) {
-      const Bytecode& bytecode = Bytecode::Handle(zone, LookupDartBytecode());
-      ASSERT(!bytecode.IsNull());
-      return zone->PrintToString("[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px
-                                 " offset:0x%" Px ") %s ]",
-                                 GetName(), sp(), fp(), pc(),
-                                 pc() - bytecode.PayloadStart(),
-                                 bytecode.FullyQualifiedName());
-    }
     const Code& code = Code::Handle(zone, LookupDartCode());
     ASSERT(!code.IsNull());
     const auto& owner = Object::Handle(
@@ -207,16 +192,11 @@
 
 void ExitFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
-  // Visit pc marker and saved pool pointer, or, for interpreted frame, code
-  // object and function object.
-  ObjectPtr* last_fixed =
-      reinterpret_cast<ObjectPtr*>(fp()) +
-      (is_interpreted() ? kKBCLastFixedObjectSlotFromFp
-                        : runtime_frame_layout.first_object_from_fp);
-  ObjectPtr* first_fixed =
-      reinterpret_cast<ObjectPtr*>(fp()) +
-      (is_interpreted() ? kKBCFirstObjectSlotFromFp
-                        : runtime_frame_layout.last_fixed_object_from_fp);
+  // Visit pc marker and saved pool pointer.
+  ObjectPtr* last_fixed = reinterpret_cast<ObjectPtr*>(fp()) +
+                          runtime_frame_layout.first_object_from_fp;
+  ObjectPtr* first_fixed = reinterpret_cast<ObjectPtr*>(fp()) +
+                           runtime_frame_layout.last_fixed_object_from_fp;
   if (first_fixed <= last_fixed) {
     visitor->VisitPointers(first_fixed, last_fixed);
   } else {
@@ -228,12 +208,9 @@
 void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   // Visit objects between SP and (FP - callee_save_area).
-  ObjectPtr* first = is_interpreted() ? reinterpret_cast<ObjectPtr*>(fp()) +
-                                            kKBCSavedArgDescSlotFromEntryFp
-                                      : reinterpret_cast<ObjectPtr*>(sp());
-  ObjectPtr* last = is_interpreted() ? reinterpret_cast<ObjectPtr*>(sp())
-                                     : reinterpret_cast<ObjectPtr*>(fp()) +
-                                           kExitLinkSlotFromEntryFp - 1;
+  ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
+  ObjectPtr* last =
+      reinterpret_cast<ObjectPtr*>(fp()) + kExitLinkSlotFromEntryFp - 1;
   // There may not be any pointer to visit; in this case, first > last.
   visitor->VisitPointers(first, last);
 }
@@ -253,18 +230,14 @@
     code = GetCodeObject();
   } else {
     ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
-        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
-                                  : runtime_frame_layout.code_from_fp) *
-                kWordSize)));
+        fp() + (runtime_frame_layout.code_from_fp * kWordSize)));
     // May forward raw code. Note we don't just visit the pc marker slot first
     // because the visitor's forwarding might not be idempotent.
     visitor->VisitPointer(&pc_marker);
     if (pc_marker->IsHeapObject() && (pc_marker->GetClassId() == kCodeCid)) {
       code ^= pc_marker;
     } else {
-      ASSERT(pc_marker == Object::null() ||
-             (is_interpreted() && (!pc_marker->IsHeapObject() ||
-                                   (pc_marker->GetClassId() == kBytecodeCid))));
+      ASSERT(pc_marker == Object::null());
     }
   }
 
@@ -288,9 +261,6 @@
     const uword start = code.PayloadStart();
     const uint32_t pc_offset = pc() - start;
     if (it.Find(pc_offset)) {
-      if (is_interpreted()) {
-        UNIMPLEMENTED();
-      }
       ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
       ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
           fp() + (runtime_frame_layout.first_local_from_fp * kWordSize));
@@ -348,33 +318,14 @@
 
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
-  if (is_interpreted()) {
-    // Do not visit caller's pc or caller's fp.
-    ObjectPtr* first =
-        reinterpret_cast<ObjectPtr*>(fp()) + kKBCFirstObjectSlotFromFp;
-    ObjectPtr* last =
-        reinterpret_cast<ObjectPtr*>(fp()) + kKBCLastFixedObjectSlotFromFp;
-
-    visitor->VisitPointers(first, last);
-  }
-  ObjectPtr* first =
-      reinterpret_cast<ObjectPtr*>(is_interpreted() ? fp() : sp());
+  ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
   ObjectPtr* last = reinterpret_cast<ObjectPtr*>(
-      is_interpreted()
-          ? sp()
-          : fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
+      fp() + (runtime_frame_layout.first_object_from_fp * kWordSize));
 
   visitor->VisitPointers(first, last);
 }
 
 FunctionPtr StackFrame::LookupDartFunction() const {
-  if (is_interpreted()) {
-    ObjectPtr result = *(reinterpret_cast<FunctionPtr*>(
-        fp() + kKBCFunctionSlotFromFp * kWordSize));
-    ASSERT((result == Object::null()) ||
-           (result->GetClassId() == kFunctionCid));
-    return static_cast<FunctionPtr>(result);
-  }
   const Code& code = Code::Handle(LookupDartCode());
   if (!code.IsNull()) {
     return code.function();
@@ -399,8 +350,6 @@
 }
 
 CodePtr StackFrame::GetCodeObject() const {
-  ASSERT(!is_interpreted());
-
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
@@ -424,27 +373,6 @@
   return static_cast<CodePtr>(pc_marker);
 }
 
-BytecodePtr StackFrame::LookupDartBytecode() const {
-// We add a no gc scope to ensure that the code below does not trigger
-// a GC as we are handling raw object references here. It is possible
-// that the code is called while a GC is in progress, that is ok.
-#if !defined(HOST_OS_WINDOWS) && !defined(HOST_OS_FUCHSIA)
-  // On Windows and Fuchsia, the profiler calls this from a separate thread
-  // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
-  NoSafepointScope no_safepoint;
-#endif
-  return GetBytecodeObject();
-}
-
-BytecodePtr StackFrame::GetBytecodeObject() const {
-  ASSERT(is_interpreted());
-  ObjectPtr pc_marker = *(
-      reinterpret_cast<ObjectPtr*>(fp() + kKBCPcMarkerSlotFromFp * kWordSize));
-  ASSERT((pc_marker == Object::null()) ||
-         (pc_marker->GetClassId() == kBytecodeCid));
-  return static_cast<BytecodePtr>(pc_marker);
-}
-
 bool StackFrame::FindExceptionHandler(Thread* thread,
                                       uword* handler_pc,
                                       bool* needs_stacktrace,
@@ -452,28 +380,19 @@
                                       bool* is_optimized) const {
   REUSABLE_CODE_HANDLESCOPE(thread);
   Code& code = reused_code_handle.Handle();
-  REUSABLE_BYTECODE_HANDLESCOPE(thread);
-  Bytecode& bytecode = reused_bytecode_handle.Handle();
   REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread);
   ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
   REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(thread);
   PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
   uword start;
-  if (is_interpreted()) {
-    bytecode = LookupDartBytecode();
-    ASSERT(!bytecode.IsNull());
-    start = bytecode.PayloadStart();
-    handlers = bytecode.exception_handlers();
-  } else {
-    code = LookupDartCode();
-    if (code.IsNull()) {
-      return false;  // Stub frames do not have exception handlers.
-    }
-    start = code.PayloadStart();
-    handlers = code.exception_handlers();
-    descriptors = code.pc_descriptors();
-    *is_optimized = code.is_optimized();
+  code = LookupDartCode();
+  if (code.IsNull()) {
+    return false;  // Stub frames do not have exception handlers.
   }
+  start = code.PayloadStart();
+  handlers = code.exception_handlers();
+  descriptors = code.pc_descriptors();
+  *is_optimized = code.is_optimized();
   HandlerInfoCache* cache = thread->isolate()->handler_info_cache();
   ExceptionHandlerInfo* info = cache->Lookup(pc());
   if (info != NULL) {
@@ -488,17 +407,13 @@
   }
 
   intptr_t try_index = -1;
-  if (is_interpreted()) {
-    try_index = bytecode.GetTryIndexAtPc(pc());
-  } else {
-    uword pc_offset = pc() - code.PayloadStart();
-    PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
-    while (iter.MoveNext()) {
-      const intptr_t current_try_index = iter.TryIndex();
-      if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
-        try_index = current_try_index;
-        break;
-      }
+  uword pc_offset = pc() - code.PayloadStart();
+  PcDescriptors::Iterator iter(descriptors, PcDescriptorsLayout::kAnyKind);
+  while (iter.MoveNext()) {
+    const intptr_t current_try_index = iter.TryIndex();
+    if ((iter.PcOffset() == pc_offset) && (current_try_index != -1)) {
+      try_index = current_try_index;
+      break;
     }
   }
   if (try_index == -1) {
@@ -514,13 +429,6 @@
 }
 
 TokenPosition StackFrame::GetTokenPos() const {
-  if (is_interpreted()) {
-    const Bytecode& bytecode = Bytecode::Handle(LookupDartBytecode());
-    if (bytecode.IsNull()) {
-      return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
-    }
-    return bytecode.GetTokenIndexOfPC(pc());
-  }
   const Code& code = Code::Handle(LookupDartCode());
   if (code.IsNull()) {
     return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
@@ -542,9 +450,6 @@
   if (IsEntryFrame() || IsExitFrame() || IsStubFrame()) {
     return true;
   }
-  if (is_interpreted()) {
-    return (LookupDartBytecode() != Bytecode::null());
-  }
   return (LookupDartCode() != Code::null());
 }
 
@@ -565,25 +470,16 @@
   frames_.fp_ = exit_marker;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(exit_marker);
-  }
   frames_.Unpoison();
 }
 
 void StackFrameIterator::SetupNextExitFrameData() {
   ASSERT(entry_.fp() != 0);
-  uword exit_address =
-      entry_.fp() + ((entry_.is_interpreted() ? kKBCExitLinkSlotFromEntryFp
-                                              : kExitLinkSlotFromEntryFp) *
-                     kWordSize);
+  uword exit_address = entry_.fp() + (kExitLinkSlotFromEntryFp * kWordSize);
   uword exit_marker = *reinterpret_cast<uword*>(exit_address);
   frames_.fp_ = exit_marker;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(exit_marker);
-  }
   frames_.Unpoison();
 }
 
@@ -616,9 +512,6 @@
   frames_.fp_ = last_fp;
   frames_.sp_ = 0;
   frames_.pc_ = 0;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(last_fp);
-  }
   frames_.Unpoison();
 }
 
@@ -639,9 +532,6 @@
   frames_.fp_ = fp;
   frames_.sp_ = sp;
   frames_.pc_ = pc;
-  if (FLAG_enable_interpreter) {
-    frames_.CheckIfInterpreted(fp);
-  }
   frames_.Unpoison();
 }
 
@@ -666,10 +556,8 @@
       // Iteration starts from an exit frame given by its fp.
       current_frame_ = NextExitFrame();
     } else if (*(reinterpret_cast<uword*>(
-                   frames_.fp_ +
-                   ((frames_.is_interpreted() ? kKBCSavedCallerFpSlotFromFp
-                                              : kSavedCallerFpSlotFromFp) *
-                    kWordSize))) == 0) {
+                   frames_.fp_ + (kSavedCallerFpSlotFromFp * kWordSize))) ==
+               0) {
       // Iteration starts from an entry frame given by its fp, sp, and pc.
       current_frame_ = NextEntryFrame();
     } else {
@@ -699,17 +587,6 @@
   return current_frame_;
 }
 
-void StackFrameIterator::FrameSetIterator::CheckIfInterpreted(
-    uword exit_marker) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // TODO(regis): We should rely on a new thread vm_tag to identify an
-  // interpreter frame and not need the HasFrame() method.
-  ASSERT(FLAG_enable_interpreter);
-  Interpreter* interpreter = thread_->interpreter();
-  is_interpreted_ = (interpreter != NULL) && interpreter->HasFrame(exit_marker);
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-}
-
 // Tell MemorySanitizer that generated code initializes part of the stack.
 void StackFrameIterator::FrameSetIterator::Unpoison() {
   // When using a simulator, all writes to the stack happened from MSAN
@@ -719,7 +596,7 @@
 #if !defined(USING_SIMULATOR)
   if (fp_ == 0) return;
   // Note that Thread::os_thread_ is cleared when the thread is descheduled.
-  ASSERT(is_interpreted_ || (thread_->os_thread() == nullptr) ||
+  ASSERT((thread_->os_thread() == nullptr) ||
          ((thread_->os_thread()->stack_limit() < fp_) &&
           (thread_->os_thread()->stack_base() > fp_)));
   uword lower;
@@ -742,12 +619,10 @@
   frame->sp_ = sp_;
   frame->fp_ = fp_;
   frame->pc_ = pc_;
-  frame->is_interpreted_ = is_interpreted_;
   sp_ = frame->GetCallerSp();
   fp_ = frame->GetCallerFp();
   pc_ = frame->GetCallerPc();
   Unpoison();
-  ASSERT(is_interpreted_ == frame->is_interpreted_);
   ASSERT(!validate || frame->IsValid());
   return frame;
 }
@@ -756,12 +631,10 @@
   exit_.sp_ = frames_.sp_;
   exit_.fp_ = frames_.fp_;
   exit_.pc_ = frames_.pc_;
-  exit_.is_interpreted_ = frames_.is_interpreted_;
   frames_.sp_ = exit_.GetCallerSp();
   frames_.fp_ = exit_.GetCallerFp();
   frames_.pc_ = exit_.GetCallerPc();
   frames_.Unpoison();
-  ASSERT(frames_.is_interpreted_ == exit_.is_interpreted_);
   ASSERT(!validate_ || exit_.IsValid());
   return &exit_;
 }
@@ -771,7 +644,6 @@
   entry_.sp_ = frames_.sp_;
   entry_.fp_ = frames_.fp_;
   entry_.pc_ = frames_.pc_;
-  entry_.is_interpreted_ = frames_.is_interpreted_;
   SetupNextExitFrameData();  // Setup data for next exit frame in chain.
   ASSERT(!validate_ || entry_.IsValid());
   return &entry_;
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 048ca63..dff0279 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -7,9 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/frame_layout.h"
-#include "vm/interpreter.h"
 #include "vm/object.h"
-#include "vm/stack_frame_kbc.h"
 #include "vm/stub_code.h"
 
 #if defined(TARGET_ARCH_IA32)
@@ -44,7 +42,6 @@
 
   // The pool pointer is not implemented on all architectures.
   static int SavedCallerPpSlotFromFp() {
-    // Never called on an interpreter frame.
     if (runtime_frame_layout.saved_caller_pp_from_fp !=
         kSavedCallerFpSlotFromFp) {
       return runtime_frame_layout.saved_caller_pp_from_fp;
@@ -54,37 +51,30 @@
   }
 
   bool IsMarkedForLazyDeopt() const {
-    ASSERT(!is_interpreted());
     uword raw_pc =
         *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));
     return raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint();
   }
   void MarkForLazyDeopt() {
-    ASSERT(!is_interpreted());
     set_pc(StubCode::DeoptimizeLazyFromReturn().EntryPoint());
   }
   void UnmarkForLazyDeopt() {
     // If this frame was marked for lazy deopt, pc_ was computed to be the
     // original return address using the pending deopts table in GetCallerPc.
     // Write this value back into the frame.
-    ASSERT(!is_interpreted());
     uword original_pc = pc();
     ASSERT(original_pc != StubCode::DeoptimizeLazyFromReturn().EntryPoint());
     set_pc(original_pc);
   }
 
   void set_pc(uword value) {
-    *reinterpret_cast<uword*>(sp() + ((is_interpreted() ? kKBCSavedPcSlotFromSp
-                                                        : kSavedPcSlotFromSp) *
-                                      kWordSize)) = value;
+    *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize)) = value;
     pc_ = value;
   }
 
   void set_pc_marker(CodePtr code) {
     *reinterpret_cast<CodePtr*>(
-        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
-                                  : runtime_frame_layout.code_from_fp) *
-                kWordSize)) = code;
+        fp() + (runtime_frame_layout.code_from_fp * kWordSize)) = code;
   }
 
   // Visit objects in the frame.
@@ -110,11 +100,8 @@
   virtual bool IsEntryFrame() const { return false; }
   virtual bool IsExitFrame() const { return false; }
 
-  virtual bool is_interpreted() const { return is_interpreted_; }
-
   FunctionPtr LookupDartFunction() const;
   CodePtr LookupDartCode() const;
-  BytecodePtr LookupDartBytecode() const;
   bool FindExceptionHandler(Thread* thread,
                             uword* handler_pc,
                             bool* needs_stacktrace,
@@ -125,15 +112,11 @@
 
   static void DumpCurrentTrace();
 
-  uword GetCallerSp() const {
-    return fp() +
-           ((is_interpreted() ? kKBCCallerSpSlotFromFp : kCallerSpSlotFromFp) *
-            kWordSize);
-  }
+  uword GetCallerSp() const { return fp() + (kCallerSpSlotFromFp * kWordSize); }
 
  protected:
   explicit StackFrame(Thread* thread)
-      : fp_(0), sp_(0), pc_(0), thread_(thread), is_interpreted_(false) {}
+      : fp_(0), sp_(0), pc_(0), thread_(thread) {}
 
   // Name of the frame, used for generic frame printing functionality.
   virtual const char* GetName() const {
@@ -149,20 +132,15 @@
 
  private:
   CodePtr GetCodeObject() const;
-  BytecodePtr GetBytecodeObject() const;
 
   uword GetCallerFp() const {
-    return *(reinterpret_cast<uword*>(
-        fp() + ((is_interpreted() ? kKBCSavedCallerFpSlotFromFp
-                                  : kSavedCallerFpSlotFromFp) *
-                kWordSize)));
+    return *(reinterpret_cast<uword*>(fp() +
+                                      (kSavedCallerFpSlotFromFp * kWordSize)));
   }
 
   uword GetCallerPc() const {
     uword raw_pc = *(reinterpret_cast<uword*>(
-        fp() + ((is_interpreted() ? kKBCSavedCallerPcSlotFromFp
-                                  : kSavedCallerPcSlotFromFp) *
-                kWordSize)));
+        fp() + (kSavedCallerPcSlotFromFp * kWordSize)));
     ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow().EntryPoint());
     if (raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint()) {
       return isolate_group()->FindPendingDeoptAtSafepoint(GetCallerFp());
@@ -174,7 +152,6 @@
   uword sp_;
   uword pc_;
   Thread* thread_;
-  bool is_interpreted_;
 
   // The iterators FrameSetIterator and StackFrameIterator set the private
   // fields fp_ and sp_ when they return the respective frame objects.
@@ -210,9 +187,7 @@
 // dart code.
 class EntryFrame : public StackFrame {
  public:
-  bool IsValid() const {
-    return StubCode::InInvocationStub(pc(), is_interpreted());
-  }
+  bool IsValid() const { return StubCode::InInvocationStub(pc()); }
   bool IsDartFrame(bool validate = true) const { return false; }
   bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
@@ -279,11 +254,9 @@
       if (fp_ == 0) {
         return false;
       }
-      const uword pc = *(reinterpret_cast<uword*>(
-          sp_ +
-          ((is_interpreted() ? kKBCSavedPcSlotFromSp : kSavedPcSlotFromSp) *
-           kWordSize)));
-      return !StubCode::InInvocationStub(pc, is_interpreted());
+      const uword pc =
+          *(reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)));
+      return !StubCode::InInvocationStub(pc);
     }
 
     // Get next non entry/exit frame in the set (assumes a next frame exists).
@@ -291,14 +264,7 @@
 
    private:
     explicit FrameSetIterator(Thread* thread)
-        : fp_(0),
-          sp_(0),
-          pc_(0),
-          stack_frame_(thread),
-          thread_(thread),
-          is_interpreted_(false) {}
-    bool is_interpreted() const { return is_interpreted_; }
-    void CheckIfInterpreted(uword exit_marker);
+        : fp_(0), sp_(0), pc_(0), stack_frame_(thread), thread_(thread) {}
     void Unpoison();
 
     uword fp_;
@@ -306,7 +272,6 @@
     uword pc_;
     StackFrame stack_frame_;  // Singleton frame returned by NextFrame().
     Thread* thread_;
-    bool is_interpreted_;
 
     friend class StackFrameIterator;
     DISALLOW_COPY_AND_ASSIGN(FrameSetIterator);
@@ -327,8 +292,6 @@
   void SetupLastExitFrameData();
   void SetupNextExitFrameData();
 
-  void CheckInterpreterExitFrame(uword exit_marker);
-
   bool validate_;     // Validate each frame as we traverse the frames.
   EntryFrame entry_;  // Singleton entry frame returned by NextEntryFrame().
   ExitFrame exit_;    // Singleton exit frame returned by NextExitFrame().
@@ -453,12 +416,6 @@
   return other_fp < fp;
 }
 
-// Both fp and other_fp are bytecode frame pointers.
-DART_FORCE_INLINE static bool IsBytecodeCalleeFrameOf(uword fp,
-                                                      uword other_fp) {
-  return other_fp > fp;
-}
-
 // Value for stack limit that is used to cause an interrupt.
 static const uword kInterruptStackLimit = ~static_cast<uword>(0);
 
diff --git a/runtime/vm/stack_frame_kbc.h b/runtime/vm/stack_frame_kbc.h
deleted file mode 100644
index 6af9a3a..0000000
--- a/runtime/vm/stack_frame_kbc.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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.
-
-#ifndef RUNTIME_VM_STACK_FRAME_KBC_H_
-#define RUNTIME_VM_STACK_FRAME_KBC_H_
-
-#include "platform/globals.h"
-
-namespace dart {
-
-/* Kernel Bytecode Frame Layout
-
-IMPORTANT: KBC stack is growing upwards which is different from all other
-architectures. This enables efficient addressing for locals via unsigned index.
-
-               |                    | <- TOS
-Callee frame   | ...                |
-               | saved FP           |    (FP of current frame)
-               | saved PC           |    (PC of current frame)
-               | code object        |
-               | function object    |
-               +--------------------+
-Current frame  | ...               T| <- SP of current frame
-               | ...               T|
-               | first local       T| <- FP of current frame
-               | caller's FP        |
-               | caller's PC        |
-               | code object       T|    (current frame's code object)
-               | function object   T|    (current frame's function object)
-               +--------------------+
-Caller frame   | last parameter     | <- SP of caller frame
-               |  ...               |
-
-               T against a slot indicates it needs to be traversed during GC.
-*/
-
-static const int kKBCDartFrameFixedSize = 4;  // Function, Code, PC, FP
-static const int kKBCSavedPcSlotFromSp = 3;
-
-static const int kKBCFirstObjectSlotFromFp = -4;  // Used by GC.
-static const int kKBCLastFixedObjectSlotFromFp = -3;
-
-static const int kKBCSavedCallerFpSlotFromFp = -1;
-static const int kKBCSavedCallerPcSlotFromFp = -2;
-static const int kKBCCallerSpSlotFromFp = -kKBCDartFrameFixedSize - 1;
-static const int kKBCPcMarkerSlotFromFp = -3;
-static const int kKBCFunctionSlotFromFp = -4;
-static const int kKBCParamEndSlotFromFp = 4;
-
-// Entry and exit frame layout.
-static const int kKBCEntrySavedSlots = 3;
-static const int kKBCExitLinkSlotFromEntryFp = 0;
-static const int kKBCSavedArgDescSlotFromEntryFp = 1;
-static const int kKBCSavedPpSlotFromEntryFp = 2;
-
-// Value for stack limit that is used to cause an interrupt.
-// Note that on KBC stack is growing upwards so interrupt limit is 0 unlike
-// on all other architectures.
-static const uword kKBCInterruptStackLimit = 0;
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_STACK_FRAME_KBC_H_
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index b20e4b8..8ed14b9 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -259,45 +259,7 @@
   // The true stack depends on which strategy we are using for noSuchMethod. The
   // stacktrace as seen by Dart is the same either way because dispatcher
   // methods are marked invisible.
-  if (FLAG_enable_interpreter) {
-    kScriptChars =
-        "class StackFrame {"
-        "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
-        "  static int frameCount() native \"StackFrame_frameCount\";"
-        "  static int dartFrameCount() native \"StackFrame_dartFrameCount\";"
-        "  static validateFrame(int index,"
-        "                       String name) native "
-        "\"StackFrame_validateFrame\";"
-        "} "
-        "class StackFrame2Test {"
-        "  StackFrame2Test() {}"
-        "  noSuchMethod(Invocation im) {"
-        "    /* We should have 8 general frames and 4 dart frames as follows:"
-        "     * exit frame"
-        "     * dart frame corresponding to StackFrame.frameCount"
-        "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
-        "     * entry frame"
-        "     * exit frame"
-        "     * dart frame for noSuchMethod dispatcher"
-        "     * dart frame corresponding to StackFrame2Test.testMain"
-        "     * entry frame"
-        "     */"
-        "    StackFrame.equals(8, StackFrame.frameCount());"
-        "    StackFrame.equals(4, StackFrame.dartFrameCount());"
-        "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
-        "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
-        "    StackFrame.validateFrame(2, \"StackFrame2Test_foo\");"
-        "    StackFrame.validateFrame(3, \"StackFrame2Test_testMain\");"
-        "    return 5;"
-        "  }"
-        "  static testMain() {"
-        "    /* Declare |obj| dynamic so that noSuchMethod can be"
-        "     * called in strong mode. */"
-        "    dynamic obj = new StackFrame2Test();"
-        "    StackFrame.equals(5, obj.foo(101, 202));"
-        "  }"
-        "}";
-  } else if (FLAG_lazy_dispatchers) {
+  if (FLAG_lazy_dispatchers) {
     kScriptChars =
         "class StackFrame {"
         "  static equals(var obj1, var obj2) native \"StackFrame_equals\";"
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index 84459ad..adb9c8b 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -8,10 +8,6 @@
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-#include "vm/compiler/frontend/bytecode_reader.h"
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 namespace dart {
 
 // Keep in sync with
@@ -46,29 +42,6 @@
   UNREACHABLE();  // If we cannot find it we have a bug.
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-intptr_t FindPcOffset(const Bytecode& bytecode, intptr_t yield_index) {
-  if (yield_index == PcDescriptorsLayout::kInvalidYieldIndex) {
-    return 0;
-  }
-  if (!bytecode.HasSourcePositions()) {
-    return 0;
-  }
-  intptr_t last_yield_point = 0;
-  kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
-                                               bytecode);
-  while (iter.MoveNext()) {
-    if (iter.IsYieldPoint()) {
-      last_yield_point++;
-    }
-    if (last_yield_point == yield_index) {
-      return iter.PcOffset();
-    }
-  }
-  UNREACHABLE();  // If we cannot find it we have a bug.
-}
-#endif
-
 // Instance caches library and field references.
 // This way we don't have to do the look-ups for every frame in the stack.
 CallerClosureFinder::CallerClosureFinder(Zone* zone)
@@ -301,8 +274,7 @@
 }
 
 ClosurePtr StackTraceUtils::FindClosureInFrame(ObjectPtr* last_object_in_caller,
-                                               const Function& function,
-                                               bool is_interpreted) {
+                                               const Function& function) {
   NoSafepointScope nsp;
 
   ASSERT(!function.IsNull());
@@ -317,8 +289,7 @@
   const intptr_t kNumClosureAndArgs = 4;
   auto& closure = Closure::Handle();
   for (intptr_t i = 0; i < kNumClosureAndArgs; i++) {
-    // KBC builds the stack upwards instead of the usual downwards stack.
-    ObjectPtr arg = last_object_in_caller[(is_interpreted ? -i : i)];
+    ObjectPtr arg = last_object_in_caller[i];
     if (arg->IsHeapObject() && arg->GetClassId() == kClosureCid) {
       closure = Closure::RawCast(arg);
       if (closure.function() == function.raw()) {
@@ -351,7 +322,6 @@
 
   auto& function = Function::Handle(zone);
   auto& code = Code::Handle(zone);
-  auto& bytecode = Bytecode::Handle(zone);
   auto& offset = Smi::Handle(zone);
 
   auto& closure = Closure::Handle(zone);
@@ -365,32 +335,15 @@
       continue;
     }
 
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      ASSERT(!bytecode.IsNull());
-      function = bytecode.function();
-      if (function.IsNull()) {
-        continue;
-      }
-      RELEASE_ASSERT(function.raw() == frame->LookupDartFunction());
-    } else {
-      function = frame->LookupDartFunction();
-    }
+    function = frame->LookupDartFunction();
 
     // Add the current synchronous frame.
-    if (frame->is_interpreted()) {
-      code_array.Add(bytecode);
-      const intptr_t pc_offset = frame->pc() - bytecode.PayloadStart();
-      ASSERT(pc_offset > 0 && pc_offset <= bytecode.Size());
-      offset = Smi::New(pc_offset);
-    } else {
-      code = frame->LookupDartCode();
-      ASSERT(function.raw() == code.function());
-      code_array.Add(code);
-      const intptr_t pc_offset = frame->pc() - code.PayloadStart();
-      ASSERT(pc_offset > 0 && pc_offset <= code.Size());
-      offset = Smi::New(pc_offset);
-    }
+    code = frame->LookupDartCode();
+    ASSERT(function.raw() == code.function());
+    code_array.Add(code);
+    const intptr_t pc_offset = frame->pc() - code.PayloadStart();
+    ASSERT(pc_offset > 0 && pc_offset <= code.Size());
+    offset = Smi::New(pc_offset);
     pc_offset_array.Add(offset);
     if (on_sync_frames != nullptr) {
       (*on_sync_frames)(frame);
@@ -411,8 +364,7 @@
         // through the yields.
         ObjectPtr* last_caller_obj =
             reinterpret_cast<ObjectPtr*>(frame->GetCallerSp());
-        closure = FindClosureInFrame(last_caller_obj, function,
-                                     frame->is_interpreted());
+        closure = FindClosureInFrame(last_caller_obj, function);
 
         // If this async function hasn't yielded yet, we're still dealing with a
         // normal stack. Continue to next frame as usual.
@@ -434,18 +386,10 @@
            closure = caller_closure_finder.FindCaller(closure)) {
         function = closure.function();
         // In hot-reload-test-mode we sometimes have to do this:
-        if (!function.HasCode() && !function.HasBytecode()) {
+        if (!function.HasCode()) {
           function.EnsureHasCode();
         }
-        if (function.HasBytecode()) {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-          bytecode = function.bytecode();
-          code_array.Add(bytecode);
-          offset = Smi::New(FindPcOffset(bytecode, GetYieldIndex(closure)));
-#else
-          UNREACHABLE();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-        } else if (function.HasCode()) {
+        if (function.HasCode()) {
           code = function.CurrentCode();
           code_array.Add(code);
           pc_descs = code.pc_descriptors();
@@ -485,7 +429,6 @@
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Function& function = Function::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   String& function_name = String::Handle(zone);
   const bool async_function_is_null = async_function.IsNull();
   int sync_async_gap_frames = -1;
@@ -499,14 +442,8 @@
       skip_frames--;
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      function = bytecode.function();
-      if (function.IsNull()) continue;
-    } else {
-      code = frame->LookupDartCode();
-      function = code.function();
-    }
+    code = frame->LookupDartCode();
+    function = code.function();
     const bool function_is_null = function.IsNull();
     if (!function_is_null && sync_async_gap_frames > 0) {
       function_name = function.QualifiedScrubbedName();
@@ -539,9 +476,7 @@
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
-  Function& function = Function::Handle(zone);
   Code& code = Code::Handle(zone);
-  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   intptr_t collected_frames_count = 0;
   for (; (frame != NULL) && (collected_frames_count < count);
@@ -553,19 +488,9 @@
       skip_frames--;
       continue;
     }
-    if (frame->is_interpreted()) {
-      bytecode = frame->LookupDartBytecode();
-      function = bytecode.function();
-      if (function.IsNull()) {
-        continue;
-      }
-      offset = Smi::New(frame->pc() - bytecode.PayloadStart());
-      code_array.SetAt(array_offset, bytecode);
-    } else {
-      code = frame->LookupDartCode();
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      code_array.SetAt(array_offset, code);
-    }
+    code = frame->LookupDartCode();
+    offset = Smi::New(frame->pc() - code.PayloadStart());
+    code_array.SetAt(array_offset, code);
     pc_offset_array.SetAt(array_offset, offset);
     array_offset++;
     collected_frames_count++;
@@ -598,12 +523,8 @@
   ASSERT(async_code_array->At(0) != Code::null());
   ASSERT(async_code_array->At(0) == StubCode::AsynchronousGapMarker().raw());
   const Object& code_object = Object::Handle(async_code_array->At(1));
-  if (code_object.IsCode()) {
-    *async_function = Code::Cast(code_object).function();
-  } else {
-    ASSERT(code_object.IsBytecode());
-    *async_function = Bytecode::Cast(code_object).function();
-  }
+  ASSERT(code_object.IsCode());
+  *async_function = Code::Cast(code_object).function();
   ASSERT(!async_function->IsNull());
   ASSERT(async_function->IsAsyncFunction() ||
          async_function->IsAsyncGenerator());
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index 1684824..adfec68 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -71,8 +71,7 @@
  public:
   // Find the async_op closure from the stack frame.
   static ClosurePtr FindClosureInFrame(ObjectPtr* last_object_in_caller,
-                                       const Function& function,
-                                       bool is_interpreted);
+                                       const Function& function);
 
   /// Collects all frames on the current stack until an async/async* frame is
   /// hit which has yielded before (i.e. is not in sync-async case).
@@ -141,7 +140,7 @@
   //   _AsyncAwaitCompleter.start               (2)
   //   <async_function>                         (3)
   //
-  // Alternatively, for bytecode or optimized frames, we may see:
+  // Alternatively, for optimized frames, we may see:
   //   <async function>__<anonymous_closure>    (0)
   //   _AsyncAwaitCompleter.start               (1)
   //   <async_function>                         (2)
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 92d8c6c..7f8f3a3 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -10,7 +10,6 @@
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/flags.h"
 #include "vm/heap/safepoint.h"
-#include "vm/interpreter.h"
 #include "vm/object_store.h"
 #include "vm/snapshot.h"
 #include "vm/virtual_memory.h"
@@ -26,8 +25,6 @@
 DEFINE_FLAG(bool, disassemble_stubs, false, "Disassemble generated stubs.");
 DECLARE_FLAG(bool, precompiled_mode);
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 StubCode::StubCodeEntry StubCode::entries_[kNumStubEntries] = {
 #if defined(DART_PRECOMPILED_RUNTIME)
 #define STUB_CODE_DECLARE(name) {nullptr, #name},
@@ -97,24 +94,8 @@
   return entries_[kAsynchronousGapMarkerIndex].code != nullptr;
 }
 
-bool StubCode::InInvocationStub(uword pc, bool is_interpreted_frame) {
+bool StubCode::InInvocationStub(uword pc) {
   ASSERT(HasBeenInitialized());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_enable_interpreter) {
-    if (is_interpreted_frame) {
-      // Recognize special marker set up by interpreter in entry frame.
-      return Interpreter::IsEntryFrameMarker(
-          reinterpret_cast<const KBCInstr*>(pc));
-    }
-    {
-      uword entry = StubCode::InvokeDartCodeFromBytecode().EntryPoint();
-      uword size = StubCode::InvokeDartCodeFromBytecodeSize();
-      if ((pc >= entry) && (pc < (entry + size))) {
-        return true;
-      }
-    }
-  }
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   uword entry = StubCode::InvokeDartCode().EntryPoint();
   uword size = StubCode::InvokeDartCodeSize();
   return (pc >= entry) && (pc < (entry + size));
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 016b845..a946cd5 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -46,7 +46,7 @@
 
   // Check if specified pc is in the dart invocation stub used for
   // transitioning into dart code.
-  static bool InInvocationStub(uword pc, bool is_interpreted_frame);
+  static bool InInvocationStub(uword pc);
 
   // Check if the specified pc is in the jump to frame stub.
   static bool InJumpToFrameStub(uword pc);
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index baf6507..d127701 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -42,7 +42,6 @@
   V(CloneContext)                                                              \
   V(CallToRuntime)                                                             \
   V(LazyCompile)                                                               \
-  V(InterpretCall)                                                             \
   V(CallBootstrapNative)                                                       \
   V(CallNoScopeNative)                                                         \
   V(CallAutoScopeNative)                                                       \
@@ -50,7 +49,6 @@
   V(CallStaticFunction)                                                        \
   V(OptimizeFunction)                                                          \
   V(InvokeDartCode)                                                            \
-  V(InvokeDartCodeFromBytecode)                                                \
   V(DebugStepCheck)                                                            \
   V(SwitchableCallMiss)                                                        \
   V(MonomorphicSmiableCheck)                                                   \
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 55b1ba1..40b953c 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -40,7 +40,6 @@
   V(ByteData, "ByteData")                                                      \
   V(ByteDataDot, "ByteData.")                                                  \
   V(ByteDataDot_view, "ByteData._view")                                        \
-  V(Bytecode, "Bytecode")                                                      \
   V(Call, "call")                                                              \
   V(Cancel, "cancel")                                                          \
   V(CastError, "_CastError")                                                   \
@@ -237,7 +236,6 @@
   V(Other, "other")                                                            \
   V(OutOfMemoryError, "OutOfMemoryError")                                      \
   V(PackageScheme, "package:")                                                 \
-  V(ParameterTypeCheck, "ParameterTypeCheck")                                  \
   V(Patch, "patch")                                                            \
   V(PatchClass, "PatchClass")                                                  \
   V(PcDescriptors, "PcDescriptors")                                            \
@@ -449,7 +447,6 @@
   V(_handleMessage, "_handleMessage")                                          \
   V(_instanceOf, "_instanceOf")                                                \
   V(_lookupHandler, "_lookupHandler")                                          \
-  V(_lookupOpenPorts, "_lookupOpenPorts")                                      \
   V(_name, "_name")                                                            \
   V(_onData, "_onData")                                                        \
   V(_rehashObjects, "_rehashObjects")                                          \
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 6a8ce03..703dfabd 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -243,7 +243,6 @@
 DEFINE_TAGGED_POINTER(KernelProgramInfo, Object)
 DEFINE_TAGGED_POINTER(WeakSerializationReference, Object)
 DEFINE_TAGGED_POINTER(Code, Object)
-DEFINE_TAGGED_POINTER(Bytecode, Object)
 DEFINE_TAGGED_POINTER(ObjectPool, Object)
 DEFINE_TAGGED_POINTER(Instructions, Object)
 DEFINE_TAGGED_POINTER(InstructionsSection, Object)
@@ -254,7 +253,6 @@
 DEFINE_TAGGED_POINTER(ExceptionHandlers, Object)
 DEFINE_TAGGED_POINTER(Context, Object)
 DEFINE_TAGGED_POINTER(ContextScope, Object)
-DEFINE_TAGGED_POINTER(ParameterTypeCheck, Object)
 DEFINE_TAGGED_POINTER(SingleTargetCache, Object)
 DEFINE_TAGGED_POINTER(UnlinkedCall, Object)
 DEFINE_TAGGED_POINTER(MonomorphicSmiableCall, Object)
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
index ecc7d18..8c48f22 100644
--- a/runtime/vm/tags.cc
+++ b/runtime/vm/tags.cc
@@ -36,7 +36,7 @@
 }
 
 bool VMTag::IsDartTag(uword id) {
-  return (id == kDartCompiledTagId) || (id == kDartInterpretedTagId);
+  return (id == kDartTagId);
 }
 
 bool VMTag::IsExitFrameTag(uword id) {
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index 4f3b665..e8d5919 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -18,13 +18,11 @@
   V(Idle)     /* isolate is idle and is_runnable() */                          \
   V(LoadWait) /* isolate is idle and !is_runnable() */                         \
   V(VM)       /* Catch all */                                                  \
-  V(LoadBytecode)                                                              \
   V(CompileOptimized)                                                          \
   V(CompileUnoptimized)                                                        \
   V(ClassLoading)                                                              \
   V(CompileParseRegExp)                                                        \
-  V(DartCompiled)                                                              \
-  V(DartInterpreted)                                                           \
+  V(Dart)                                                                      \
   V(GCNewSpace)                                                                \
   V(GCOldSpace)                                                                \
   V(GCIdle)                                                                    \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index ecc51c5..e6b9b99 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -40,10 +40,6 @@
   ASSERT(isolate_ == NULL);
   ASSERT(store_buffer_block_ == NULL);
   ASSERT(marking_stack_block_ == NULL);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  delete interpreter_;
-  interpreter_ = nullptr;
-#endif
   // There should be no top api scopes at this point.
   ASSERT(api_top_scope() == NULL);
   // Delete the resusable api scope if there is one.
@@ -107,9 +103,6 @@
 #if defined(USING_SAFE_STACK)
               saved_safestack_limit_(0),
 #endif
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      interpreter_(nullptr),
-#endif
       next_(NULL) {
 #if defined(SUPPORT_TIMELINE)
   dart_stream_ = Timeline::GetDartStream();
@@ -681,12 +674,6 @@
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&async_stack_trace_));
   visitor->VisitPointer(reinterpret_cast<ObjectPtr*>(&ffi_callback_code_));
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  if (interpreter() != NULL) {
-    interpreter()->VisitObjectPointers(visitor);
-  }
-#endif
-
   // Visit the api local scope as it has all the api local handles.
   ApiLocalScope* scope = api_top_scope_;
   while (scope != NULL) {
@@ -922,11 +909,6 @@
   // False positives: simulator stack and native stack are unordered.
   return true;
 #else
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // False positives: interpreter stack and native stack are unordered.
-  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
-    return true;
-#endif
   return reinterpret_cast<uword>(long_jump_base()) < top_exit_frame_info_;
 #endif
 }
@@ -938,11 +920,6 @@
   // False positives: simulator stack and native stack are unordered.
   return true;
 #else
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // False positives: interpreter stack and native stack are unordered.
-  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
-    return true;
-#endif
   return top_exit_frame_info_ < reinterpret_cast<uword>(long_jump_base());
 #endif
 }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 34a65d0..a4ecadb 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -32,7 +32,6 @@
 class CompilerState;
 class Class;
 class Code;
-class Bytecode;
 class Error;
 class ExceptionHandlers;
 class Field;
@@ -43,7 +42,6 @@
 class Heap;
 class HierarchyInfo;
 class Instance;
-class Interpreter;
 class Isolate;
 class IsolateGroup;
 class Library;
@@ -73,7 +71,6 @@
   V(Array)                                                                     \
   V(Class)                                                                     \
   V(Code)                                                                      \
-  V(Bytecode)                                                                  \
   V(Error)                                                                     \
   V(ExceptionHandlers)                                                         \
   V(Field)                                                                     \
@@ -98,8 +95,6 @@
     StubCode::FixAllocationStubTarget().raw(), nullptr)                        \
   V(CodePtr, invoke_dart_code_stub_, StubCode::InvokeDartCode().raw(),         \
     nullptr)                                                                   \
-  V(CodePtr, invoke_dart_code_from_bytecode_stub_,                             \
-    StubCode::InvokeDartCodeFromBytecode().raw(), nullptr)                     \
   V(CodePtr, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), nullptr)  \
   V(CodePtr, late_initialization_error_shared_without_fpu_regs_stub_,          \
     StubCode::LateInitializationErrorSharedWithoutFPURegs().raw(), nullptr)    \
@@ -210,7 +205,6 @@
     NativeEntry::NoScopeNativeCallWrapperEntry(), 0)                           \
   V(uword, auto_scope_native_wrapper_entry_point_,                             \
     NativeEntry::AutoScopeNativeCallWrapperEntry(), 0)                         \
-  V(uword, interpret_call_entry_point_, RuntimeEntry::InterpretCallEntry(), 0) \
   V(StringPtr*, predefined_symbols_address_, Symbols::PredefinedAddress(),     \
     NULL)                                                                      \
   V(uword, double_nan_address_, reinterpret_cast<uword>(&double_nan_constant), \
@@ -472,11 +466,6 @@
     type_usage_info_ = value;
   }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Interpreter* interpreter() const { return interpreter_; }
-  void set_interpreter(Interpreter* value) { interpreter_ = value; }
-#endif
-
   int32_t no_callback_scope_depth() const { return no_callback_scope_depth_; }
 
   void IncrementNoCallbackScopeDepth() {
@@ -1031,10 +1020,6 @@
   uword saved_safestack_limit_;
 #endif
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  Interpreter* interpreter_;
-#endif
-
   Thread* next_;  // Used to chain the thread structures in an isolate.
   bool is_mutator_thread_ = false;
 
@@ -1068,7 +1053,6 @@
 #undef REUSABLE_FRIEND_DECLARATION
 
   friend class ApiZone;
-  friend class Interpreter;
   friend class InterruptChecker;
   friend class Isolate;
   friend class IsolateGroup;
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 41e3374..4ea5308 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -14,8 +14,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, enable_interpreter);
-
 VM_UNIT_TEST_CASE(Mutex) {
   // This unit test case needs a running isolate.
   TestCase::CreateTestIsolate();
@@ -638,7 +636,7 @@
 #if defined(USING_SIMULATOR)
   const intptr_t kLoopCount = 12345678;
 #else
-  const intptr_t kLoopCount = FLAG_enable_interpreter ? 12345678 : 1234567890;
+  const intptr_t kLoopCount = 1234567890;
 #endif  // defined(USING_SIMULATOR)
   char buffer[1024];
   Utils::SNPrint(buffer, sizeof(buffer),
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index 83569d7..a0e71ef 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -41,7 +41,6 @@
   "code_patcher_arm.cc",
   "code_patcher_arm64.cc",
   "code_patcher_ia32.cc",
-  "code_patcher_kbc.cc",
   "code_patcher_x64.cc",
   "compilation_trace.cc",
   "compilation_trace.h",
@@ -52,8 +51,6 @@
   "constants_base.h",
   "constants_ia32.cc",
   "constants_ia32.h",
-  "constants_kbc.cc",
-  "constants_kbc.h",
   "constants_x64.cc",
   "constants_x64.h",
   "cpu.h",
@@ -85,7 +82,6 @@
   "debugger_arm.cc",
   "debugger_arm64.cc",
   "debugger_ia32.cc",
-  "debugger_kbc.cc",
   "debugger_x64.cc",
   "deferred_objects.cc",
   "deferred_objects.h",
@@ -130,12 +126,8 @@
   "instructions_arm64.h",
   "instructions_ia32.cc",
   "instructions_ia32.h",
-  "instructions_kbc.cc",
-  "instructions_kbc.h",
   "instructions_x64.cc",
   "instructions_x64.h",
-  "interpreter.cc",
-  "interpreter.h",
   "intrusive_dlist.h",
   "isolate.cc",
   "isolate.h",
@@ -298,7 +290,6 @@
   "stack_frame_arm.h",
   "stack_frame_arm64.h",
   "stack_frame_ia32.h",
-  "stack_frame_kbc.h",
   "stack_frame_x64.h",
   "stack_trace.cc",
   "stack_trace.h",
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 8f8b02c..91a567d 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -22,8 +22,7 @@
 @patch
 class ReceivePort {
   @patch
-  factory ReceivePort([String debugName = '']) =>
-      new _ReceivePortImpl(debugName);
+  factory ReceivePort() => new _ReceivePortImpl();
 
   @patch
   factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
@@ -63,16 +62,15 @@
    * event is received.
    */
   @patch
-  factory RawReceivePort([Function? handler, String debugName = '']) {
-    _RawReceivePortImpl result = new _RawReceivePortImpl(debugName);
+  factory RawReceivePort([Function? handler]) {
+    _RawReceivePortImpl result = new _RawReceivePortImpl();
     result.handler = handler;
     return result;
   }
 }
 
 class _ReceivePortImpl extends Stream implements ReceivePort {
-  _ReceivePortImpl([String debugName = ''])
-      : this.fromRawReceivePort(new RawReceivePort(null, debugName));
+  _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort());
 
   _ReceivePortImpl.fromRawReceivePort(this._rawPort)
       : _controller = new StreamController(sync: true) {
@@ -130,21 +128,11 @@
 
 @pragma("vm:entry-point")
 class _RawReceivePortImpl implements RawReceivePort {
-  factory _RawReceivePortImpl(String debugName) {
-    final port = _RawReceivePortImpl._(debugName);
-    _portMap[port._get_id()] = {
-      'port': port,
-      'handler': null,
-    };
-    return port;
-  }
-
-  factory _RawReceivePortImpl._(String debugName)
-      native "RawReceivePortImpl_factory";
+  factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
 
   close() {
     // Close the port and remove it from the handler map.
-    _portMap.remove(this._closeInternal());
+    _handlerMap.remove(this._closeInternal());
   }
 
   SendPort get sendPort {
@@ -167,15 +155,10 @@
   // Called from the VM to retrieve the handler for a message.
   @pragma("vm:entry-point", "call")
   static _lookupHandler(int id) {
-    var result = _portMap[id]?['handler'];
+    var result = _handlerMap[id];
     return result;
   }
 
-  @pragma("vm:entry-point", "call")
-  static _lookupOpenPorts() {
-    return _portMap.values.map((e) => e['port']).toList();
-  }
-
   // Called from the VM to dispatch to the handler.
   @pragma("vm:entry-point", "call")
   static void _handleMessage(Function handler, var message) {
@@ -190,18 +173,22 @@
   _closeInternal() native "RawReceivePortImpl_closeInternal";
 
   void set handler(Function? value) {
-    final id = this._get_id();
-    if (!_portMap.containsKey(id)) {
-      _portMap[id] = {
-        'port': this,
-        'handler': value,
-      };
-    } else {
-      _portMap[id]!['handler'] = value;
-    }
+    _handlerMap[this._get_id()] = value;
   }
 
-  static final _portMap = <dynamic, Map<String, dynamic>>{};
+  // TODO(iposva): Ideally keep this map in the VM.
+  // id to handler mapping.
+  static _initHandlerMap() {
+    // TODO(18511): Workaround bad CheckSmi hoisting.
+    var tempMap = new HashMap();
+    // Collect feedback that not all keys are Smis.
+    tempMap["."] = 1;
+    tempMap["."] = 2;
+
+    return new HashMap();
+  }
+
+  static final Map _handlerMap = _initHandlerMap();
 }
 
 @pragma("vm:entry-point")
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index b7650dd..0c5747e 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -671,12 +671,9 @@
    * receive messages. See [Stream.asBroadcastStream] for transforming the port
    * to a broadcast stream.
    *
-   * The optional `debugName` parameter can be set to associate a name with
-   * this port that can be displayed in tooling.
-   *
    * A receive port is closed by canceling its subscription.
    */
-  external factory ReceivePort([String debugName = '']);
+  external factory ReceivePort();
 
   /**
    * Creates a [ReceivePort] from a [RawReceivePort].
@@ -721,12 +718,8 @@
    * A [RawReceivePort] is low level and does not work with [Zone]s. It
    * can not be paused. The data-handler must be set before the first
    * event is received.
-   *
-   * The optional `debugName` parameter can be set to associate a name with
-   * this port that can be displayed in tooling.
-   *
    */
-  external factory RawReceivePort([Function? handler, String debugName = '']);
+  external factory RawReceivePort([Function? handler]);
 
   /**
    * Sets the handler that is invoked for every incoming message.
diff --git a/tests/lib/html/js_extend_class_test.dart b/tests/lib/html/js_extend_class_test.dart
deleted file mode 100644
index 546a45a..0000000
--- a/tests/lib/html/js_extend_class_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2017, 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.
-
-@JS()
-library js_extend_class_test;
-
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:js/js_util.dart' as js_util;
-import 'package:expect/minitest.dart';
-
-@JS('Date')
-class JSDate {
-  external get jsField;
-  external get jsMethod;
-}
-
-@JS('Date.prototype.jsField')
-external set datePrototypeJSField(v);
-
-@JS('Date.prototype.jsMethod')
-external set datePrototypeJSMethod(v);
-
-// Extending a JS class with a Dart class is only supported by DDC for now.
-// We extend the Date class instead of a user defined JS class to avoid the
-// hassle of ensuring the JS class exists before we use it.
-class DartJsDate extends JSDate {
-  get dartField => 100;
-  int dartMethod(x) {
-    return x * 2;
-  }
-}
-
-main() {
-  // Monkey-patch the JS Date class.
-  datePrototypeJSField = 42;
-  datePrototypeJSMethod = allowInterop((x) => x * 10);
-
-  group('extend js class', () {
-    test('js class members', () {
-      var bar = new DartJsDate();
-      expect(bar.jsField, equals(42));
-      expect(bar.jsMethod(5), equals(50));
-
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-
-    test('instance checks and casts', () {
-      var bar = new DartJsDate();
-      expect(bar is JSDate, isTrue);
-      expect(bar as JSDate, equals(bar));
-    });
-
-    test('dart subclass members', () {
-      var bar = new DartJsDate();
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-  });
-}
diff --git a/tests/lib/js/extends_static_test.dart b/tests/lib/js/extends_static_test.dart
new file mode 100644
index 0000000..e7300d4
--- /dev/null
+++ b/tests/lib/js/extends_static_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2020, 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.
+
+@JS()
+library extends_static_test;
+
+import 'package:js/js.dart';
+
+@JS()
+class JSClass {}
+
+@JS()
+@anonymous
+class AnonymousClass {}
+
+class DartClass {}
+
+class DartExtendJSClass extends JSClass {}
+//    ^
+// [web] Dart class 'DartExtendJSClass' cannot extend JS interop class 'JSClass'.
+
+class DartExtendAnonymousClass extends AnonymousClass {}
+//    ^
+// [web] Dart class 'DartExtendAnonymousClass' cannot extend JS interop class 'AnonymousClass'.
+
+@JS()
+class JSExtendDartClass extends DartClass {}
+//    ^
+// [web] JS interop class 'JSExtendDartClass' cannot extend Dart class 'DartClass'.
+
+@JS()
+@anonymous
+class AnonymousExtendDartClass extends DartClass {}
+//    ^
+// [web] JS interop class 'AnonymousExtendDartClass' cannot extend Dart class 'DartClass'.
+
+void main() {}
diff --git a/tests/lib_2/html/js_extend_class_test.dart b/tests/lib_2/html/js_extend_class_test.dart
deleted file mode 100644
index 546a45a..0000000
--- a/tests/lib_2/html/js_extend_class_test.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2017, 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.
-
-@JS()
-library js_extend_class_test;
-
-import 'dart:html';
-
-import 'package:js/js.dart';
-import 'package:js/js_util.dart' as js_util;
-import 'package:expect/minitest.dart';
-
-@JS('Date')
-class JSDate {
-  external get jsField;
-  external get jsMethod;
-}
-
-@JS('Date.prototype.jsField')
-external set datePrototypeJSField(v);
-
-@JS('Date.prototype.jsMethod')
-external set datePrototypeJSMethod(v);
-
-// Extending a JS class with a Dart class is only supported by DDC for now.
-// We extend the Date class instead of a user defined JS class to avoid the
-// hassle of ensuring the JS class exists before we use it.
-class DartJsDate extends JSDate {
-  get dartField => 100;
-  int dartMethod(x) {
-    return x * 2;
-  }
-}
-
-main() {
-  // Monkey-patch the JS Date class.
-  datePrototypeJSField = 42;
-  datePrototypeJSMethod = allowInterop((x) => x * 10);
-
-  group('extend js class', () {
-    test('js class members', () {
-      var bar = new DartJsDate();
-      expect(bar.jsField, equals(42));
-      expect(bar.jsMethod(5), equals(50));
-
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-
-    test('instance checks and casts', () {
-      var bar = new DartJsDate();
-      expect(bar is JSDate, isTrue);
-      expect(bar as JSDate, equals(bar));
-    });
-
-    test('dart subclass members', () {
-      var bar = new DartJsDate();
-      expect(bar.dartField, equals(100));
-      expect(bar.dartMethod(4), equals(8));
-    });
-  });
-}
diff --git a/tests/standalone_2/io/file_lock_script.dart b/tests/standalone_2/io/file_lock_script.dart
index 071f594..f2beba8 100644
--- a/tests/standalone_2/io/file_lock_script.dart
+++ b/tests/standalone_2/io/file_lock_script.dart
@@ -1,7 +1,13 @@
 // Copyright (c) 2015, 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.
-//
+
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 // Script used by the file_lock_test.dart test.
 
 import "dart:io";
diff --git a/tests/standalone_2/io/process_detached_script.dart b/tests/standalone_2/io/process_detached_script.dart
index 7811726..5d4cccf 100644
--- a/tests/standalone_2/io/process_detached_script.dart
+++ b/tests/standalone_2/io/process_detached_script.dart
@@ -1,7 +1,13 @@
 // Copyright (c) 2015, 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.
-//
+
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 // Simple script hanging for testing a detached process.
 
 import 'dart:io';
diff --git a/tests/standalone_2/io/stdin_sync_script.dart b/tests/standalone_2/io/stdin_sync_script.dart
index 5b38fd2..86b08dc 100644
--- a/tests/standalone_2/io/stdin_sync_script.dart
+++ b/tests/standalone_2/io/stdin_sync_script.dart
@@ -2,6 +2,12 @@
 // 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.
 
+// Normally the CFE recognizes files in ..._2 directories and automatically
+// opts those libraries out of NNBD.  Though this file will be copied to the
+// build directory, which will cause the CFE no longer to automatically opt it
+// out of NNBD, so we do that explicitly here.
+// @dart=2.9
+
 import "dart:convert";
 import "dart:io";
 
diff --git a/tests/standalone_2/io/stdin_sync_test.dart b/tests/standalone_2/io/stdin_sync_test.dart
index 30f1e33..ae8e6ca 100644
--- a/tests/standalone_2/io/stdin_sync_test.dart
+++ b/tests/standalone_2/io/stdin_sync_test.dart
@@ -7,7 +7,6 @@
 import "dart:convert";
 import "dart:io";
 
-import "package:path/path.dart";
 import "package:expect/expect.dart";
 
 void testReadByte() {
diff --git a/tools/VERSION b/tools/VERSION
index c74d0b4..ba1203e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 271
+PRERELEASE 272
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/android/VERSION_LINUX_NDK b/tools/android/VERSION_LINUX_NDK
deleted file mode 100644
index 4fac77b..0000000
--- a/tools/android/VERSION_LINUX_NDK
+++ /dev/null
@@ -1 +0,0 @@
-e626c47cb82a7439b0eda03ac6e0e9e1e41c6093
diff --git a/tools/android/VERSION_LINUX_SDK b/tools/android/VERSION_LINUX_SDK
deleted file mode 100644
index d24f5c1..0000000
--- a/tools/android/VERSION_LINUX_SDK
+++ /dev/null
@@ -1 +0,0 @@
-0d320c50b0ed188c7e1182388e2beb623a1d307d
diff --git a/tools/android/VERSION_MACOSX_NDK b/tools/android/VERSION_MACOSX_NDK
deleted file mode 100644
index bd19b05..0000000
--- a/tools/android/VERSION_MACOSX_NDK
+++ /dev/null
@@ -1 +0,0 @@
-e8b6ecb5d15c4c4018a62b52aabc13e41b17df8f
diff --git a/tools/android/VERSION_MACOSX_SDK b/tools/android/VERSION_MACOSX_SDK
deleted file mode 100644
index 2441d72..0000000
--- a/tools/android/VERSION_MACOSX_SDK
+++ /dev/null
@@ -1 +0,0 @@
-fa5ea0ca1e0c7c2e40914f3202c7545de4dbca9c
diff --git a/tools/android/download_android_tools.py b/tools/android/download_android_tools.py
deleted file mode 100644
index b264e58..0000000
--- a/tools/android/download_android_tools.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Dart project authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Downloads trimmed-down Android Tools from Google Cloud Storage and extracts
-# them to INSTALL_DIR, updating INSTALL_DIR/VERSION_* stamp files with current
-# version. Does nothing if INSTALL_DIR/VERSION_* are already up to date.
-
-import os
-import shutil
-import subprocess
-import sys
-import tarfile
-
-# Path constants. (All of these should be absolute paths.)
-THIS_DIR = os.path.abspath(os.path.dirname(__file__))
-DART_ROOT = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
-# Should be the same as in upload.py.
-INSTALL_DIR = os.path.join(DART_ROOT, 'third_party', 'android_tools')
-
-sys.path.insert(0, os.path.join(DART_ROOT, 'tools'))
-import find_depot_tools
-
-DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
-GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
-
-
-def RunCommand(command):
-    """Run command and return success (True) or failure."""
-
-    print 'Running %s' % (str(command))
-    if subprocess.call(command, shell=False) == 0:
-        return True
-    print 'Failed.'
-    return False
-
-
-def GetInstalledVersion(version_stamp):
-    version_file = os.path.join(INSTALL_DIR, version_stamp)
-    if not os.path.exists(version_file):
-        return None
-    with open(version_file) as f:
-        return f.read().strip()
-
-
-def VersionStampName(tools_name):
-    if sys.platform.startswith('linux'):
-        return 'VERSION_LINUX_' + tools_name.upper()
-    elif sys.platform == 'darwin':
-        return 'VERSION_MACOSX_' + tools_name.upper()
-    else:
-        print('NOTE: Will not download android tools. Unsupported platform: ' +
-              sys.platform)
-        sys.exit(0)
-
-
-def UpdateTools(tools_name):
-    """Downloads zipped tools from Google Cloud Storage and extracts them,
-     stamping current version."""
-
-    # Read latest version.
-    version_stamp = VersionStampName(tools_name)
-    version = ''
-    with open(os.path.join(THIS_DIR, version_stamp)) as f:
-        version = f.read().strip()
-    # Return if installed binaries are up to date.
-    if version == GetInstalledVersion(version_stamp):
-        return
-
-    # Remove the old install directory checked out from git.
-    if os.path.exists(os.path.join(INSTALL_DIR, '.git')):
-        shutil.rmtree(INSTALL_DIR)
-    # Make sure that the install directory exists.
-    if not os.path.exists(INSTALL_DIR):
-        os.mkdir(INSTALL_DIR)
-    # Remove current installation.
-    tools_root = os.path.join(INSTALL_DIR, tools_name)
-    if os.path.exists(tools_root):
-        shutil.rmtree(tools_root)
-
-    # Download tools from GCS.
-    archive_path = os.path.join(INSTALL_DIR, tools_name + '.tar.gz')
-    download_cmd = [
-        'python', GSUTIL_PATH, 'cp',
-        'gs://mojo/android/tool/%s.tar.gz' % version, archive_path
-    ]
-    if not RunCommand(download_cmd):
-        print('WARNING: Failed to download Android tools.')
-        return
-
-    print "Extracting Android tools (" + tools_name + ")"
-    with tarfile.open(archive_path) as arch:
-        arch.extractall(INSTALL_DIR)
-    os.remove(archive_path)
-    # Write version as the last step.
-    with open(os.path.join(INSTALL_DIR, version_stamp), 'w+') as f:
-        f.write('%s\n' % version)
-
-
-def main():
-    UpdateTools('sdk')
-    UpdateTools('ndk')
-
-
-if __name__ == '__main__':
-    sys.exit(main())