Version 2.18.0-80.0.dev

Merge commit '7836057041abb3bd1cbe489f731e644a411f2247' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6284408..7f90627 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,139 @@
 
 ## 2.17.0
 
+### Language
+
+The following features are new in the Dart 2.17 [language version][]. To use
+them, you must set the lower bound on the SDK constraint for your package to
+2.17 or greater (`sdk: '>=2.17.0 <3.0.0'`).
+
+[language version]: https://dart.dev/guides/language/evolution
+
+-   **[Enhanced enums with members][]**: Enum declarations can now define
+    members including fields, constructors, methods, getters, etc. For example:
+
+    ```dart
+    enum Water {
+      frozen(32),
+      lukewarm(100),
+      boiling(212);
+
+      final int tempInFahrenheit;
+      const Water(this.tempInFahrenheit);
+
+      @override
+      String toString() => "The $name water is $tempInFahrenheit F.";
+    }
+    ```
+
+    Constructors must be `const` since enum values are always constants. If the
+    constructor takes arguments, they are passed when the enum value is
+    declared.
+
+    The above enum can be used like so:
+
+    ```dart
+    void main() {
+      print(Water.frozen); // prints "The frozen water is 32 F."
+    }
+    ```
+
+[enhanced enums with members]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/enhanced-enums/feature-specification.md
+
+-   **[Super parameters][]**: When extending a class whose constructor takes
+    parameters, the subclass constructor needs to provide arguments for them.
+    Often, these are passed as parameters to the subclass constructor, which
+    then forwards them to the superclass constructor. This is verbose because
+    the subclass constructor must list the name and type of each parameter in
+    its parameter list, and then explicitly forward each one as an argument to
+    the superclass constructor.
+
+    [@roy-sianez][] suggested [allowing `super.`][super dot] before a subclass
+    constructor parameter to implicitly forward it to the corresponding
+    superclass constructor parameter. Applying this feature to Flutter
+    eliminated [nearly 2,000 lines of code][flutter super]. For example, before:
+
+    ```dart
+    class CupertinoPage<T> extends Page<T> {
+      const CupertinoPage({
+        required this.child,
+        this.maintainState = true,
+        this.title,
+        this.fullscreenDialog = false,
+        LocalKey? key,
+        String? name,
+        Object? arguments,
+        String? restorationId,
+      }) : super(
+            key: key,
+            name: name,
+            arguments: arguments,
+            restorationId: restorationId,
+          );
+
+      // ...
+    }
+    ```
+
+    And using super parameters:
+
+    ```dart
+    class CupertinoPage<T> extends Page<T> {
+      const CupertinoPage({
+        required this.child,
+        this.maintainState = true,
+        this.title,
+        this.fullscreenDialog = false,
+        super.key,
+        super.name,
+        super.arguments,
+        super.restorationId,
+      });
+
+      // ...
+    }
+    ```
+
+    From our analysis, over 90% of explicit superclass constructor calls can be
+    completely eliminated, using `super.` parameters instead.
+
+[super parameters]: https://github.com/dart-lang/language/blob/master/working/1855%20-%20super%20parameters/proposal.md
+[@roy-sianez]: https://github.com/roy-sianez
+[super dot]: https://github.com/dart-lang/language/issues/1855
+[flutter super]: https://github.com/flutter/flutter/pull/100905/files
+
+-   **[Named args everywhere][]**: In a function call, Dart requires positional
+    arguments to appear before named arguments. This can be frustrating for
+    arguments like collection literals and function expressions that look best
+    as the last argument in the argument list but are positional, like the
+    `test()` function in the [test package][]:
+
+    ```dart
+    main() {
+      test('A test description', () {
+        // Very long function body here...
+      }, skip: true);
+    }
+    ```
+
+    It would be better if the `skip` argument appeared at the top of the call
+    to `test()` so that it wasn't easily overlooked, but since it's named and
+    the test body argument is positional, `skip` must be placed at the end.
+
+    Dart 2.17 removes this restriction. Named arguments can be freely
+    interleaved with positional arguments, allowing code like:
+
+    ```dart
+    main() {
+      test(skip: true, 'A test description', () {
+        // Very long function body here...
+      });
+    }
+    ```
+
+[named args everywhere]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/named-arguments-anywhere/feature-specification.md
+[test package]: https://pub.dev/packages/test
+
 ### Core libraries
 
 #### `dart:core`
@@ -275,6 +408,7 @@
 - Pub now supports a separate `pubspec_overrides.yaml` file that can contain
   `dependency_overrides`. This makes it easier to avoid checking the local
   overrides into version control.
+
 #### Linter
 
 Updated the Linter to `1.18.0`, which includes changes that
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 33ba10e..a7ce3f3 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -2,15 +2,20 @@
 // 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/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:analyzer/src/dart/micro/utils.dart';
+import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
 
 class CanRenameResponse {
@@ -45,12 +50,31 @@
       status = validateTypeAliasName(name);
     } else if (element is ClassElement) {
       status = validateClassName(name);
+    } else if (element is ConstructorElement) {
+      status = validateConstructorName(name);
+      _analyzePossibleConflicts(element, status, name);
     }
 
     if (status == null) {
       return null;
     }
-    return CheckNameResponse(status, this);
+    return CheckNameResponse(status, this, name);
+  }
+
+  void _analyzePossibleConflicts(
+      ConstructorElement element, RefactoringStatus result, String newName) {
+    var parentClass = element.enclosingElement;
+    // Check if the "newName" is the name of the enclosing class.
+    if (parentClass.name == newName) {
+      result.addError('The constructor should not have the same name '
+          'as the name of the enclosing class.');
+    }
+    // check if there are members with "newName" in the same ClassElement
+    for (var newNameMember in getChildren(parentClass, newName)) {
+      var message = format("Class '{0}' already declares {1} with name '{2}'.",
+          parentClass.displayName, getElementKindName(newNameMember), newName);
+      result.addError(message, newLocation_fromElement(newNameMember));
+    }
   }
 
   FlutterWidgetState? _findFlutterStateClass(Element element, String newName) {
@@ -76,8 +100,9 @@
 class CheckNameResponse {
   final RefactoringStatus status;
   final CanRenameResponse canRename;
+  final String newName;
 
-  CheckNameResponse(this.status, this.canRename);
+  CheckNameResponse(this.status, this.canRename, this.newName);
 
   LineInfo get lineInfo => canRename.lineInfo;
 
@@ -100,13 +125,148 @@
     for (var element in elements) {
       matches.addAll(await fileResolver.findReferences2(element));
     }
+
     FlutterWidgetRename? flutterRename;
-    if (canRename._flutterWidgetState != null) {
-      var stateWidget = canRename._flutterWidgetState!;
-      var match = await fileResolver.findReferences2(stateWidget.state);
-      flutterRename = FlutterWidgetRename(stateWidget.newName, match);
+    var flutterState = canRename._flutterWidgetState;
+    if (flutterState != null) {
+      var stateClass = flutterState.state;
+      var stateName = flutterState.newName;
+      var match = await fileResolver.findReferences2(stateClass);
+      var sourcePath = stateClass.source.fullName;
+      var location = stateClass.enclosingElement.lineInfo
+          .getLocation(stateClass.nameOffset);
+      CiderSearchMatch ciderMatch;
+      var searchInfo = CiderSearchInfo(
+          location, stateClass.nameLength, MatchKind.DECLARATION);
+      try {
+        ciderMatch = match.firstWhere((m) => m.path == sourcePath);
+        ciderMatch.references.add(searchInfo);
+      } catch (_) {
+        match.add(CiderSearchMatch(sourcePath, [], [searchInfo]));
+      }
+      var replacements = match
+          .map((m) => CiderReplaceMatch(
+              m.path,
+              m.references
+                  .map((p) => ReplaceInfo(
+                      stateName, p.startPosition, stateClass.nameLength))
+                  .toList()))
+          .toList();
+      flutterRename = FlutterWidgetRename(stateName, match, replacements);
     }
-    return RenameResponse(matches, this, flutterWidgetRename: flutterRename);
+    var replaceMatches = <CiderReplaceMatch>[];
+    if (element is ConstructorElement) {
+      for (var match in matches) {
+        var replaceInfo = <ReplaceInfo>[];
+        for (var ref in match.references) {
+          String replacement = newName.isNotEmpty ? '.$newName' : '';
+          if (replacement.isEmpty &&
+              ref.kind == MatchKind.REFERENCE_BY_CONSTRUCTOR_TEAR_OFF) {
+            replacement = '.new';
+          }
+          if (ref.kind ==
+              MatchKind.INVOCATION_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS) {
+            replacement += '()';
+          }
+          replaceInfo
+              .add(ReplaceInfo(replacement, ref.startPosition, ref.length));
+        }
+        replaceMatches.addMatch(match.path, replaceInfo);
+      }
+      if (element.isSynthetic) {
+        var result = await _replaceSyntheticConstructor();
+        if (result != null) {
+          replaceMatches.addMatch(result.path, result.matches.toList());
+        }
+      }
+    } else {
+      for (var match in matches) {
+        replaceMatches.addMatch(
+            match.path,
+            match.references
+                .map((info) =>
+                    ReplaceInfo(newName, info.startPosition, info.length))
+                .toList());
+      }
+      // add element declaration
+      var sourcePath = element.source!.fullName;
+      var infos = await _addElementDeclaration(element, sourcePath);
+      replaceMatches.addMatch(sourcePath, infos);
+    }
+    return RenameResponse(matches, this, replaceMatches,
+        flutterWidgetRename: flutterRename);
+  }
+
+  Future<List<ReplaceInfo>> _addElementDeclaration(
+      Element element, String sourcePath) async {
+    var infos = <ReplaceInfo>[];
+    if (element is PropertyInducingElement && element.isSynthetic) {
+      if (element.getter != null) {
+        infos.add(ReplaceInfo(
+            newName,
+            lineInfo.getLocation(element.getter!.nameOffset),
+            element.getter!.nameLength));
+      }
+      if (element.setter != null) {
+        infos.add(ReplaceInfo(
+            newName,
+            lineInfo.getLocation(element.setter!.nameOffset),
+            element.setter!.nameLength));
+      }
+    } else {
+      var location = (await canRename._fileResolver.resolve2(path: sourcePath))
+          .lineInfo
+          .getLocation(element.nameOffset);
+      infos.add(ReplaceInfo(newName, location, element.nameLength));
+    }
+    return infos;
+  }
+
+  Future<CiderReplaceMatch?> _replaceSyntheticConstructor() async {
+    var element = canRename.refactoringElement.element;
+    var classElement = element.enclosingElement;
+
+    var fileResolver = canRename._fileResolver;
+    var libraryPath = classElement!.library!.source.fullName;
+    var resolvedLibrary = await fileResolver.resolveLibrary2(path: libraryPath);
+    var result = resolvedLibrary.getElementDeclaration(classElement);
+    if (result == null) {
+      return null;
+    }
+
+    var resolvedUnit = result.resolvedUnit;
+    if (resolvedUnit == null) {
+      return null;
+    }
+
+    var node = result.node;
+    if (node is ClassDeclaration) {
+      var utils = CorrectionUtils(resolvedUnit);
+      var location = utils.prepareNewConstructorLocation(
+          fileResolver.contextObjects!.analysisSession, node);
+      if (location == null) {
+        return null;
+      }
+
+      var header = '${classElement.name}.$newName();';
+      return CiderReplaceMatch(libraryPath, [
+        ReplaceInfo(location.prefix + header + location.suffix,
+            resolvedUnit.lineInfo.getLocation(location.offset), 0)
+      ]);
+    } else if (node is EnumDeclaration) {
+      var utils = CorrectionUtils(resolvedUnit);
+      var location = utils.prepareEnumNewConstructorLocation(node);
+      if (location == null) {
+        return null;
+      }
+
+      var header = 'const ${classElement.name}.$newName();';
+      return CiderReplaceMatch(libraryPath, [
+        ReplaceInfo(location.prefix + header + location.suffix,
+            resolvedUnit.lineInfo.getLocation(location.offset), 0)
+      ]);
+    }
+    return null;
   }
 }
 
@@ -151,7 +311,7 @@
   bool _canRenameElement(Element element) {
     var enclosingElement = element.enclosingElement;
     if (element is ConstructorElement) {
-      return false;
+      return true;
     }
     if (element is LabelElement || element is LocalElement) {
       return true;
@@ -161,16 +321,24 @@
         enclosingElement is CompilationUnitElement) {
       return true;
     }
-
     return false;
   }
 }
 
+class CiderReplaceMatch {
+  final String path;
+  List<ReplaceInfo> matches;
+
+  CiderReplaceMatch(this.path, this.matches);
+}
+
 class FlutterWidgetRename {
   final String name;
+  @deprecated
   final List<CiderSearchMatch> matches;
+  final List<CiderReplaceMatch> replacements;
 
-  FlutterWidgetRename(this.name, this.matches);
+  FlutterWidgetRename(this.name, this.matches, this.replacements);
 }
 
 /// The corresponding `State` declaration of a  Flutter `StatefulWidget`.
@@ -182,9 +350,39 @@
 }
 
 class RenameResponse {
+  @deprecated
   final List<CiderSearchMatch> matches;
   final CheckNameResponse checkName;
+  final List<CiderReplaceMatch> replaceMatches;
   FlutterWidgetRename? flutterWidgetRename;
 
-  RenameResponse(this.matches, this.checkName, {this.flutterWidgetRename});
+  RenameResponse(this.matches, this.checkName, this.replaceMatches,
+      {this.flutterWidgetRename});
+}
+
+class ReplaceInfo {
+  final String replacementText;
+  final CharacterLocation startPosition;
+  final int length;
+
+  ReplaceInfo(this.replacementText, this.startPosition, this.length);
+
+  @override
+  bool operator ==(Object other) =>
+      other is ReplaceInfo &&
+      replacementText == other.replacementText &&
+      startPosition == other.startPosition &&
+      length == other.length;
+}
+
+extension on List<CiderReplaceMatch> {
+  void addMatch(String path, List<ReplaceInfo> infos) {
+    for (var m in this) {
+      if (m.path == path) {
+        m.matches.addAll(infos);
+        return;
+      }
+    }
+    add(CiderReplaceMatch(path, infos));
+  }
 }
diff --git a/pkg/analysis_server/test/src/cider/rename_test.dart b/pkg/analysis_server/test/src/cider/rename_test.dart
index 4adefd9..3a3ec88 100644
--- a/pkg/analysis_server/test/src/cider/rename_test.dart
+++ b/pkg/analysis_server/test/src/cider/rename_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analysis_server/src/cider/rename.dart';
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,6 +20,8 @@
 @reflectiveTest
 class CiderRenameComputerTest extends CiderServiceTest {
   late _CorrectionContext _correctionContext;
+  late LineInfo? _lineInfo;
+  late String _testCode;
 
   @override
   void setUp() {
@@ -27,6 +29,16 @@
     BazelMockPackages.instance.addFlutter(resourceProvider);
   }
 
+  void test_cannotRename_inSdk() async {
+    var refactor = await _compute(r'''
+main() {
+  new String.^fromCharCodes([]);
+}
+''');
+
+    expect(refactor, isNull);
+  }
+
   void test_canRename_class() async {
     var refactor = await _compute(r'''
 class ^Old {}
@@ -173,6 +185,17 @@
     expect(result.oldName, 'a');
   }
 
+  void test_checkName_newName() async {
+    var result = await _checkName(r'''
+class A {
+  A.^test() {}
+}
+''', 'test');
+
+    expect(result!.status.problems.length, 1);
+    expect(result.status.hasError, isTrue);
+  }
+
   void test_checkName_parameter() async {
     var result = await _checkName(r'''
 void foo(String ^a) {
@@ -203,7 +226,7 @@
   }
 
   void test_rename_class() async {
-    var result = await _rename(r'''
+    var testCode = '''
 class ^Old implements Other {
   Old() {}
   Old.named() {}
@@ -216,26 +239,26 @@
   Old t1 = new Old();
   Old t2 = new Old.named();
 }
-''', 'New');
-
-    expect(result!.matches.length, 1);
-    expect(result.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
-        CharacterLocation(1, 7),
-        CharacterLocation(2, 3),
-        CharacterLocation(3, 3),
-        CharacterLocation(6, 23),
-        CharacterLocation(7, 23),
-        CharacterLocation(10, 3),
-        CharacterLocation(10, 16),
-        CharacterLocation(11, 3),
-        CharacterLocation(11, 16)
-      ])
-    ]);
+''';
+    var result = await _rename(testCode, 'New');
+    _assertTestChangeResult('''
+class New implements Other {
+  New() {}
+  New.named() {}
+}
+class Other {
+  factory Other.a() = New;
+  factory Other.b() = New.named;
+}
+void f() {
+  New t1 = new New();
+  New t2 = new New.named();
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_class_flutterWidget() async {
-    var result = await _rename(r'''
+    var testCode = '''
 import 'package:flutter/material.dart';
 
 class ^TestPage extends StatefulWidget {
@@ -249,27 +272,299 @@
   @override
   Widget build(BuildContext context) => throw 0;
 }
-''', 'NewPage');
+''';
 
-    expect(result!.matches.length, 1);
-    expect(result.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
-        CharacterLocation(3, 7),
-        CharacterLocation(4, 9),
-        CharacterLocation(7, 9),
-        CharacterLocation(10, 35)
-      ])
+    var result = await _rename(testCode, 'NewPage');
+    expect(result!.replaceMatches.length, 1);
+    expect(result.replaceMatches.first.matches, [
+      ReplaceInfo('NewPage', CharacterLocation(4, 9), 8),
+      ReplaceInfo('NewPage', CharacterLocation(7, 9), 8),
+      ReplaceInfo('NewPage', CharacterLocation(10, 35), 8),
+      ReplaceInfo('NewPage', CharacterLocation(3, 7), 8)
     ]);
     expect(result.flutterWidgetRename != null, isTrue);
     expect(result.flutterWidgetRename!.name, 'NewPageState');
-    expect(result.flutterWidgetRename!.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(7, 36), CharacterLocation(10, 7)])
-    ]);
+    expect(
+        result.flutterWidgetRename!.replacements.first.matches
+            .map((m) => m.startPosition)
+            .toList(),
+        [CharacterLocation(7, 36), CharacterLocation(10, 7)]);
+  }
+
+  void test_rename_constructor_add() async {
+    var testCode = '''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [new A] and [A.new]
+class A {
+  ^A() {} // marker
+  factory A._() = A;
+}
+class B extends A {
+  B() : super() {}
+}
+main() {
+  new A();
+  A.new;
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [new A.newName] and [A.newName]
+class A {
+  A.newName() {} // marker
+  factory A._() = A.newName;
+}
+class B extends A {
+  B() : super.newName() {}
+}
+main() {
+  new A.newName();
+  A.newName;
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum() async {
+    var testCode = '''
+/// [E.new]
+enum E {
+  v1(), v2.new(), v3, v4.other();
+  const ^E(); // 0
+  const E.other() : this();
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+/// [E.newName]
+enum E {
+  v1.newName(), v2.newName(), v3.newName(), v4.other();
+  const E.newName(); // 0
+  const E.other() : this.newName();
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum_hasConstructor() async {
+    var testCode = '''
+/// [E.new]
+enum E {
+  v1(), v2.^new(), v3;
+
+  factory E.other() => throw 0;
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+/// [E.newName]
+enum E {
+  v1.newName(), v2.newName(), v3.newName();
+
+  factory E.other() => throw 0;
+
+  const E.newName();
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum_hasField() async {
+    var testCode = '''
+/// [E.new]
+enum E {
+  v1(), v2.^new(), v3;
+
+  final int foo = 0;
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+/// [E.newName]
+enum E {
+  v1.newName(), v2.newName(), v3.newName();
+
+  final int foo = 0;
+
+  const E.newName();
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum_hasMethod() async {
+    var testCode = '''
+/// [E.new]
+enum E {
+  v1(), v2.^new(), v3;
+
+  void foo() {}
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+/// [E.newName]
+enum E {
+  v1.newName(), v2.newName(), v3.newName();
+
+  const E.newName();
+
+  void foo() {}
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum_named() async {
+    var testCode = '''
+/// [E.test]
+enum E {
+  v1.^test(), v2.other();
+  const E.test(); // 0
+  const E.other() : this.test();
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+/// [E.newName]
+enum E {
+  v1.newName(), v2.other();
+  const E.newName(); // 0
+  const E.other() : this.newName();
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_enum_remove() async {
+    var testCode = '''
+/// [E]
+enum E {
+  v1.test(), v2.other();
+  const E.^test(); // 0
+  const E.other() : this.test();
+}
+''';
+
+    var result = await _rename(testCode, '');
+    _assertTestChangeResult('''
+/// [E]
+enum E {
+  v1(), v2.other();
+  const E(); // 0
+  const E.other() : this();
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_named() async {
+    var testCode = '''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [A.test] and [new A.test]
+class A {
+  A.^test() {} // marker
+  factory A._() = A.test;
+}
+class B extends A {
+  B() : super.test() {}
+}
+main() {
+  new A.test();
+  A.test;
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [A.newName] and [new A.newName]
+class A {
+  A.newName() {} // marker
+  factory A._() = A.newName;
+}
+class B extends A {
+  B() : super.newName() {}
+}
+main() {
+  new A.newName();
+  A.newName;
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_remove() async {
+    var testCode = '''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [A.test] and [new A.test]
+class A {
+  A.^test() {} // marker
+  factory A._() = A.test;
+}
+class B extends A {
+  B() : super.test() {}
+}
+main() {
+  new A.test();
+  A.test;
+}
+''';
+
+    var result = await _rename(testCode, '');
+    _assertTestChangeResult('''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [A] and [new A]
+class A {
+  A() {} // marker
+  factory A._() = A;
+}
+class B extends A {
+  B() : super() {}
+}
+main() {
+  new A();
+  A.new;
+}
+''', result!.replaceMatches.first.matches);
+  }
+
+  void test_rename_constructor_synthetic() async {
+    var testCode = '''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [new A] and [A.new]
+class A {
+  int field = 0;
+}
+class B extends A {
+  B() : super() {}
+}
+main() {
+  new A();
+  A.^new;
+}
+''';
+
+    var result = await _rename(testCode, 'newName');
+    _assertTestChangeResult('''
+// ignore: deprecated_new_in_comment_reference
+/// Documentation for [new A.newName] and [A.newName]
+class A {
+  int field = 0;
+
+  A.newName();
+}
+class B extends A {
+  B() : super.newName() {}
+}
+main() {
+  new A.newName();
+  A.newName;
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_field() async {
-    var result = await _rename(r'''
+    var testCode = '''
 class A{
   int get ^x => 5;
 }
@@ -277,17 +572,22 @@
 void foo() {
   var m = A().x;
 }
-''', 'y');
+''';
 
-    expect(result, isNotNull);
-    expect(result!.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(2, 11), CharacterLocation(6, 15)]),
-    ]);
+    var result = await _rename(testCode, 'y');
+    _assertTestChangeResult('''
+class A{
+  int get y => 5;
+}
+
+void foo() {
+  var m = A().y;
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_field_static_private() async {
-    var result = await _rename(r'''
+    var testCode = '''
 class A{
   static const ^_val = 1234;
 }
@@ -295,17 +595,22 @@
 void foo() {
   print(A._val);
 }
-''', '_newVal');
+''';
 
-    expect(result, isNotNull);
-    expect(result!.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(2, 16), CharacterLocation(6, 11)]),
-    ]);
+    var result = await _rename(testCode, '_newVal');
+    _assertTestChangeResult('''
+class A{
+  static const _newVal = 1234;
+}
+
+void foo() {
+  print(A._newVal);
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_function() async {
-    var result = await _rename(r'''
+    var testCode = '''
 test() {}
 ^foo() {}
 void f() {
@@ -313,15 +618,18 @@
   print(test());
   foo();
 }
-''', 'bar');
+''';
 
-    expect(result!.matches.length, 1);
-    expect(result.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
-        CharacterLocation(2, 1),
-        CharacterLocation(6, 3),
-      ])
-    ]);
+    var result = await _rename(testCode, 'bar');
+    _assertTestChangeResult('''
+test() {}
+bar() {}
+void f() {
+  print(test);
+  print(test());
+  bar();
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_function_imported() async {
@@ -335,28 +643,27 @@
   ^foo();
 }
 ''', 'bar');
-    expect(result!.matches.length, 2);
-    expect(result.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/a.dart'), [
-        CharacterLocation(1, 1),
-      ]),
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(3, 3)])
-    ]);
+
+    expect(result!.replaceMatches.length, 2);
+    expect(result.replaceMatches.first.matches,
+        [ReplaceInfo('bar', CharacterLocation(3, 3), 3)]);
+    expect(result.replaceMatches[1].matches,
+        [ReplaceInfo('bar', CharacterLocation(1, 1), 3)]);
   }
 
   void test_rename_local() async {
-    var result = await _rename(r'''
+    var testCode = '''
 void foo() {
   var ^a = 0; var b = a + 1;
 }
-''', 'bar');
+''';
 
-    expect(result!.matches.length, 1);
-    expect(
-        result.matches[0],
-        CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-            [CharacterLocation(2, 7), CharacterLocation(2, 22)]));
+    var result = await _rename(testCode, 'bar');
+    _assertTestChangeResult('''
+void foo() {
+  var bar = 0; var b = bar + 1;
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_method_imported() async {
@@ -372,56 +679,76 @@
   var a = A().^foo();
 }
 ''', 'bar');
-    expect(result!.matches.length, 2);
-    expect(result.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/a.dart'), [
-        CharacterLocation(2, 3),
-      ]),
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(3, 15)])
-    ]);
+    expect(result!.replaceMatches.length, 2);
+    expect(result.replaceMatches.first.matches,
+        [ReplaceInfo('bar', CharacterLocation(3, 15), 3)]);
+    expect(result.replaceMatches[1].matches,
+        [ReplaceInfo('bar', CharacterLocation(2, 3), 3)]);
   }
 
   void test_rename_parameter() async {
-    var result = await _rename(r'''
+    var testCode = '''
 void foo(String ^a) {
   var b = a + 1;
 }
-''', 'bar');
-    expect(result!.matches.length, 1);
-    expect(result.checkName.oldName, 'a');
+''';
+    var result = await _rename(testCode, 'bar');
+    _assertTestChangeResult('''
+void foo(String bar) {
+  var b = bar + 1;
+}
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_propertyAccessor() async {
-    var result = await _rename(r'''
+    var testCode = '''
 get foo {}
 set foo(x) {}
 void f() {
   print(foo);
   ^foo = 1;
   foo += 2;
-''', 'bar');
-    expect(result!.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(1, 5), CharacterLocation(4, 9)]),
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
-        CharacterLocation(2, 5),
-        CharacterLocation(5, 3),
-        CharacterLocation(6, 3)
-      ])
-    ]);
+''';
+    var result = await _rename(testCode, 'bar');
+    _assertTestChangeResult('''
+get bar {}
+set bar(x) {}
+void f() {
+  print(bar);
+  bar = 1;
+  bar += 2;
+''', result!.replaceMatches.first.matches);
   }
 
   void test_rename_typeAlias_functionType() async {
-    var result = await _rename(r'''
+    var testCode = '''
 typedef ^F = void Function();
 void f(F a) {}
-''', 'bar');
+''';
 
-    expect(result!.matches, [
-      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
-          [CharacterLocation(1, 9), CharacterLocation(2, 8)])
-    ]);
+    var result = await _rename(testCode, 'bar');
+    _assertTestChangeResult('''
+typedef bar = void Function();
+void f(bar a) {}
+''', result!.replaceMatches.first.matches);
+  }
+
+  // Asserts that the results of the rename is the [expectedCode].
+  void _assertTestChangeResult(
+      String expectedCode, List<ReplaceInfo> changes) async {
+    var edits = <SourceEdit>[];
+    for (var change in changes) {
+      var offset =
+          _lineInfo!.getOffsetOfLine(change.startPosition.lineNumber - 1) +
+              change.startPosition.columnNumber -
+              1;
+      edits.add(SourceEdit(offset, change.length, change.replacementText));
+    }
+    edits.sort((a, b) => a.offset.compareTo(b.offset));
+    edits = edits.reversed.toList();
+    // validate resulting code
+    var actualCode = SourceEdit.applySequence(_testCode, edits);
+    expect(actualCode, expectedCode);
   }
 
   Future<CheckNameResponse?> _checkName(String content, String newName) async {
@@ -459,6 +786,7 @@
       _correctionContext.line,
       _correctionContext.character,
     );
+    _lineInfo = canRename?.lineInfo;
     return canRename?.checkNewName(newName)?.computeRenameRanges2();
   }
 
@@ -470,8 +798,8 @@
     var lineInfo = LineInfo.fromContent(content);
     var location = lineInfo.getLocation(offset);
 
-    content = content.substring(0, offset) + content.substring(offset + 1);
-    newFile(testPath, content);
+    _testCode = content.substring(0, offset) + content.substring(offset + 1);
+    newFile(testPath, _testCode);
 
     _correctionContext = _CorrectionContext(
       content,
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 989c73c..e333fc8 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -44,21 +44,42 @@
 const M = 1024 * 1024 /*1 MiB*/;
 const memoryCacheSize = 200 * M;
 
+class CiderSearchInfo {
+  final CharacterLocation startPosition;
+  final int length;
+  final MatchKind kind;
+
+  CiderSearchInfo(this.startPosition, this.length, this.kind);
+
+  @override
+  bool operator ==(Object other) =>
+      other is CiderSearchInfo &&
+      startPosition == other.startPosition &&
+      length == other.length &&
+      kind == other.kind;
+}
+
 class CiderSearchMatch {
   final String path;
+  @deprecated
   final List<CharacterLocation?> startPositions;
+  final List<CiderSearchInfo> references;
 
-  CiderSearchMatch(this.path, this.startPositions);
+  CiderSearchMatch(this.path, this.startPositions, this.references);
 
   @override
   bool operator ==(Object other) =>
       other is CiderSearchMatch &&
       path == other.path &&
       const ListEquality<CharacterLocation?>()
-          .equals(startPositions, other.startPositions);
+          // ignore: deprecated_member_use_from_same_package
+          .equals(startPositions, other.startPositions) &&
+      const ListEquality<CiderSearchInfo>()
+          .equals(references, other.references);
 
   @override
   String toString() {
+    // ignore: deprecated_member_use_from_same_package
     return '($path, $startPositions)';
   }
 }
@@ -191,13 +212,19 @@
           var resolved = await resolve2(path: path);
           var collector = ReferencesCollector(element);
           resolved.unit.accept(collector);
-          var offsets = collector.offsets;
-          if (offsets.isNotEmpty) {
+          var matches = collector.references;
+          if (matches.isNotEmpty) {
             var lineInfo = resolved.unit.lineInfo;
             references.add(CiderSearchMatch(
                 path,
-                offsets
-                    .map((offset) => lineInfo.getLocation(offset))
+                matches
+                    .map((match) => lineInfo.getLocation(match.offset))
+                    .toList(),
+                matches
+                    .map((match) => CiderSearchInfo(
+                        lineInfo.getLocation(match.offset),
+                        match.length,
+                        match.matchKind))
                     .toList()));
           }
         });
diff --git a/pkg/analyzer/lib/src/dart/micro/utils.dart b/pkg/analyzer/lib/src/dart/micro/utils.dart
index 9afec39b..6908497 100644
--- a/pkg/analyzer/lib/src/dart/micro/utils.dart
+++ b/pkg/analyzer/lib/src/dart/micro/utils.dart
@@ -6,6 +6,8 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:collection/src/iterable_extensions.dart';
 
 /// Return the [Element] of the given [node], or `null` if [node] is `null` or
 /// does not have an element.
@@ -34,6 +36,32 @@
   return element;
 }
 
+/// If the given [constructor] is a synthetic constructor created for a
+/// [ClassTypeAlias], return the actual constructor of a [ClassDeclaration]
+/// which is invoked.  Return `null` if a redirection cycle is detected.
+ConstructorElement? _getActualConstructorElement(
+    ConstructorElement? constructor) {
+  var seenConstructors = <ConstructorElement?>{};
+  while (constructor is ConstructorElementImpl && constructor.isSynthetic) {
+    var enclosing = constructor.enclosingElement;
+    if (enclosing.isMixinApplication) {
+      var superInvocation = constructor.constantInitializers
+          .whereType<SuperConstructorInvocation>()
+          .singleOrNull;
+      if (superInvocation != null) {
+        constructor = superInvocation.staticElement;
+      }
+    } else {
+      break;
+    }
+    // fail if a cycle is detected
+    if (!seenConstructors.add(constructor)) {
+      return null;
+    }
+  }
+  return constructor;
+}
+
 /// Return the [ImportElement] that declared [prefix] and imports [element].
 ///
 /// [libraryElement] - the [LibraryElement] where reference is.
@@ -132,9 +160,55 @@
       libraryElement, prefix, usedElement, importElementsMap);
 }
 
+class MatchInfo {
+  final int offset;
+  final int length;
+  final MatchKind matchKind;
+
+  MatchInfo(this.offset, this.length, this.matchKind);
+}
+
+/// Instances of the enum [MatchKind] represent the kind of reference that was
+/// found when a match represents a reference to an element.
+class MatchKind {
+  /// A declaration of an element.
+  static const MatchKind DECLARATION = MatchKind('DECLARATION');
+
+  /// A reference to an element in which it is being read.
+  static const MatchKind READ = MatchKind('READ');
+
+  /// A reference to an element in which it is being both read and written.
+  static const MatchKind READ_WRITE = MatchKind('READ_WRITE');
+
+  /// A reference to an element in which it is being written.
+  static const MatchKind WRITE = MatchKind('WRITE');
+
+  /// A reference to an element in which it is being invoked.
+  static const MatchKind INVOCATION = MatchKind('INVOCATION');
+
+  /// An invocation of an enum constructor from an enum constant without
+  /// arguments.
+  static const MatchKind INVOCATION_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS =
+      MatchKind('INVOCATION_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS');
+
+  /// A reference to an element in which it is referenced.
+  static const MatchKind REFERENCE = MatchKind('REFERENCE');
+
+  /// A tear-off reference to a constructor.
+  static const MatchKind REFERENCE_BY_CONSTRUCTOR_TEAR_OFF =
+      MatchKind('REFERENCE_BY_CONSTRUCTOR_TEAR_OFF');
+
+  final String name;
+
+  const MatchKind(this.name);
+
+  @override
+  String toString() => name;
+}
+
 class ReferencesCollector extends GeneralizingAstVisitor<void> {
   final Element element;
-  final List<int> offsets = [];
+  final List<MatchInfo> references = [];
 
   ReferencesCollector(this.element);
 
@@ -142,16 +216,20 @@
   void visitAssignmentExpression(AssignmentExpression node) {
     if (node.writeElement != null &&
         node.writeElement is PropertyAccessorElement) {
+      var kind = MatchKind.WRITE;
       var property = node.writeElement as PropertyAccessorElement;
       if (property.variable == element || property == element) {
         if (node.leftHandSide is SimpleIdentifier) {
-          offsets.add(node.leftHandSide.offset);
+          references.add(MatchInfo(
+              node.leftHandSide.offset, node.leftHandSide.length, kind));
         } else if (node.leftHandSide is PrefixedIdentifier) {
           var prefixIdentifier = node.leftHandSide as PrefixedIdentifier;
-          offsets.add(prefixIdentifier.identifier.offset);
+          references.add(MatchInfo(prefixIdentifier.identifier.offset,
+              prefixIdentifier.identifier.length, kind));
         } else if (node.leftHandSide is PropertyAccess) {
           var accessor = node.leftHandSide as PropertyAccess;
-          offsets.add(accessor.propertyName.offset);
+          references.add(
+              MatchInfo(accessor.propertyName.offset, accessor.length, kind));
         }
       }
     }
@@ -159,18 +237,157 @@
         node.readElement is PropertyAccessorElement) {
       var property = node.readElement as PropertyAccessorElement;
       if (property.variable == element) {
-        offsets.add(node.rightHandSide.offset);
+        references.add(MatchInfo(node.rightHandSide.offset,
+            node.rightHandSide.length, MatchKind.READ));
+      }
+    }
+  }
+
+  @override
+  visitCommentReference(CommentReference node) {
+    var expression = node.expression;
+    if (expression is Identifier) {
+      var element = expression.staticElement;
+      if (element is ConstructorElement) {
+        if (expression is PrefixedIdentifier) {
+          var offset = expression.prefix.end;
+          var length = expression.end - offset;
+          references.add(MatchInfo(offset, length, MatchKind.REFERENCE));
+          return;
+        } else {
+          var offset = expression.end;
+          references.add(MatchInfo(offset, 0, MatchKind.REFERENCE));
+          return;
+        }
+      }
+    } else if (expression is PropertyAccess) {
+      // Nothing to do?
+    } else {
+      throw UnimplementedError('Unhandled CommentReference expression type: '
+          '${expression.runtimeType}');
+    }
+  }
+
+  @override
+  visitConstructorDeclaration(ConstructorDeclaration node) {
+    var e = node.declaredElement;
+    if (e == element) {
+      if (e!.name.isEmpty) {
+        references.add(
+            MatchInfo(e.nameOffset + e.nameLength, 0, MatchKind.DECLARATION));
+      } else {
+        var offset = node.period!.offset;
+        var length = node.name!.end - offset;
+        references.add(MatchInfo(offset, length, MatchKind.DECLARATION));
+      }
+    }
+    super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  void visitConstructorName(ConstructorName node) {
+    var e = node.staticElement?.declaration;
+    e = _getActualConstructorElement(e);
+    MatchKind kind;
+    int offset;
+    int length;
+    if (e == element) {
+      if (node.parent is ConstructorReference) {
+        kind = MatchKind.REFERENCE_BY_CONSTRUCTOR_TEAR_OFF;
+      } else if (node.parent is InstanceCreationExpression) {
+        kind = MatchKind.INVOCATION;
+      } else {
+        kind = MatchKind.REFERENCE;
+      }
+      if (node.name != null) {
+        offset = node.period!.offset;
+        length = node.name!.end - offset;
+      } else {
+        offset = node.type.end;
+        length = 0;
+      }
+      references.add(MatchInfo(offset, length, kind));
+    }
+    if (e!.enclosingElement == element) {
+      kind = MatchKind.REFERENCE;
+      offset = node.offset;
+      length = element.nameLength;
+      references.add(MatchInfo(offset, length, kind));
+    }
+  }
+
+  @override
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    var constructorElement = node.constructorElement;
+    if (constructorElement != null && constructorElement == element) {
+      int offset;
+      int length;
+      var constructorSelector = node.arguments?.constructorSelector;
+      if (constructorSelector != null) {
+        offset = constructorSelector.period.offset;
+        length = constructorSelector.name.end - offset;
+      } else {
+        offset = node.name.end;
+        length = 0;
+      }
+      var kind = node.arguments == null
+          ? MatchKind.INVOCATION_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS
+          : MatchKind.INVOCATION;
+      references.add(MatchInfo(offset, length, kind));
+    }
+  }
+
+  @override
+  void visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    var e = node.staticElement;
+    if (e == element) {
+      if (node.constructorName != null) {
+        int offset = node.period!.offset;
+        int length = node.constructorName!.end - offset;
+        references.add(MatchInfo(offset, length, MatchKind.INVOCATION));
+      } else {
+        int offset = node.thisKeyword.end;
+        references.add(MatchInfo(offset, 0, MatchKind.INVOCATION));
       }
     }
   }
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return;
+    }
     var e = node.staticElement;
     if (e == element) {
-      offsets.add(node.offset);
+      references.add(MatchInfo(node.offset, node.length, MatchKind.REFERENCE));
     } else if (e is PropertyAccessorElement && e.variable == element) {
-      offsets.add(node.offset);
+      bool inGetterContext = node.inGetterContext();
+      bool inSetterContext = node.inSetterContext();
+      MatchKind kind;
+      if (inGetterContext && inSetterContext) {
+        kind = MatchKind.READ_WRITE;
+      } else if (inGetterContext) {
+        kind = MatchKind.READ;
+      } else {
+        kind = MatchKind.WRITE;
+      }
+      references.add(MatchInfo(node.offset, node.length, kind));
+    }
+  }
+
+  @override
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    var e = node.staticElement;
+    if (e == element) {
+      if (node.constructorName != null) {
+        int offset = node.period!.offset;
+        int length = node.constructorName!.end - offset;
+        references.add(MatchInfo(offset, length, MatchKind.INVOCATION));
+      } else {
+        int offset = node.superKeyword.end;
+        references.add(MatchInfo(offset, 0, MatchKind.INVOCATION));
+      }
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/macro_application.dart b/pkg/analyzer/lib/src/summary2/macro_application.dart
index d18910f..a65e183 100644
--- a/pkg/analyzer/lib/src/summary2/macro_application.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_application.dart
@@ -12,6 +12,7 @@
     as macro;
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
@@ -22,7 +23,7 @@
   final MultiMacroExecutor macroExecutor;
   final LibraryBuilder libraryBuilder;
 
-  final Map<MacroTargetElement, List<MacroApplication>> _applications =
+  final Map<MacroTargetElement, List<_MacroApplication>> _applications =
       Map.identity();
 
   final Map<ClassDeclaration, macro.ClassDeclaration> _classDeclarations = {};
@@ -147,36 +148,31 @@
     List<Annotation> annotations,
     macro.Declaration Function() getDeclaration,
   ) async {
-    final applications = <MacroApplication>[];
+    final applications = <_MacroApplication>[];
+
     for (var i = 0; i < annotations.length; i++) {
-      final annotation = annotations[i];
-      final macroElement = _importedMacroElement(annotation.name);
-      final argumentsNode = annotation.arguments;
-      if (macroElement is ClassElementImpl && argumentsNode != null) {
-        final importedLibrary = macroElement.library;
+      Future<MacroClassInstance?> instantiateSingle({
+        required ClassElementImpl macroClass,
+        required String constructorName,
+        required ArgumentList argumentsNode,
+      }) async {
+        final importedLibrary = macroClass.library;
         final macroExecutor = importedLibrary.bundleMacroExecutor;
         if (macroExecutor != null) {
-          await _runWithCatchingExceptions(
+          return await _runWithCatchingExceptions(
             () async {
               final arguments = _buildArguments(
                 annotationIndex: i,
                 node: argumentsNode,
               );
-              final declaration = getDeclaration();
-              final macroInstance = await macroExecutor.instantiate(
-                libraryUri: macroElement.librarySource.uri,
-                className: macroElement.name,
-                constructorName: '', // TODO
+              return await macroExecutor.instantiate(
+                libraryUri: macroClass.librarySource.uri,
+                className: macroClass.name,
+                constructorName: constructorName,
                 arguments: arguments,
                 identifierResolver: _IdentifierResolver(),
                 declarationKind: macro.DeclarationKind.clazz,
-                declaration: declaration,
-              );
-              applications.add(
-                MacroApplication(
-                  annotationIndex: i,
-                  instance: macroInstance,
-                ),
+                declaration: getDeclaration(),
               );
             },
             annotationIndex: i,
@@ -185,6 +181,43 @@
             },
           );
         }
+        return null;
+      }
+
+      final annotation = annotations[i];
+      final macroInstance = await _importedMacroDeclaration(
+        annotation.name,
+        whenClass: ({
+          required macroClass,
+        }) async {
+          final argumentsNode = annotation.arguments;
+          if (argumentsNode != null) {
+            return await instantiateSingle(
+              macroClass: macroClass,
+              constructorName: '', // TODO(scheglov) implement
+              argumentsNode: argumentsNode,
+            );
+          }
+        },
+        whenGetter: ({
+          required macroClass,
+          required instanceCreation,
+        }) async {
+          return await instantiateSingle(
+            macroClass: macroClass,
+            constructorName: '', // TODO(scheglov) implement
+            argumentsNode: instanceCreation.argumentList,
+          );
+        },
+      );
+
+      if (macroInstance != null) {
+        applications.add(
+          _MacroApplication(
+            annotationIndex: i,
+            instance: macroInstance,
+          ),
+        );
       }
     }
     if (applications.isNotEmpty) {
@@ -192,8 +225,19 @@
     }
   }
 
-  /// Return the macro element referenced by the [node].
-  ElementImpl? _importedMacroElement(Identifier node) {
+  /// If [node] references a macro, invokes the right callback.
+  Future<R?> _importedMacroDeclaration<R>(
+    Identifier node, {
+    required Future<R?> Function({
+      required ClassElementImpl macroClass,
+    })
+        whenClass,
+    required Future<R?> Function({
+      required ClassElementImpl macroClass,
+      required InstanceCreationExpression instanceCreation,
+    })
+        whenGetter,
+  }) async {
     final String? prefix;
     final String name;
     if (node is PrefixedIdentifier) {
@@ -224,8 +268,28 @@
 
       final lookupResult = importedLibrary.scope.lookup(name);
       final element = lookupResult.getter;
-      if (element is ClassElementImpl && element.isMacro) {
-        return element;
+      if (element is ClassElementImpl) {
+        if (element.isMacro) {
+          return await whenClass(macroClass: element);
+        }
+      } else if (element is PropertyAccessorElementImpl &&
+          element.isGetter &&
+          element.isSynthetic) {
+        final variable = element.variable;
+        final variableType = variable.type;
+        if (variable is ConstTopLevelVariableElementImpl &&
+            variableType is InterfaceType) {
+          final macroClass = variableType.element;
+          final initializer = variable.constantInitializer;
+          if (macroClass is ClassElementImpl &&
+              macroClass.isMacro &&
+              initializer is InstanceCreationExpression) {
+            return await whenGetter(
+              macroClass: macroClass,
+              instanceCreation: initializer,
+            );
+          }
+        }
       }
     }
     return null;
@@ -380,13 +444,13 @@
   }
 
   /// Run the [body], report exceptions as [MacroApplicationError]s to [onError].
-  static Future<void> _runWithCatchingExceptions<T>(
+  static Future<T?> _runWithCatchingExceptions<T>(
     Future<T> Function() body, {
     required int annotationIndex,
     required void Function(MacroApplicationError) onError,
   }) async {
     try {
-      await body();
+      return await body();
     } on MacroApplicationError catch (e) {
       onError(e);
     } on macro.RemoteException catch (e) {
@@ -406,21 +470,10 @@
         ),
       );
     }
+    return null;
   }
 }
 
-class MacroApplication {
-  final int annotationIndex;
-  final MacroClassInstance instance;
-
-  MacroApplication({
-    required this.annotationIndex,
-    required this.instance,
-  });
-
-  bool shouldExecute(macro.Phase phase) => instance.shouldExecute(phase);
-}
-
 /// Helper class for evaluating arguments for a single constructor based
 /// macro application.
 class _ArgumentEvaluation {
@@ -551,6 +604,18 @@
   }
 }
 
+class _MacroApplication {
+  final int annotationIndex;
+  final MacroClassInstance instance;
+
+  _MacroApplication({
+    required this.annotationIndex,
+    required this.instance,
+  });
+
+  bool shouldExecute(macro.Phase phase) => instance.shouldExecute(phase);
+}
+
 class _TypeResolver implements macro.TypeResolver {
   @override
   Future<macro.StaticType> resolve(macro.TypeAnnotationCode type) {
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index f0b0c235..934b7bd 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -396,8 +396,8 @@
     var element = await _findElement(6, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(4, 11)]),
-      CiderSearchMatch(aPath, [CharacterLocation(1, 7)])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 11)],
+          [CiderSearchInfo(CharacterLocation(4, 11), 1, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -418,10 +418,10 @@
     var element = await _findElement(16, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(
-          aPath, [CharacterLocation(2, 7), CharacterLocation(5, 5)])
+      CiderSearchMatch(aPath, [CharacterLocation(5, 5)],
+          [CiderSearchInfo(CharacterLocation(5, 5), 3, MatchKind.WRITE)])
     ];
-    expect(result, unorderedEquals(expected));
+    expect(result, expected);
   }
 
   test_findReferences_function() async {
@@ -438,8 +438,8 @@
     var element = await _findElement(11, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(
-          aPath, [CharacterLocation(2, 3), CharacterLocation(5, 1)])
+      CiderSearchMatch(aPath, [CharacterLocation(2, 3)],
+          [CiderSearchInfo(CharacterLocation(2, 3), 3, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -465,8 +465,8 @@
     var element = await _findElement(20, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(5, 15)]),
-      CiderSearchMatch(aPath, [CharacterLocation(2, 11)])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 15)],
+          [CiderSearchInfo(CharacterLocation(5, 15), 3, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -485,8 +485,8 @@
     var element = await _findElement(39, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(
-          aPath, [CharacterLocation(3, 9), CharacterLocation(4, 11)])
+      CiderSearchMatch(aPath, [CharacterLocation(4, 11)],
+          [CiderSearchInfo(CharacterLocation(4, 11), 3, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -519,9 +519,10 @@
     var element = await _findElement(17, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
-      CiderSearchMatch(
-          aPath, [CharacterLocation(2, 8), CharacterLocation(7, 4)])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)],
+          [CiderSearchInfo(CharacterLocation(5, 5), 4, MatchKind.REFERENCE)]),
+      CiderSearchMatch(aPath, [CharacterLocation(7, 4)],
+          [CiderSearchInfo(CharacterLocation(7, 4), 4, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -547,8 +548,8 @@
     var element = await _findElement(21, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
-      CiderSearchMatch(aPath, [CharacterLocation(2, 12)])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)],
+          [CiderSearchInfo(CharacterLocation(5, 5), 5, MatchKind.WRITE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -575,8 +576,8 @@
     var element = await _findElement(19, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(4, 13)]),
-      CiderSearchMatch(aPath, [CharacterLocation(3, 9)])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 13)],
+          [CiderSearchInfo(CharacterLocation(4, 13), 3, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -603,8 +604,8 @@
     var element = await _findElement(20, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(4, 3)]),
-      CiderSearchMatch(aPath, [CharacterLocation(3, 10)])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 3)],
+          [CiderSearchInfo(CharacterLocation(4, 3), 3, MatchKind.WRITE)]),
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -624,8 +625,8 @@
     var element = await _findElement(10, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(
-          aPath, [CharacterLocation(1, 11), CharacterLocation(4, 11)])
+      CiderSearchMatch(aPath, [CharacterLocation(4, 11)],
+          [CiderSearchInfo(CharacterLocation(4, 11), 1, MatchKind.READ)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -644,14 +645,20 @@
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
       CiderSearchMatch(aPath, [
-        CharacterLocation(1, 11),
         CharacterLocation(2, 8),
         CharacterLocation(4, 12)
+      ], [
+        CiderSearchInfo(CharacterLocation(2, 8), 5, MatchKind.WRITE),
+        CiderSearchInfo(CharacterLocation(4, 12), 5, MatchKind.WRITE)
       ])
     ];
     expect(result.map((e) => e.path),
         unorderedEquals(expected.map((e) => e.path)));
-    expect(result.map((e) => e.startPositions),
+    // ignore: deprecated_member_use_from_same_package
+    expect(
+        // ignore: deprecated_member_use_from_same_package
+        result.map((e) => e.startPositions),
+        // ignore: deprecated_member_use_from_same_package
         unorderedEquals(expected.map((e) => e.startPositions)));
   }
 
@@ -672,8 +679,8 @@
     var element = await _findElement(8, aPath);
     var result = await fileResolver.findReferences2(element);
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(bPath, [CharacterLocation(3, 8)]),
-      CiderSearchMatch(aPath, [CharacterLocation(1, 9)])
+      CiderSearchMatch(bPath, [CharacterLocation(3, 8)],
+          [CiderSearchInfo(CharacterLocation(3, 8), 4, MatchKind.REFERENCE)])
     ];
     expect(result, unorderedEquals(expected));
   }
diff --git a/pkg/analyzer/test/src/summary/macro_test.dart b/pkg/analyzer/test/src/summary/macro_test.dart
index 1fdc7e6..6f9fc4e 100644
--- a/pkg/analyzer/test/src/summary/macro_test.dart
+++ b/pkg/analyzer/test/src/summary/macro_test.dart
@@ -63,6 +63,130 @@
     );
   }
 
+  test_application_getter_withoutPrefix_withoutArguments() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import 'dart:async';
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+macro class MyMacro implements ClassTypesMacro {
+  FutureOr<void> buildTypesForClass(clazz, builder) {
+    builder.declareType(
+      'MyClass',
+      DeclarationCode.fromString('class MyClass {}'),
+    );
+  }
+}
+
+const myMacro = MyMacro();
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+
+@myMacro
+class A {}
+''', preBuildSequence: [
+      {'package:test/a.dart'}
+    ]);
+
+    checkElementText(
+        library,
+        r'''
+library
+  imports
+    package:test/a.dart
+  definingUnit
+    classes
+      class A @33
+        metadata
+          Annotation
+            atSign: @ @18
+            name: SimpleIdentifier
+              token: myMacro @19
+              staticElement: package:test/a.dart::@getter::myMacro
+              staticType: null
+            element: package:test/a.dart::@getter::myMacro
+        constructors
+          synthetic @-1
+  parts
+    package:test/_macro_types.dart
+      classes
+        class MyClass @6
+          constructors
+            synthetic @-1
+  exportScope
+    A: package:test/test.dart;A
+    MyClass: package:test/test.dart;package:test/_macro_types.dart;MyClass
+''',
+        withExportScope: true);
+  }
+
+  test_application_getter_withPrefix_withoutArguments() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import 'dart:async';
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+macro class MyMacro implements ClassTypesMacro {
+  FutureOr<void> buildTypesForClass(clazz, builder) {
+    builder.declareType(
+      'MyClass',
+      DeclarationCode.fromString('class MyClass {}'),
+    );
+  }
+}
+
+const myMacro = MyMacro();
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart' as prefix;
+
+@prefix.myMacro
+class A {}
+''', preBuildSequence: [
+      {'package:test/a.dart'}
+    ]);
+
+    checkElementText(
+        library,
+        r'''
+library
+  imports
+    package:test/a.dart as prefix @19
+  definingUnit
+    classes
+      class A @50
+        metadata
+          Annotation
+            atSign: @ @28
+            name: PrefixedIdentifier
+              prefix: SimpleIdentifier
+                token: prefix @29
+                staticElement: self::@prefix::prefix
+                staticType: null
+              period: . @35
+              identifier: SimpleIdentifier
+                token: myMacro @36
+                staticElement: package:test/a.dart::@getter::myMacro
+                staticType: null
+              staticElement: package:test/a.dart::@getter::myMacro
+              staticType: null
+            element: package:test/a.dart::@getter::myMacro
+        constructors
+          synthetic @-1
+  parts
+    package:test/_macro_types.dart
+      classes
+        class MyClass @6
+          constructors
+            synthetic @-1
+  exportScope
+    A: package:test/test.dart;A
+    MyClass: package:test/test.dart;package:test/_macro_types.dart;MyClass
+''',
+        withExportScope: true);
+  }
+
   test_application_newInstance_withoutPrefix() async {
     newFile('$testPackageLibPath/a.dart', r'''
 import 'dart:async';
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 6da4ba4..7ded407 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -11,7 +11,7 @@
 import '../common.dart';
 import '../common/elements.dart';
 import '../constants/values.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show OutputUnit;
 import '../elements/entities.dart';
 import '../elements/types.dart' show DartType, InterfaceType;
 import '../inferrer/abstract_value_domain.dart';
@@ -110,42 +110,39 @@
     source.begin(tag);
     MemberEntity member = source.readMember();
     Set<DynamicUse> dynamicUses = source
-        .readList(() => DynamicUse.readFromDataSource(source),
-            emptyAsNull: true)
+        .readListOrNull(() => DynamicUse.readFromDataSource(source))
         ?.toSet();
     Set<StaticUse> staticUses = source
-        .readList(() => StaticUse.readFromDataSource(source), emptyAsNull: true)
+        .readListOrNull(() => StaticUse.readFromDataSource(source))
         ?.toSet();
     Set<TypeUse> typeUses = source
-        .readList(() => TypeUse.readFromDataSource(source), emptyAsNull: true)
+        .readListOrNull(() => TypeUse.readFromDataSource(source))
         ?.toSet();
     Set<ConstantUse> constantUses = source
-        .readList(() => ConstantUse.readFromDataSource(source),
-            emptyAsNull: true)
+        .readListOrNull(() => ConstantUse.readFromDataSource(source))
         ?.toSet();
     Set<Pair<DartType, DartType>> typeVariableBoundsSubtypeChecks =
-        source.readList(() {
+        source.readListOrNull(() {
       return Pair(source.readDartType(), source.readDartType());
-    }, emptyAsNull: true)?.toSet();
+    })?.toSet();
     Set<String> constSymbols = source.readStrings(emptyAsNull: true)?.toSet();
-    List<Set<ClassEntity>> specializedGetInterceptors = source.readList(() {
+    List<Set<ClassEntity>> specializedGetInterceptors =
+        source.readListOrNull(() {
       return source.readClasses().toSet();
-    }, emptyAsNull: true);
+    });
     bool usesInterceptor = source.readBool();
     int asyncMarkersValue = source.readIntOrNull();
     EnumSet<AsyncMarker> asyncMarkers =
         asyncMarkersValue != null ? EnumSet.fromValue(asyncMarkersValue) : null;
     Set<GenericInstantiation> genericInstantiations = source
-        .readList(() => GenericInstantiation.readFromDataSource(source),
-            emptyAsNull: true)
+        .readListOrNull(() => GenericInstantiation.readFromDataSource(source))
         ?.toSet();
-    List<NativeBehavior> nativeBehaviors = source.readList(
-        () => NativeBehavior.readFromDataSource(source),
-        emptyAsNull: true);
+    List<NativeBehavior> nativeBehaviors =
+        source.readListOrNull(() => NativeBehavior.readFromDataSource(source));
     Set<FunctionEntity> nativeMethods =
         source.readMembersOrNull<FunctionEntity>()?.toSet();
     Set<Selector> oneShotInterceptors = source
-        .readList(() => Selector.readFromDataSource(source), emptyAsNull: true)
+        .readListOrNull(() => Selector.readFromDataSource(source))
         ?.toSet();
     source.end(tag);
     return _CodegenImpact.internal(
@@ -2208,7 +2205,8 @@
   }
 
   List<T> readList<T extends js.Node>({bool emptyAsNull = false}) {
-    return source.readList(read, emptyAsNull: emptyAsNull);
+    // TODO(48820): Is [emptyAsNull] unused?
+    return emptyAsNull ? source.readListOrNull(read) : source.readList(read);
   }
 }
 
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index c482566..acbb3fc 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -55,7 +55,7 @@
 import 'phase/modular_analysis.dart' as modular_analysis;
 import 'resolution/enqueuer.dart';
 import 'serialization/task.dart';
-import 'serialization/serialization.dart';
+import 'serialization/serialization.dart' show DataSourceIndices;
 import 'serialization/strategies.dart';
 import 'universe/selector.dart' show Selector;
 import 'universe/codegen_world_builder.dart';
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/builder.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/builder.dart
index 275d178..0ecaced 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/builder.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/builder.dart
@@ -2,8 +2,6 @@
 // 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.10
-
 import 'dart:collection';
 
 import 'nodes.dart';
@@ -19,7 +17,7 @@
 
   /// The [CombinerType] which should be used to combine [imports]. Either
   /// [imports] will be a singleton, or [combinerType] will be non-null.
-  final CombinerType combinerType;
+  final CombinerType? combinerType;
 
   /// The [ImportEntity]s underlying this [Constraint].
   final Set<ImportEntity> imports;
@@ -81,8 +79,9 @@
     for (var import in imports) {
       var libraryUri = import.enclosingLibraryUri;
       var prefix = import.name;
-      var uriNodes = importsByUriAndPrefix[libraryUri] ??= {};
-      uriNodes[prefix] = import;
+      Map<String, ImportEntity> uriNodes =
+          importsByUriAndPrefix[libraryUri] ??= {};
+      uriNodes[prefix!] = import;
     }
 
     // A helper function for looking up an [ImportEntity] from a
@@ -93,17 +92,17 @@
         throw 'Uri for constraint not found $uri';
       }
       var prefix = node.prefix;
-      if (!importsByUriAndPrefix[uri].containsKey(prefix)) {
+      if (!importsByUriAndPrefix[uri]!.containsKey(prefix)) {
         throw 'Prefix: $prefix not found for uri: $uri';
       }
-      return importsByUriAndPrefix[uri][prefix];
+      return importsByUriAndPrefix[uri]![prefix]!;
     }
 
     // 2) Create a [Constraint] for each [NamedNode]. Also,
     // index each [Constraint] by [NamedNode].
     Map<NamedNode, Constraint> nodeToConstraintMap = {};
     for (var constraint in nodes.named) {
-      CombinerType combinerType = null;
+      CombinerType? combinerType = null;
       Set<ImportEntity> imports = {};
       if (constraint is ReferenceNode) {
         imports.add(_lookupReference(constraint));
@@ -123,8 +122,8 @@
     // 3) Build a graph of [Constraint]s by processing user constraints and
     // intializing each [Constraint]'s predecessor / successor members.
     void createEdge(NamedNode successorNode, NamedNode predecessorNode) {
-      var successor = nodeToConstraintMap[successorNode];
-      var predecessor = nodeToConstraintMap[predecessorNode];
+      var successor = nodeToConstraintMap[successorNode]!;
+      var predecessor = nodeToConstraintMap[predecessorNode]!;
       successor.predecessors.add(predecessor);
       predecessor.successors.add(successor);
     }
@@ -189,7 +188,8 @@
         // reprocessing constraints when we need to consider new transitive
         // children.
         if (processed.containsKey(predecessor) &&
-            processed[predecessor].containsAll(predecessorTransitiveChildren)) {
+            processed[predecessor]!
+                .containsAll(predecessorTransitiveChildren)) {
           continue;
         }
         (processed[predecessor] ??= {}).addAll(predecessorTransitiveChildren);
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
index a32133a..50abe03 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
@@ -2,8 +2,6 @@
 // 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.10
-
 /// A [Node] is an abstract base class for all [Node]s parsed from json
 /// constraints.
 abstract class Node {
@@ -76,7 +74,7 @@
 enum CombinerType { and, or }
 
 CombinerType parseCombinerType(Map<String, dynamic> nodeJson) {
-  String type = nodeJson['type'];
+  String? type = nodeJson['type'];
   switch (type) {
     case 'and':
       return CombinerType.and;
@@ -94,7 +92,6 @@
     case CombinerType.or:
       return 'or';
   }
-  throw 'Unreachable';
 }
 
 T _jsonLookup<T>(Map<String, dynamic> nodeJson, String key) {
@@ -136,8 +133,8 @@
     String name = _jsonLookup(nodeJson, 'name');
     List<dynamic> referencesJson = _jsonLookup(nodeJson, 'nodes');
     Set<ReferenceNode> references = {};
-    for (String reference in referencesJson) {
-      references.add(nameMap[reference]);
+    for (final reference in referencesJson) {
+      references.add(nameMap[reference as String] as ReferenceNode);
     }
     return CombinerNode(name, parseCombinerType(nodeJson), references);
   }
@@ -159,10 +156,7 @@
   final NamedNode predecessor;
   final NamedNode successor;
 
-  RelativeOrderNode({this.predecessor, this.successor}) {
-    // TODO(joshualitt) make these both required parameters.
-    assert(this.predecessor != null && this.successor != null);
-  }
+  RelativeOrderNode({required this.predecessor, required this.successor});
 
   @override
   Map<String, dynamic> toJson() {
@@ -203,8 +197,8 @@
       Map<String, dynamic> nodeJson, Map<String, NamedNode> nameMap) {
     List<dynamic> referencesJson = _jsonLookup(nodeJson, 'nodes');
     Set<NamedNode> nodes = {};
-    for (String reference in referencesJson) {
-      nodes.add(nameMap[reference]);
+    for (final reference in referencesJson) {
+      nodes.add(nameMap[reference as String]!);
     }
     return FuseNode(nodes);
   }
@@ -221,7 +215,7 @@
 
 class ProgramSplitBuilder {
   final Map<String, NamedNode> namedNodes = {};
-  ReferenceNodeNamer _referenceNodeNamer;
+  ReferenceNodeNamer? _referenceNodeNamer;
 
   /// 'uri#prefix' will become a key to reference this node in other builder
   /// calls.
@@ -236,7 +230,7 @@
   ReferenceNodeNamer get referenceNodeNamer =>
       _referenceNodeNamer ?? _uriAndPrefixNamer;
 
-  NamedNode _addNamedNode(NamedNode node) {
+  T _addNamedNode<T extends NamedNode>(T node) {
     if (namedNodes.containsKey(node.name)) {
       throw 'Node with name ${node.name} already exists: '
           '${namedNodes[node.name]}';
@@ -249,7 +243,7 @@
     if (!namedNodes.containsKey(nodeName)) {
       throw 'Missing reference node for $nodeName';
     }
-    return namedNodes[nodeName];
+    return namedNodes[nodeName]!;
   }
 
   ReferenceNode _lookupReferenceNode(String nodeName) {
@@ -257,7 +251,7 @@
     if (node is! ReferenceNode) {
       throw 'node $nodeName is not a ReferenceNode.';
     }
-    return node as ReferenceNode;
+    return node;
   }
 
   /// Returns a [ReferenceNode] referencing [importUriAndPrefix].
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/parser.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/parser.dart
index b798f7b..0d2efa6 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/parser.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/parser.dart
@@ -2,8 +2,6 @@
 // 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.10
-
 import 'dart:convert';
 
 import 'nodes.dart';
@@ -35,12 +33,13 @@
   /// Reads a program split constraints json file string and returns a [Nodes]
   /// object reflecting the parsed constraints.
   ConstraintData read(String programSplitJson) {
-    List<dynamic> doc = json.decode(programSplitJson);
+    List<dynamic> allConstraints = json.decode(programSplitJson);
     List<Map<String, dynamic>> referenceConstraints = [];
     List<Map<String, dynamic>> combinerConstraints = [];
     List<Map<String, dynamic>> fuseConstraints = [];
     List<Map<String, dynamic>> relativeOrderConstraints = [];
-    for (Map<String, dynamic> constraint in doc) {
+    for (final c in allConstraints) {
+      final constraint = c as Map<String, dynamic>;
       switch (constraint['type']) {
         case 'reference':
           referenceConstraints.add(constraint);
diff --git a/pkg/compiler/lib/src/inferrer/trivial.dart b/pkg/compiler/lib/src/inferrer/trivial.dart
index e66532e..8745ab9 100644
--- a/pkg/compiler/lib/src/inferrer/trivial.dart
+++ b/pkg/compiler/lib/src/inferrer/trivial.dart
@@ -9,7 +9,7 @@
 import '../elements/names.dart';
 import '../elements/types.dart' show DartType;
 import '../ir/static_type.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../universe/use.dart';
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 58afd06..ee6cfd7 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -13,7 +13,7 @@
 import '../js/js.dart' as js;
 import '../js/js_debug.dart';
 import '../js/js_source_mapping.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/util.dart';
 import 'code_output.dart' show BufferedCodeOutput;
 import 'source_information.dart';
@@ -42,9 +42,8 @@
         () => SourceLocation.readFromDataSource(source));
     SourceLocation innerPosition = source.readCached<SourceLocation>(
         () => SourceLocation.readFromDataSource(source));
-    List<FrameContext> inliningContext = source.readList(
-        () => FrameContext.readFromDataSource(source),
-        emptyAsNull: true);
+    List<FrameContext> inliningContext =
+        source.readListOrNull(() => FrameContext.readFromDataSource(source));
     source.end(tag);
     return PositionSourceInformation(
         startPosition, innerPosition, inliningContext);
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 7c1d64e..0171346 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -10,7 +10,7 @@
 import '../common.dart';
 import '../elements/entities.dart';
 import '../js/js.dart' show JavaScriptNodeSourceInformation;
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../universe/call_structure.dart';
 import 'source_file.dart';
 import 'position_information.dart';
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 38886b0..d60cebe 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -1072,87 +1072,65 @@
 
   ImpactData.fromDataSource(DataSourceReader source) {
     source.begin(tag);
-    _superInitializers = source.readList(
-        () => _SuperInitializer.fromDataSource(source),
-        emptyAsNull: true);
-    _superSets =
-        source.readList(() => source.readMemberNode(), emptyAsNull: true);
-    _superGets =
-        source.readList(() => source.readMemberNode(), emptyAsNull: true);
-    _superInvocations = source.readList(
-        () => _SuperInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _instanceSets = source.readList(
-        () => _InstanceAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _dynamicSets = source.readList(() => _DynamicAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _instanceGets = source.readList(
-        () => _InstanceAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _dynamicGets = source.readList(() => _DynamicAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _functionInvocations = source.readList(
-        () => _FunctionInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _instanceInvocations = source.readList(
-        () => _InstanceInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _dynamicInvocations = source.readList(
-        () => _DynamicInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _localFunctionInvocations = source.readList(
-        () => _LocalFunctionInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _staticInvocations = source.readList(
-        () => _StaticInvocation.fromDataSource(source),
-        emptyAsNull: true);
-    _constructorInvocations = source.readList(
-        () => _ConstructorInvocation.fromDataSource(source),
-        emptyAsNull: true);
+    _superInitializers =
+        source.readListOrNull(() => _SuperInitializer.fromDataSource(source));
+    _superSets = source.readListOrNull(() => source.readMemberNode());
+    _superGets = source.readListOrNull(() => source.readMemberNode());
+    _superInvocations =
+        source.readListOrNull(() => _SuperInvocation.fromDataSource(source));
+    _instanceSets =
+        source.readListOrNull(() => _InstanceAccess.fromDataSource(source));
+    _dynamicSets =
+        source.readListOrNull(() => _DynamicAccess.fromDataSource(source));
+    _instanceGets =
+        source.readListOrNull(() => _InstanceAccess.fromDataSource(source));
+    _dynamicGets =
+        source.readListOrNull(() => _DynamicAccess.fromDataSource(source));
+    _functionInvocations =
+        source.readListOrNull(() => _FunctionInvocation.fromDataSource(source));
+    _instanceInvocations =
+        source.readListOrNull(() => _InstanceInvocation.fromDataSource(source));
+    _dynamicInvocations =
+        source.readListOrNull(() => _DynamicInvocation.fromDataSource(source));
+    _localFunctionInvocations = source
+        .readListOrNull(() => _LocalFunctionInvocation.fromDataSource(source));
+    _staticInvocations =
+        source.readListOrNull(() => _StaticInvocation.fromDataSource(source));
+    _constructorInvocations = source
+        .readListOrNull(() => _ConstructorInvocation.fromDataSource(source));
     _features = EnumSet<_Feature>.fromValue(source.readInt());
-    _typeUses = source.readList(() => _TypeUse.fromDataSource(source),
-        emptyAsNull: true);
-    _redirectingInitializers = source.readList(
-        () => _RedirectingInitializer.fromDataSource(source),
-        emptyAsNull: true);
+    _typeUses = source.readListOrNull(() => _TypeUse.fromDataSource(source));
+    _redirectingInitializers = source
+        .readListOrNull(() => _RedirectingInitializer.fromDataSource(source));
     _fieldInitializers = source.readMemberNodes<ir.Field>(emptyAsNull: true);
     _fieldConstantInitializers =
         source.readMemberNodeMap(source.readTreeNodes, emptyAsNull: true);
-    _typeLiterals = source.readList(() => _TypeLiteral.fromDataSource(source),
-        emptyAsNull: true);
+    _typeLiterals =
+        source.readListOrNull(() => _TypeLiteral.fromDataSource(source));
     _localFunctions = source.readTreeNodes(emptyAsNull: true);
-    _genericInstantiations = source.readList(
-        () => _GenericInstantiation.fromDataSource(source),
-        emptyAsNull: true);
-    _staticSets = source.readList(() => _StaticAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _staticGets = source.readList(() => _StaticAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _staticTearOffs = source.readList(
-        () => _StaticAccess.fromDataSource(source),
-        emptyAsNull: true);
-    _mapLiterals = source.readList(() => _MapLiteral.fromDataSource(source),
-        emptyAsNull: true);
-    _listLiterals = source.readList(
-        () => _ContainerLiteral.fromDataSource(source),
-        emptyAsNull: true);
-    _setLiterals = source.readList(
-        () => _ContainerLiteral.fromDataSource(source),
-        emptyAsNull: true);
+    _genericInstantiations = source
+        .readListOrNull(() => _GenericInstantiation.fromDataSource(source));
+    _staticSets =
+        source.readListOrNull(() => _StaticAccess.fromDataSource(source));
+    _staticGets =
+        source.readListOrNull(() => _StaticAccess.fromDataSource(source));
+    _staticTearOffs =
+        source.readListOrNull(() => _StaticAccess.fromDataSource(source));
+    _mapLiterals =
+        source.readListOrNull(() => _MapLiteral.fromDataSource(source));
+    _listLiterals =
+        source.readListOrNull(() => _ContainerLiteral.fromDataSource(source));
+    _setLiterals =
+        source.readListOrNull(() => _ContainerLiteral.fromDataSource(source));
     _symbolLiterals = source.readStrings(emptyAsNull: true)?.toSet();
     _stringLiterals = source.readStrings(emptyAsNull: true)?.toSet();
-    _boolLiterals =
-        source.readList(() => source.readBool(), emptyAsNull: true)?.toSet();
-    _doubleLiterals = source
-        .readList(() => source.readDoubleValue(), emptyAsNull: true)
-        ?.toSet();
-    _intLiterals = source
-        .readList(() => source.readIntegerValue(), emptyAsNull: true)
-        ?.toSet();
-    _runtimeTypeUses = source.readList(
-        () => _RuntimeTypeUse.fromDataSource(source),
-        emptyAsNull: true);
+    _boolLiterals = source.readListOrNull(() => source.readBool())?.toSet();
+    _doubleLiterals =
+        source.readListOrNull(() => source.readDoubleValue())?.toSet();
+    _intLiterals =
+        source.readListOrNull(() => source.readIntegerValue())?.toSet();
+    _runtimeTypeUses =
+        source.readListOrNull(() => _RuntimeTypeUse.fromDataSource(source));
 
     // TODO(johnniwinther): Remove these when CFE provides constants.
     _constructorNodes =
diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
index 78d1786..3c6558b 100644
--- a/pkg/compiler/lib/src/js_backend/specialized_checks.dart
+++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
@@ -5,7 +5,7 @@
 // @dart = 2.10
 
 import '../common/elements.dart' show ElementEnvironment, JCommonElements;
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show OutputUnitData;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js_backend/interceptor_data.dart' show InterceptorData;
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index e4ae932..55c36df 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -19,7 +19,7 @@
 import '../common/elements.dart';
 import '../common/names.dart';
 import '../constants/values.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show LateOutputUnitDataBuilder;
 import '../elements/entities.dart';
 import '../elements/entity_utils.dart' as utils;
 import '../elements/indexed.dart';
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 95fb87e..effb47c 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -14,7 +14,8 @@
 import '../common/tasks.dart';
 import '../common/work.dart';
 import '../compiler.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart'
+    show LateOutputUnitDataBuilder, OutputUnitData;
 import '../dump_info.dart';
 import '../elements/entities.dart';
 import '../enqueue.dart';
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index a90587d..9c1f429 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -11,7 +11,8 @@
 import '../common.dart';
 import '../common/elements.dart' show JCommonElements, JElementEnvironment;
 import '../common/names.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart'
+    show LateOutputUnitDataBuilder, OutputUnitData;
 import '../elements/entities.dart';
 import '../elements/entity_utils.dart' as utils;
 import '../elements/names.dart';
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
index 3449c01..72efd4f 100644
--- a/pkg/compiler/lib/src/js_model/js_world_builder.dart
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -11,7 +11,7 @@
 import '../common/elements.dart';
 import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show OutputUnit, OutputUnitData;
 import '../elements/entities.dart';
 import '../elements/indexed.dart';
 import '../elements/names.dart';
diff --git a/pkg/compiler/lib/src/js_model/type_recipe.dart b/pkg/compiler/lib/src/js_model/type_recipe.dart
index 6b3025e..f503312 100644
--- a/pkg/compiler/lib/src/js_model/type_recipe.dart
+++ b/pkg/compiler/lib/src/js_model/type_recipe.dart
@@ -10,7 +10,7 @@
 import '../elements/types.dart';
 import '../diagnostics/invariant.dart';
 import '../diagnostics/spannable.dart' show CURRENT_ELEMENT_SPANNABLE;
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/util.dart' show Hashing;
 
 abstract class TypeRecipeDomain {
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index cde763a..7dd67d5 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -13,7 +13,7 @@
 import '../js_backend/native_data.dart' show NativeBasicData;
 import '../js_model/js_world_builder.dart' show JsToFrontendMap;
 import '../options.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../universe/side_effects.dart' show SideEffects;
 import 'js.dart';
 
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index 148fc9a..62b0eef 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -12,7 +12,7 @@
 import 'common.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
-import 'serialization/serialization.dart';
+import 'serialization/serialization_interfaces.dart';
 
 /// An ordered set of the supertypes of a class. The supertypes of a class are
 /// ordered by decreasing hierarchy depth and by the order they are extended,
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index af54708..a863d05 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -12,7 +12,7 @@
 import '../closure.dart';
 import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show OutputUnit;
 import '../diagnostics/source_span.dart';
 import '../elements/entities.dart';
 import '../elements/indexed.dart';
diff --git a/pkg/compiler/lib/src/serialization/serialization_interfaces.dart b/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
index 161aa37..a2ee9dd 100644
--- a/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
+++ b/pkg/compiler/lib/src/serialization/serialization_interfaces.dart
@@ -5,6 +5,7 @@
 import 'package:kernel/ast.dart' as ir show DartType, Member, TreeNode;
 
 import '../elements/entities.dart';
+import '../elements/types.dart' show DartType;
 
 export 'tags.dart';
 
@@ -62,9 +63,18 @@
   void writeDartTypeNode(ir.DartType value);
   void writeDartTypeNodeOrNull(ir.DartType? value);
 
+  void writeDartType(DartType value);
+  void writeDartTypeOrNull(DartType? value);
+  void writeDartTypesOrNull(Iterable<DartType>? values);
+  void writeDartTypes(Iterable<DartType> values);
+
   void inMemberContext(ir.Member context, void f());
   void writeTreeNodeMapInContext<V>(Map<ir.TreeNode, V>? map, void f(V value),
       {bool allowNull = false});
+
+  void writeCached<E extends Object>(E value, void f(E value));
+  void writeList<E extends Object>(Iterable<E> values, void f(E value),
+      {bool allowNull = false});
 }
 
 /// Migrated interface for methods of DataSourceReader.
@@ -92,7 +102,16 @@
   ir.DartType readDartTypeNode();
   ir.DartType? readDartTypeNodeOrNull();
 
+  DartType readDartType();
+  DartType? readDartTypeOrNull();
+  List<DartType> readDartTypes();
+  List<DartType>? readDartTypesOrNull();
+
   T inMemberContext<T>(ir.Member context, T f());
   Map<K, V> readTreeNodeMapInContext<K extends ir.TreeNode, V>(V f());
   Map<K, V>? readTreeNodeMapInContextOrNull<K extends ir.TreeNode, V>(V f());
+
+  E readCached<E extends Object>(E f());
+  List<E> readList<E extends Object>(E f());
+  List<E>? readListOrNull<E extends Object>(E f());
 }
diff --git a/pkg/compiler/lib/src/serialization/sink.dart b/pkg/compiler/lib/src/serialization/sink.dart
index ca1eddd..67ec6b5 100644
--- a/pkg/compiler/lib/src/serialization/sink.dart
+++ b/pkg/compiler/lib/src/serialization/sink.dart
@@ -138,6 +138,7 @@
 
   /// Writes a reference to [value] to this data sink. If [value] has not yet
   /// been serialized, [f] is called to serialize the value itself.
+  @override
   void writeCached<E>(E value, void f(E value)) {
     IndexedSink sink = _generalCaches[E] ??= _createSink<E>();
     sink.write(value, (v) => f(v));
@@ -160,6 +161,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSourceReader.readList].
+  @override
   void writeList<E>(Iterable<E> values, void f(E value),
       {bool allowNull = false}) {
     if (values == null) {
@@ -603,12 +605,14 @@
   }
 
   /// Writes the type [value] to this data sink.
+  @override
   void writeDartType(DartType value) {
     _writeDataKind(DataKind.dartType);
     value.writeToDataSink(this, []);
   }
 
   /// Writes the optional type [value] to this data sink.
+  @override
   void writeDartTypeOrNull(DartType /*?*/ value) {
     _writeDataKind(DataKind.dartType);
     if (value == null) {
@@ -623,6 +627,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSourceReader.readDartTypesOrNull].
+  @override
   void writeDartTypesOrNull(Iterable<DartType> /*?*/ values) {
     if (values == null) {
       writeInt(0);
@@ -635,6 +640,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSourceReader.readDartTypes].
+  @override
   void writeDartTypes(Iterable<DartType> values) {
     writeInt(values.length);
     for (DartType value in values) {
diff --git a/pkg/compiler/lib/src/serialization/source.dart b/pkg/compiler/lib/src/serialization/source.dart
index b5c8689..806731c 100644
--- a/pkg/compiler/lib/src/serialization/source.dart
+++ b/pkg/compiler/lib/src/serialization/source.dart
@@ -197,6 +197,7 @@
 
   /// Reads a reference to an [E] value from this data source. If the value has
   /// not yet been deserialized, [f] is called to deserialize the value itself.
+  @override
   E readCached<E>(E f()) {
     IndexedSource source = _generalCaches[E] ??= _createSource<E>();
     return source.read(f);
@@ -215,16 +216,27 @@
     return null;
   }
 
-  /// Reads a list of [E] values from this data source. If [emptyAsNull] is
-  /// `true`, `null` is returned instead of an empty list.
+  /// Reads a list of [E] values from this data source.
   ///
   /// This is a convenience method to be used together with
   /// [DataSinkWriter.writeList].
-  List<E> readList<E>(E f(), {bool emptyAsNull = false}) {
+  @override
+  List<E> readList<E>(E f()) {
+    return readListOrNull<E>(f) ?? List<E>.empty();
+  }
+
+  /// Reads a list of [E] values from this data source.
+  /// `null` is returned instead of an empty list.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSinkWriter.writeList].
+  @override
+  List<E> /*?*/ readListOrNull<E>(E f()) {
     int count = readInt();
-    if (count == 0 && emptyAsNull) return null;
-    List<E> list = List<E>.filled(count, null);
-    for (int i = 0; i < count; i++) {
+    if (count == 0) return null;
+    final first = f();
+    List<E> list = List<E>.filled(count, first);
+    for (int i = 1; i < count; i++) {
       list[i] = f();
     }
     return list;
@@ -658,6 +670,7 @@
   }
 
   /// Reads a type from this data source.
+  @override
   DartType /*!*/ readDartType() {
     _checkDataKind(DataKind.dartType);
     final type = DartType.readFromDataSource(this, []);
@@ -665,6 +678,7 @@
   }
 
   /// Reads a nullable type from this data source.
+  @override
   DartType /*?*/ readDartTypeOrNull() {
     _checkDataKind(DataKind.dartType);
     return DartType.readFromDataSourceOrNull(this, []);
@@ -674,6 +688,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSinkWriter.writeDartTypes].
+  @override
   List<DartType> readDartTypes() {
     // Share the list when empty.
     return readDartTypesOrNull() ?? const [];
@@ -684,6 +699,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSinkWriter.writeDartTypes].
+  @override
   List<DartType> /*?*/ readDartTypesOrNull() {
     int count = readInt();
     if (count == 0) return null;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index d897f20..3755c74 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -14,7 +14,7 @@
 import '../common/names.dart';
 import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
-import '../deferred_load/output_unit.dart';
+import '../deferred_load/output_unit.dart' show OutputUnit;
 import '../dump_info.dart';
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index ca162ab..3600c44 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -787,6 +787,10 @@
     // at use in the check.
     if (instruction.usedBy.isEmpty) {
       visitInstruction(instruction);
+    } else {
+      // The name argument can be generated at use. If present, it is either a
+      // string constant or a reference to a string.
+      analyzeInputs(instruction, 1);
     }
   }
 
@@ -1280,6 +1284,8 @@
       // TODO(sra): Check if a.x="s" can avoid or specialize a write barrier.
       if (instruction is HFieldSet) return true;
 
+      if (instruction is HLateCheck) return true;
+
       // TODO(sra): Determine if other uses result in faster JavaScript code.
       return false;
     }
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 36f104e..72dff8e 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3701,12 +3701,15 @@
 /// A check for a late sentinel to determine if a late field may be read from or
 /// written to.
 abstract class HLateCheck extends HCheck {
-  final HInstruction name;
-
-  HLateCheck(HInstruction input, this.name, AbstractValue type)
+  HLateCheck(HInstruction input, HInstruction /*?*/ name, AbstractValue type)
       : super([input, if (name != null) name], type);
 
-  bool get hasName => name != null;
+  bool get hasName => inputs.length > 1;
+
+  HInstruction get name {
+    if (hasName) return inputs[1];
+    throw StateError('HLateCheck.name: no name');
+  }
 
   @override
   bool isControlFlow() => true;
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
index edaba36..80505f7 100644
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -9,7 +9,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart' show InterfaceType;
 import '../kernel/element_map.dart' show KernelToElementMap;
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import 'class_set.dart';
 
 // TODO(johnniwinther): Move more methods from `JClosedWorld` to
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index b538a40..a527f69 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -10,7 +10,7 @@
 
 import '../elements/entities.dart' show ClassEntity;
 import '../elements/indexed.dart' show IndexedClass;
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/enumset.dart' show EnumSet;
 
 /// Enum for the different kinds of instantiation of a class.
@@ -546,12 +546,12 @@
       DataSourceReader source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
     source.begin(tag);
     ClassHierarchyNode node = nodeMap[source.readClass()];
-    List<ClassHierarchyNode> subtypes = source.readList(() {
+    List<ClassHierarchyNode> subtypes = source.readListOrNull(() {
       return nodeMap[source.readClass()];
-    }, emptyAsNull: true);
-    List<ClassHierarchyNode> mixinApplications = source.readList(() {
+    });
+    List<ClassHierarchyNode> mixinApplications = source.readListOrNull(() {
       return nodeMap[source.readClass()];
-    }, emptyAsNull: true);
+    });
     source.end(tag);
     return ClassSet(node)
       .._subtypes = subtypes
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index 213c7bf..b1a01a6 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -16,7 +16,7 @@
 
 import '../elements/types.dart';
 import '../ir/runtime_type_analysis.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/util.dart';
 
 /// A language feature that may be seen in the program.
diff --git a/pkg/compiler/lib/src/universe/member_usage.dart b/pkg/compiler/lib/src/universe/member_usage.dart
index 2356b7a..21027d0 100644
--- a/pkg/compiler/lib/src/universe/member_usage.dart
+++ b/pkg/compiler/lib/src/universe/member_usage.dart
@@ -10,7 +10,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../js_model/closure.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 import '../util/enumset.dart';
 import 'call_structure.dart';
 
diff --git a/pkg/compiler/lib/src/universe/side_effects.dart b/pkg/compiler/lib/src/universe/side_effects.dart
index a8cf6a2..9533a2b 100644
--- a/pkg/compiler/lib/src/universe/side_effects.dart
+++ b/pkg/compiler/lib/src/universe/side_effects.dart
@@ -7,7 +7,7 @@
 library universe.side_effects;
 
 import '../elements/entities.dart';
-import '../serialization/serialization.dart';
+import '../serialization/serialization_interfaces.dart';
 
 class SideEffects {
   /// Tag used for identifying serialized [SideEffects] objects in a debugging
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 276eee7..7c9e97e5 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -8,7 +8,7 @@
 
 import 'closure.dart';
 import 'common/elements.dart' show JCommonElements, JElementEnvironment;
-import 'deferred_load/output_unit.dart';
+import 'deferred_load/output_unit.dart' show OutputUnitData;
 import 'elements/entities.dart';
 import 'elements/names.dart';
 import 'elements/types.dart';
diff --git a/pkg/compiler/test/deferred/constant_emission_test_helper.dart b/pkg/compiler/test/deferred/constant_emission_test_helper.dart
index e7bb164..d5d7aa0 100644
--- a/pkg/compiler/test/deferred/constant_emission_test_helper.dart
+++ b/pkg/compiler/test/deferred/constant_emission_test_helper.dart
@@ -9,7 +9,7 @@
 
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/constants/values.dart';
-import 'package:compiler/src/deferred_load/output_unit.dart';
+import 'package:compiler/src/deferred_load/output_unit.dart' show OutputUnit;
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/js_emitter/model.dart';
diff --git a/pkg/compiler/test/deferred/load_graph_segmentation_test.dart b/pkg/compiler/test/deferred/load_graph_segmentation_test.dart
index 67954ca..8fc553a 100644
--- a/pkg/compiler/test/deferred/load_graph_segmentation_test.dart
+++ b/pkg/compiler/test/deferred/load_graph_segmentation_test.dart
@@ -10,7 +10,7 @@
 
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/deferred_load/output_unit.dart';
+import 'package:compiler/src/deferred_load/output_unit.dart' show OutputUnit;
 import 'package:compiler/src/js_emitter/startup_emitter/fragment_merger.dart';
 import 'package:expect/expect.dart';
 import '../helpers/memory_compiler.dart';
diff --git a/pkg/compiler/test/deferred_loading/deferred_loading_test_helper.dart b/pkg/compiler/test/deferred_loading/deferred_loading_test_helper.dart
index 92c1cb6..fe2a251 100644
--- a/pkg/compiler/test/deferred_loading/deferred_loading_test_helper.dart
+++ b/pkg/compiler/test/deferred_loading/deferred_loading_test_helper.dart
@@ -8,7 +8,8 @@
 import 'package:compiler/src/closure.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/deferred_load/output_unit.dart';
+import 'package:compiler/src/deferred_load/output_unit.dart'
+    show OutputUnit, OutputUnitData;
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/ir/util.dart';
 import 'package:compiler/src/js_model/element_map.dart';
diff --git a/pkg/compiler/test/dump_info/data/deferred/main.dart b/pkg/compiler/test/dump_info/data/deferred/main.dart
index 7e1cee2..58ffa26 100644
--- a/pkg/compiler/test/dump_info/data/deferred/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred/main.dart
@@ -4,7 +4,92 @@
 
 // @dart = 2.7
 
-/*library: library=[{
+/*library: 
+ constant=[
+  {
+  "id": "constant/B.C_Deferred = A.lib__funky$closure();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 39,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_Deferred = A.lib__funky$closure();\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.C__RootZone = new A._RootZone();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 35,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__RootZone = new A._RootZone();\n"
+},
+  {
+  "id": "constant/B.C__StringStackTrace = new A._StringStackTrace();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 51,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__StringStackTrace = new A._StringStackTrace();\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSInt_methods = J.JSInt.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 37,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSInt_methods = J.JSInt.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+}],
+ deferredFiles=[{
+  "main.dart": {
+    "name": "<unnamed>",
+    "imports": {
+      "lib": [
+        "out_1.part.js"
+      ]
+    }
+  }
+}],
+ dependencies=[{}],
+ library=[{
   "id": "library/memory:sdk/tests/web/native/main.dart::",
   "kind": "library",
   "name": "<unnamed>",
@@ -13,7 +98,27 @@
     "function/memory:sdk/tests/web/native/main.dart::main"
   ],
   "canonicalUri": "memory:sdk/tests/web/native/main.dart"
-}]*/
+}],
+ outputUnits=[
+  {
+  "id": "outputUnit/1",
+  "kind": "outputUnit",
+  "name": "1",
+  "size": 1063,
+  "filename": "out_1.part.js",
+  "imports": [
+    "lib"
+  ]
+},
+  {
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "size": 183730,
+  "filename": "out",
+  "imports": []
+}]
+*/
 
 import 'lib.dart' deferred as lib;
 
diff --git a/pkg/compiler/test/dump_info/data/deferred_future/main.dart b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
index 10e2e59..5500fb6 100644
--- a/pkg/compiler/test/dump_info/data/deferred_future/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
@@ -2,7 +2,100 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*library: library=[{
+/*library: 
+ constant=[
+  {
+  "id": "constant/B.C_A = new A.A();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 19,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_A = new A.A();\n"
+},
+  {
+  "id": "constant/B.C_Deferred = B.C_A;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 22,
+  "outputUnit": "outputUnit/1",
+  "code": "B.C_Deferred = B.C_A;\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.C__RootZone = new A._RootZone();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 35,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__RootZone = new A._RootZone();\n"
+},
+  {
+  "id": "constant/B.C__StringStackTrace = new A._StringStackTrace();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 51,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C__StringStackTrace = new A._StringStackTrace();\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSInt_methods = J.JSInt.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 37,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSInt_methods = J.JSInt.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+}],
+ deferredFiles=[{
+  "main.dart": {
+    "name": "<unnamed>",
+    "imports": {
+      "lib1": [
+        "out_1.part.js"
+      ]
+    }
+  }
+}],
+ dependencies=[{}],
+ library=[{
   "id": "library/memory:sdk/tests/web/native/main.dart::",
   "kind": "library",
   "name": "<unnamed>",
@@ -11,7 +104,27 @@
     "function/memory:sdk/tests/web/native/main.dart::main"
   ],
   "canonicalUri": "memory:sdk/tests/web/native/main.dart"
-}]*/
+}],
+ outputUnits=[
+  {
+  "id": "outputUnit/1",
+  "kind": "outputUnit",
+  "name": "1",
+  "size": 846,
+  "filename": "out_1.part.js",
+  "imports": [
+    "lib1"
+  ]
+},
+  {
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "size": 190176,
+  "filename": "out",
+  "imports": []
+}]
+*/
 
 // @dart = 2.7
 
diff --git a/pkg/compiler/test/dump_info/data/js_members.dart b/pkg/compiler/test/dump_info/data/js_members.dart
index 6f18324..46efe6b 100644
--- a/pkg/compiler/test/dump_info/data/js_members.dart
+++ b/pkg/compiler/test/dump_info/data/js_members.dart
@@ -1,4 +1,128 @@
-/*library: library=[{
+/*library: 
+ constant=[
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST0 = function() {\n  var toStringFunction = Object.prototype.toString;\n  function getTag(o) {\n    var s = toStringFunction.call(o);\n    return s.substring(8, s.length - 1);\n  }\n  function getUnknownTag(object, tag) {\n    if (/^HTML[A-Z].*Element$/.test(tag)) {\n      var name = toStringFunction.call(object);\n      if (name == \"[object Object]\") return null;\n      return \"HTMLElement\";\n    }\n  }\n  function getUnknownTagGenericBrowser(object, tag) {\n    if (self.HTMLElement && object instanceof HTMLElement) return \"HTMLElement\";\n    return getUnknownTag(object, tag);\n  }\n  function prototypeForTag(tag) {\n    if (typeof window == \"undefined\") return null;\n    if (typeof window[tag] == \"undefined\") return null;\n    var constructor = window[tag];\n    if (typeof constructor != \"function\") return null;\n    return constructor.prototype;\n  }\n  function discriminator(tag) { return null; }\n  var isBrowser = typeof navigator == \"object\";\n  return {\n    getTag: getTag,\n    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,\n    prototypeForTag: prototypeForTag,\n    discriminator: discriminator };\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 1133,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST0 = function() {\n  var toStringFunction = Object.prototype.toString;\n  function getTag(o) {\n    var s = toStringFunction.call(o);\n    return s.substring(8, s.length - 1);\n  }\n  function getUnknownTag(object, tag) {\n    if (/^HTML[A-Z].*Element$/.test(tag)) {\n      var name = toStringFunction.call(object);\n      if (name == \"[object Object]\") return null;\n      return \"HTMLElement\";\n    }\n  }\n  function getUnknownTagGenericBrowser(object, tag) {\n    if (self.HTMLElement && object instanceof HTMLElement) return \"HTMLElement\";\n    return getUnknownTag(object, tag);\n  }\n  function prototypeForTag(tag) {\n    if (typeof window == \"undefined\") return null;\n    if (typeof window[tag] == \"undefined\") return null;\n    var constructor = window[tag];\n    if (typeof constructor != \"function\") return null;\n    return constructor.prototype;\n  }\n  function discriminator(tag) { return null; }\n  var isBrowser = typeof navigator == \"object\";\n  return {\n    getTag: getTag,\n    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,\n    prototypeForTag: prototypeForTag,\n    discriminator: discriminator };\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST1 = function(hooks) {\n  if (typeof dartExperimentalFixupGetTag != \"function\") return hooks;\n  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 167,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST1 = function(hooks) {\n  if (typeof dartExperimentalFixupGetTag != \"function\") return hooks;\n  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST2 = function(hooks) {\n  var getTag = hooks.getTag;\n  var prototypeForTag = hooks.prototypeForTag;\n  function getTagFixed(o) {\n    var tag = getTag(o);\n    if (tag == \"Document\") {\n      if (!!o.xmlVersion) return \"!Document\";\n      return \"!HTMLDocument\";\n    }\n    return tag;\n  }\n  function prototypeForTagFixed(tag) {\n    if (tag == \"Document\") return null;\n    return prototypeForTag(tag);\n  }\n  hooks.getTag = getTagFixed;\n  hooks.prototypeForTag = prototypeForTagFixed;\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 491,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST2 = function(hooks) {\n  var getTag = hooks.getTag;\n  var prototypeForTag = hooks.prototypeForTag;\n  function getTagFixed(o) {\n    var tag = getTag(o);\n    if (tag == \"Document\") {\n      if (!!o.xmlVersion) return \"!Document\";\n      return \"!HTMLDocument\";\n    }\n    return tag;\n  }\n  function prototypeForTagFixed(tag) {\n    if (tag == \"Document\") return null;\n    return prototypeForTag(tag);\n  }\n  hooks.getTag = getTagFixed;\n  hooks.prototypeForTag = prototypeForTagFixed;\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST3 = function(hooks) { return hooks; }\n;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 52,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST3 = function(hooks) { return hooks; }\n;\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST4 = function(hooks) {\n  var userAgent = typeof navigator == \"object\" ? navigator.userAgent : \"\";\n  if (userAgent.indexOf(\"Trident/\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"HTMLDDElement\": \"HTMLElement\",\n    \"HTMLDTElement\": \"HTMLElement\",\n    \"HTMLPhraseElement\": \"HTMLElement\",\n    \"Position\": \"Geoposition\"\n  };\n  function getTagIE(o) {\n    var tag = getTag(o);\n    var newTag = quickMap[tag];\n    if (newTag) return newTag;\n    if (tag == \"Object\") {\n      if (window.DataView && (o instanceof window.DataView)) return \"DataView\";\n    }\n    return tag;\n  }\n  function prototypeForTagIE(tag) {\n    var constructor = window[tag];\n    if (constructor == null) return null;\n    return constructor.prototype;\n  }\n  hooks.getTag = getTagIE;\n  hooks.prototypeForTag = prototypeForTagIE;\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 900,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST4 = function(hooks) {\n  var userAgent = typeof navigator == \"object\" ? navigator.userAgent : \"\";\n  if (userAgent.indexOf(\"Trident/\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"HTMLDDElement\": \"HTMLElement\",\n    \"HTMLDTElement\": \"HTMLElement\",\n    \"HTMLPhraseElement\": \"HTMLElement\",\n    \"Position\": \"Geoposition\"\n  };\n  function getTagIE(o) {\n    var tag = getTag(o);\n    var newTag = quickMap[tag];\n    if (newTag) return newTag;\n    if (tag == \"Object\") {\n      if (window.DataView && (o instanceof window.DataView)) return \"DataView\";\n    }\n    return tag;\n  }\n  function prototypeForTagIE(tag) {\n    var constructor = window[tag];\n    if (constructor == null) return null;\n    return constructor.prototype;\n  }\n  hooks.getTag = getTagIE;\n  hooks.prototypeForTag = prototypeForTagIE;\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST5 = function(hooks) {\n  var userAgent = typeof navigator == \"object\" ? navigator.userAgent : \"\";\n  if (userAgent.indexOf(\"Firefox\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"GeoGeolocation\": \"Geolocation\",\n    \"Location\": \"!Location\",\n    \"WorkerMessageEvent\": \"MessageEvent\",\n    \"XMLDocument\": \"!Document\"};\n  function getTagFirefox(o) {\n    var tag = getTag(o);\n    return quickMap[tag] || tag;\n  }\n  hooks.getTag = getTagFirefox;\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 548,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST5 = function(hooks) {\n  var userAgent = typeof navigator == \"object\" ? navigator.userAgent : \"\";\n  if (userAgent.indexOf(\"Firefox\") == -1) return hooks;\n  var getTag = hooks.getTag;\n  var quickMap = {\n    \"BeforeUnloadEvent\": \"Event\",\n    \"DataTransfer\": \"Clipboard\",\n    \"GeoGeolocation\": \"Geolocation\",\n    \"Location\": \"!Location\",\n    \"WorkerMessageEvent\": \"MessageEvent\",\n    \"XMLDocument\": \"!Document\"};\n  function getTagFirefox(o) {\n    var tag = getTag(o);\n    return quickMap[tag] || tag;\n  }\n  hooks.getTag = getTagFirefox;\n};\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST6 = function(getTagFallback) {\n  return function(hooks) {\n    if (typeof navigator != \"object\") return hooks;\n    var ua = navigator.userAgent;\n    if (ua.indexOf(\"DumpRenderTree\") >= 0) return hooks;\n    if (ua.indexOf(\"Chrome\") >= 0) {\n      function confirm(p) {\n        return typeof window == \"object\" && window[p] && window[p].name == p;\n      }\n      if (confirm(\"Window\") && confirm(\"HTMLElement\")) return hooks;\n    }\n    hooks.getTag = getTagFallback;\n  };\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 482,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST6 = function(getTagFallback) {\n  return function(hooks) {\n    if (typeof navigator != \"object\") return hooks;\n    var ua = navigator.userAgent;\n    if (ua.indexOf(\"DumpRenderTree\") >= 0) return hooks;\n    if (ua.indexOf(\"Chrome\") >= 0) {\n      function confirm(p) {\n        return typeof window == \"object\" && window[p] && window[p].name == p;\n      }\n      if (confirm(\"Window\") && confirm(\"HTMLElement\")) return hooks;\n    }\n    hooks.getTag = getTagFallback;\n  };\n};\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 63,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+},
+  {
+  "id": "constant/B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 69,
+  "outputUnit": "outputUnit/main",
+  "code": "B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;\n"
+},
+  {
+  "id": "constant/B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 73,
+  "outputUnit": "outputUnit/main",
+  "code": "B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;\n"
+}],
+ deferredFiles=[{}],
+ dependencies=[{}],
+ library=[{
   "id": "library/memory:sdk/tests/web/native/main.dart::",
   "kind": "library",
   "name": "js_parameters_test",
@@ -9,7 +133,16 @@
     "function/memory:sdk/tests/web/native/main.dart::main"
   ],
   "canonicalUri": "memory:sdk/tests/web/native/main.dart"
-}]*/
+}],
+ outputUnits=[{
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "size": 112396,
+  "filename": "out",
+  "imports": []
+}]
+*/
 @JS()
 library js_parameters_test;
 
diff --git a/pkg/compiler/test/dump_info/data/members.dart b/pkg/compiler/test/dump_info/data/members.dart
index 6494321..4ac2296 100644
--- a/pkg/compiler/test/dump_info/data/members.dart
+++ b/pkg/compiler/test/dump_info/data/members.dart
@@ -1,4 +1,64 @@
-/*library: library=[{
+/*library: 
+ constant=[
+  {
+  "id": "constant/B.C_A = new A.A();\n",
+  "kind": "constant",
+  "name": null,
+  "size": 19,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_A = new A.A();\n"
+},
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": null,
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": null,
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+},
+  {
+  "id": "constant/B.List_A = A._setArrayType(makeConstList([B.C_A]), A.findType(\"JSArray<A>\"));\n",
+  "kind": "constant",
+  "name": null,
+  "size": 78,
+  "outputUnit": "outputUnit/main",
+  "code": "B.List_A = A._setArrayType(makeConstList([B.C_A]), A.findType(\"JSArray<A>\"));\n"
+}],
+ deferredFiles=[{}],
+ dependencies=[{}],
+ library=[{
   "id": "library/memory:sdk/tests/web/native/main.dart::",
   "kind": "library",
   "name": "<unnamed>",
@@ -12,7 +72,16 @@
     "function/memory:sdk/tests/web/native/main.dart::main"
   ],
   "canonicalUri": "memory:sdk/tests/web/native/main.dart"
-}]*/
+}],
+ outputUnits=[{
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "size": 91101,
+  "filename": "out",
+  "imports": []
+}]
+*/
 /*class: C:class=[{
   "id": "class/memory:sdk/tests/web/native/main.dart::C",
   "kind": "class",
diff --git a/pkg/compiler/test/dump_info/dump_info_test.dart b/pkg/compiler/test/dump_info/dump_info_test.dart
index 411f65f..87e0585 100644
--- a/pkg/compiler/test/dump_info/dump_info_test.dart
+++ b/pkg/compiler/test/dump_info/dump_info_test.dart
@@ -66,6 +66,23 @@
     features.addElement(
         Tags.library, indentedEncoder.convert(libraryInfo.accept(converter)));
 
+    // Store program-wide information on the main library.
+    var name = '${library.canonicalUri.pathSegments.last}';
+    if (name.startsWith('main')) {
+      for (final constantInfo in dumpInfoState.info.constants) {
+        features.addElement(Tags.constant,
+            indentedEncoder.convert(constantInfo.accept(converter)));
+      }
+      features.addElement(Tags.dependencies,
+          indentedEncoder.convert(dumpInfoState.info.dependencies));
+      for (final outputUnit in dumpInfoState.info.outputUnits) {
+        features.addElement(Tags.outputUnits,
+            indentedEncoder.convert(outputUnit.accept(converter)));
+      }
+      features.addElement(Tags.deferredFiles,
+          indentedEncoder.convert(dumpInfoState.info.deferredFiles));
+    }
+
     final id = LibraryId(library.canonicalUri);
     actualMap[id] =
         ActualData<Features>(id, features, library.canonicalUri, -1, library);
diff --git a/pkg/compiler/test/helpers/program_lookup.dart b/pkg/compiler/test/helpers/program_lookup.dart
index b575f55..600335d 100644
--- a/pkg/compiler/test/helpers/program_lookup.dart
+++ b/pkg/compiler/test/helpers/program_lookup.dart
@@ -5,7 +5,7 @@
 // @dart = 2.7
 
 import 'package:compiler/src/common/elements.dart';
-import 'package:compiler/src/deferred_load/output_unit.dart';
+import 'package:compiler/src/deferred_load/output_unit.dart' show OutputUnit;
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js/js.dart' as js;
 import 'package:compiler/src/js_backend/namer.dart';
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 895c2ab..c962060 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -1371,7 +1371,7 @@
 type YieldStatement extends Statement {
   Byte tag = 77;
   FileOffset fileOffset;
-  Byte flags (isYieldStar);
+  Byte flags (isYieldStar, isNative);
   Expression expression;
 }
 
diff --git a/pkg/vm/lib/transformations/continuation.dart b/pkg/vm/lib/transformations/continuation.dart
index f158e8e..4201896 100644
--- a/pkg/vm/lib/transformations/continuation.dart
+++ b/pkg/vm/lib/transformations/continuation.dart
@@ -158,9 +158,16 @@
           return node;
         }
       case AsyncMarker.AsyncStar:
-        return new AsyncStarFunctionRewriter(
-                helper, node, staticTypeContext, desugarAsync)
-            .rewrite();
+        if (desugarAsync) {
+          return new AsyncStarFunctionRewriter(
+                  helper, node, staticTypeContext, desugarAsync)
+              .rewrite();
+        } else {
+          node.transformOrRemoveChildren(new RecursiveContinuationRewriter(
+              helper, staticTypeContext, desugarAsync,
+              desugarAwaitFor: true));
+          return node;
+        }
     }
   }
 
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 9251781..e268ff0 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -77,7 +77,9 @@
   };
 
   explicit ExceptionHandlerList(const Function& function)
-      : list_(), has_async_handler_(function.IsCompactAsyncFunction()) {}
+      : list_(),
+        has_async_handler_(function.IsCompactAsyncFunction() ||
+                           function.IsCompactAsyncStarFunction()) {}
 
   intptr_t Length() const { return list_.length(); }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index c56be1c..771887e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -2519,6 +2519,36 @@
   }
 }
 
+void Assembler::PushRegistersInOrder(std::initializer_list<Register> regs) {
+  // Collect the longest descending sequences of registers and
+  // push them with a single STMDB instruction.
+  RegList pending_regs = 0;
+  Register lowest_pending_reg = kNumberOfCpuRegisters;
+  intptr_t num_pending_regs = 0;
+  for (Register reg : regs) {
+    if (reg >= lowest_pending_reg) {
+      ASSERT(pending_regs != 0);
+      if (num_pending_regs > 1) {
+        PushList(pending_regs);
+      } else {
+        Push(lowest_pending_reg);
+      }
+      pending_regs = 0;
+      num_pending_regs = 0;
+    }
+    pending_regs |= (1 << reg);
+    lowest_pending_reg = reg;
+    ++num_pending_regs;
+  }
+  if (pending_regs != 0) {
+    if (num_pending_regs > 1) {
+      PushList(pending_regs);
+    } else {
+      Push(lowest_pending_reg);
+    }
+  }
+}
+
 void Assembler::PushNativeCalleeSavedRegisters() {
   // Save new context and C++ ABI callee-saved registers.
   PushList(kAbiPreservedCpuRegs);
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index f7f856e..821426e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -1137,6 +1137,8 @@
   void PushRegisters(const RegisterSet& regs);
   void PopRegisters(const RegisterSet& regs);
 
+  void PushRegistersInOrder(std::initializer_list<Register> regs);
+
   // Push all registers which are callee-saved according to the ARM ABI.
   void PushNativeCalleeSavedRegisters();
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index efdeb2d..8d90c0f 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -2368,6 +2368,22 @@
   ASSERT(vprev == kNoVRegister);
 }
 
+void Assembler::PushRegistersInOrder(std::initializer_list<Register> regs) {
+  // Use STP to push registers in pairs.
+  Register pending_reg = kNoRegister;
+  for (Register reg : regs) {
+    if (pending_reg != kNoRegister) {
+      PushPair(reg, pending_reg);
+      pending_reg = kNoRegister;
+    } else {
+      pending_reg = reg;
+    }
+  }
+  if (pending_reg != kNoRegister) {
+    Push(pending_reg);
+  }
+}
+
 void Assembler::PushNativeCalleeSavedRegisters() {
   // Save the callee-saved registers.
   // We use str instead of the Push macro because we will be pushing the PP
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 980c22c..116083a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -524,6 +524,8 @@
   void PushRegisters(const RegisterSet& registers);
   void PopRegisters(const RegisterSet& registers);
 
+  void PushRegistersInOrder(std::initializer_list<Register> regs);
+
   // Push all registers which are callee-saved according to the ARM64 ABI.
   void PushNativeCalleeSavedRegisters();
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index e004bb5..2ead117 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -1873,6 +1873,12 @@
   popl(r);
 }
 
+void Assembler::PushRegistersInOrder(std::initializer_list<Register> regs) {
+  for (Register reg : regs) {
+    PushRegister(reg);
+  }
+}
+
 void Assembler::AddImmediate(Register reg, const Immediate& imm) {
   const intptr_t value = imm.value();
   if (value == 0) {
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index bc35841..48f6a49 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -710,6 +710,8 @@
     PopRegister(r1);
   }
 
+  void PushRegistersInOrder(std::initializer_list<Register> regs);
+
   void AddImmediate(Register reg, const Immediate& imm);
   void AddImmediate(Register reg, int32_t value) {
     AddImmediate(reg, Immediate(value));
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc
index b9bf437..c87a472 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.cc
+++ b/runtime/vm/compiler/assembler/assembler_riscv.cc
@@ -2173,6 +2173,7 @@
   }
   ASSERT(offset == 0);
 }
+
 void Assembler::PopRegisters(const RegisterSet& regs) {
   // The order in which the registers are pushed must match the order
   // in which the registers are encoded in the safepoint's stack map.
@@ -2201,6 +2202,16 @@
   addi(SP, SP, size);
 }
 
+void Assembler::PushRegistersInOrder(std::initializer_list<Register> regs) {
+  intptr_t offset = regs.size() * target::kWordSize;
+  subi(SP, SP, offset);
+  for (Register reg : regs) {
+    ASSERT(reg != SP);
+    offset -= target::kWordSize;
+    sx(reg, Address(SP, offset));
+  }
+}
+
 void Assembler::PushNativeCalleeSavedRegisters() {
   RegisterSet regs(kAbiPreservedCpuRegs, kAbiPreservedFpuRegs);
   intptr_t size = (regs.CpuRegisterCount() * target::kWordSize) +
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h
index 68ec777..9ae181f 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.h
+++ b/runtime/vm/compiler/assembler/assembler_riscv.h
@@ -778,6 +778,8 @@
   void PushRegisters(const RegisterSet& registers);
   void PopRegisters(const RegisterSet& registers);
 
+  void PushRegistersInOrder(std::initializer_list<Register> regs);
+
   // Push all registers which are callee-saved according to the ARM64 ABI.
   void PushNativeCalleeSavedRegisters();
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index ade5233..38a6af8 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1887,6 +1887,12 @@
   }
 }
 
+void Assembler::PushRegistersInOrder(std::initializer_list<Register> regs) {
+  for (Register reg : regs) {
+    PushRegister(reg);
+  }
+}
+
 static const RegisterSet kVolatileRegisterSet(
     CallingConventions::kVolatileCpuRegisters,
     CallingConventions::kVolatileXmmRegisters);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index c85db24..b906f6e 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -890,6 +890,8 @@
   void PushRegisters(const RegisterSet& registers);
   void PopRegisters(const RegisterSet& registers);
 
+  void PushRegistersInOrder(std::initializer_list<Register> regs);
+
   void CheckCodePointer();
 
   void EnterFrame(intptr_t frame_space);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 7b14f31..c03025e0 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -376,7 +376,7 @@
   } else if (parsed_function().suspend_state_var() != nullptr) {
     // Initialize synthetic :suspend_state variable early
     // as it may be accessed by GC and exception handling before
-    // InitAsync stub is called.
+    // InitSuspendableFunction stub is called.
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariable(
             parsed_function().suspend_state_var());
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 67fed8a..362e199 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -366,7 +366,7 @@
   } else if (parsed_function().suspend_state_var() != nullptr) {
     // Initialize synthetic :suspend_state variable early
     // as it may be accessed by GC and exception handling before
-    // InitAsync stub is called.
+    // InitSuspendableFunction stub is called.
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariable(
             parsed_function().suspend_state_var());
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index c23ff8a..257243a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -453,7 +453,7 @@
   } else if (parsed_function().suspend_state_var() != nullptr) {
     // Initialize synthetic :suspend_state variable early
     // as it may be accessed by GC and exception handling before
-    // InitAsync stub is called.
+    // InitSuspendableFunction stub is called.
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariable(
             parsed_function().suspend_state_var());
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc b/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
index 2c40fdc..c129e1b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_riscv.cc
@@ -360,7 +360,7 @@
   } else if (parsed_function().suspend_state_var() != nullptr) {
     // Initialize synthetic :suspend_state variable early
     // as it may be accessed by GC and exception handling before
-    // InitAsync stub is called.
+    // InitSuspendableFunction stub is called.
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariable(
             parsed_function().suspend_state_var());
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index e6c3b1e..59db090 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -372,7 +372,7 @@
   } else if (parsed_function().suspend_state_var() != nullptr) {
     // Initialize synthetic :suspend_state variable early
     // as it may be accessed by GC and exception handling before
-    // InitAsync stub is called.
+    // InitSuspendableFunction stub is called.
     const intptr_t slot_index =
         compiler::target::frame_layout.FrameSlotForVariable(
             parsed_function().suspend_state_var());
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 768d5c4..4a8bc6c 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -6901,16 +6901,25 @@
 }
 
 const Code& ReturnInstr::GetReturnStub(FlowGraphCompiler* compiler) const {
-  ASSERT(compiler->parsed_function().function().IsCompactAsyncFunction());
-  if (!value()->Type()->CanBeFuture()) {
-    return Code::ZoneHandle(compiler->zone(),
-                            compiler->isolate_group()
-                                ->object_store()
-                                ->return_async_not_future_stub());
+  const Function& function = compiler->parsed_function().function();
+  ASSERT(function.IsSuspendableFunction());
+  if (function.IsCompactAsyncFunction()) {
+    if (!value()->Type()->CanBeFuture()) {
+      return Code::ZoneHandle(compiler->zone(),
+                              compiler->isolate_group()
+                                  ->object_store()
+                                  ->return_async_not_future_stub());
+    }
+    return Code::ZoneHandle(
+        compiler->zone(),
+        compiler->isolate_group()->object_store()->return_async_stub());
+  } else if (function.IsCompactAsyncStarFunction()) {
+    return Code::ZoneHandle(
+        compiler->zone(),
+        compiler->isolate_group()->object_store()->return_async_star_stub());
+  } else {
+    UNREACHABLE();
   }
-  return Code::ZoneHandle(
-      compiler->zone(),
-      compiler->isolate_group()->object_store()->return_async_stub());
 }
 
 void NativeReturnInstr::EmitReturnMoves(FlowGraphCompiler* compiler) {
@@ -7230,10 +7239,12 @@
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
   switch (stub_id_) {
     case StubId::kInitAsync:
+    case StubId::kInitAsyncStar:
       locs->set_in(0, Location::RegisterLocation(
                           InitSuspendableFunctionStubABI::kTypeArgsReg));
       break;
-    case StubId::kAwaitAsync:
+    case StubId::kAwait:
+    case StubId::kYieldAsyncStar:
       locs->set_in(0, Location::RegisterLocation(SuspendStubABI::kArgumentReg));
       break;
   }
@@ -7248,15 +7259,21 @@
     case StubId::kInitAsync:
       stub = object_store->init_async_stub();
       break;
-    case StubId::kAwaitAsync:
-      stub = object_store->await_async_stub();
+    case StubId::kAwait:
+      stub = object_store->await_stub();
+      break;
+    case StubId::kInitAsyncStar:
+      stub = object_store->init_async_star_stub();
+      break;
+    case StubId::kYieldAsyncStar:
+      stub = object_store->yield_async_star_stub();
       break;
   }
   compiler->GenerateStubCall(source(), stub, UntaggedPcDescriptors::kOther,
                              locs(), deopt_id(), env());
 
 #if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_IA32)
-  if (stub_id_ == StubId::kAwaitAsync) {
+  if ((stub_id_ == StubId::kAwait) || (stub_id_ == StubId::kYieldAsyncStar)) {
     // On x86 (X64 and IA32) mismatch between calls and returns
     // significantly regresses performance. So suspend stub
     // does not return directly to the caller. Instead, a small
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index d0bbaed..6b6c9019 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -9567,8 +9567,10 @@
 class Call1ArgStubInstr : public TemplateDefinition<1, Throws> {
  public:
   enum class StubId {
+    kAwait,
     kInitAsync,
-    kAwaitAsync,
+    kInitAsyncStar,
+    kYieldAsyncStar,
   };
 
   Call1ArgStubInstr(const InstructionSource& source,
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index cf3345c..493238e 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -484,7 +484,7 @@
     ASSERT(result == CallingConventions::kReturnFpuReg);
   }
 
-  if (compiler->parsed_function().function().IsCompactAsyncFunction()) {
+  if (compiler->parsed_function().function().IsSuspendableFunction()) {
     ASSERT(compiler->flow_graph().graph_entry()->NeedsFrame());
     const Code& stub = GetReturnStub(compiler);
     compiler->EmitJumpToStub(stub);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index a6a35de..4d0bf7c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -411,7 +411,7 @@
     ASSERT(result == CallingConventions::kReturnFpuReg);
   }
 
-  if (compiler->parsed_function().function().IsCompactAsyncFunction()) {
+  if (compiler->parsed_function().function().IsSuspendableFunction()) {
     ASSERT(compiler->flow_graph().graph_entry()->NeedsFrame());
     const Code& stub = GetReturnStub(compiler);
     compiler->EmitJumpToStub(stub);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 3a4a935..f2ebdda 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -233,7 +233,7 @@
   Register result = locs()->in(0).reg();
   ASSERT(result == EAX);
 
-  if (compiler->parsed_function().function().IsCompactAsyncFunction()) {
+  if (compiler->parsed_function().function().IsSuspendableFunction()) {
     ASSERT(compiler->flow_graph().graph_entry()->NeedsFrame());
     const Code& stub = GetReturnStub(compiler);
     compiler->EmitJumpToStub(stub);
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index a4ed678..76b1c00 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -1362,8 +1362,14 @@
     case StubId::kInitAsync:
       name = "InitAsync";
       break;
-    case StubId::kAwaitAsync:
-      name = "AwaitAsync";
+    case StubId::kAwait:
+      name = "Await";
+      break;
+    case StubId::kInitAsyncStar:
+      name = "InitAsyncStar";
+      break;
+    case StubId::kYieldAsyncStar:
+      name = "YieldAsyncStar";
       break;
   }
   f->Printf("%s(", name);
diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc
index d646861..74459f7 100644
--- a/runtime/vm/compiler/backend/il_riscv.cc
+++ b/runtime/vm/compiler/backend/il_riscv.cc
@@ -464,7 +464,7 @@
     ASSERT(result == CallingConventions::kReturnFpuReg);
   }
 
-  if (compiler->parsed_function().function().IsCompactAsyncFunction()) {
+  if (compiler->parsed_function().function().IsSuspendableFunction()) {
     ASSERT(compiler->flow_graph().graph_entry()->NeedsFrame());
     const Code& stub = GetReturnStub(compiler);
     compiler->EmitJumpToStub(stub);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 75475b1..170932f 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -338,7 +338,7 @@
     ASSERT(result == CallingConventions::kReturnFpuReg);
   }
 
-  if (compiler->parsed_function().function().IsCompactAsyncFunction()) {
+  if (compiler->parsed_function().function().IsSuspendableFunction()) {
     ASSERT(compiler->flow_graph().graph_entry()->NeedsFrame());
     const Code& stub = GetReturnStub(compiler);
     compiler->EmitJumpToStub(stub);
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 708308f..f2cf0ab 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2814,7 +2814,7 @@
     case Slot::Kind::kFunctionType_parameter_types:
     case Slot::Kind::kFunctionType_type_parameters:
     case Slot::Kind::kInstance_native_fields_array:
-    case Slot::Kind::kSuspendState_future:
+    case Slot::Kind::kSuspendState_function_data:
     case Slot::Kind::kSuspendState_then_callback:
     case Slot::Kind::kSuspendState_error_callback:
     case Slot::Kind::kTypedDataView_typed_data:
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 77d0153..74e10bc 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -243,7 +243,7 @@
     case Slot::Kind::kFunctionType_named_parameter_names:
     case Slot::Kind::kFunctionType_parameter_types:
     case Slot::Kind::kFunctionType_type_parameters:
-    case Slot::Kind::kSuspendState_future:
+    case Slot::Kind::kSuspendState_function_data:
     case Slot::Kind::kSuspendState_then_callback:
     case Slot::Kind::kSuspendState_error_callback:
     case Slot::Kind::kType_arguments:
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 12609d6..e4efe29 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -73,7 +73,7 @@
   V(ImmutableLinkedHashBase, UntaggedLinkedHashBase, index,                    \
     TypedDataUint32Array, VAR)                                                 \
   V(Instance, UntaggedInstance, native_fields_array, Dynamic, VAR)             \
-  V(SuspendState, UntaggedSuspendState, future, Dynamic, VAR)                  \
+  V(SuspendState, UntaggedSuspendState, function_data, Dynamic, VAR)           \
   V(SuspendState, UntaggedSuspendState, then_callback, Closure, VAR)           \
   V(SuspendState, UntaggedSuspendState, error_callback, Closure, VAR)          \
   V(Type, UntaggedType, arguments, TypeArguments, FINAL)                       \
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index ab59d68..6bbd861 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -684,6 +684,24 @@
     body += B->Call1ArgStub(TokenPosition::kNoSource,
                             Call1ArgStubInstr::StubId::kInitAsync);
     body += Drop();
+  } else if (dart_function.IsCompactAsyncStarFunction()) {
+    const auto& result_type =
+        AbstractType::Handle(Z, dart_function.result_type());
+    auto& type_args = TypeArguments::ZoneHandle(Z);
+    if (result_type.IsType() &&
+        (result_type.type_class() == IG->object_store()->stream_class())) {
+      ASSERT(result_type.IsFinalized());
+      type_args = result_type.arguments();
+    }
+
+    body += TranslateInstantiatedTypeArguments(type_args);
+    body += B->Call1ArgStub(TokenPosition::kNoSource,
+                            Call1ArgStubInstr::StubId::kInitAsyncStar);
+    body += Drop();
+    body += NullConstant();
+    body += B->Call1ArgStub(TokenPosition::kNoSource,
+                            Call1ArgStubInstr::StubId::kYieldAsyncStar);
+    body += Drop();
   }
   return body;
 }
@@ -4322,7 +4340,8 @@
 
 Fragment StreamingFlowGraphBuilder::BuildAwaitExpression(
     TokenPosition* position) {
-  ASSERT(parsed_function()->function().IsCompactAsyncFunction());
+  ASSERT(parsed_function()->function().IsCompactAsyncFunction() ||
+         parsed_function()->function().IsCompactAsyncStarFunction());
   Fragment instructions;
 
   const TokenPosition pos = ReadPosition();  // read file offset.
@@ -4330,7 +4349,7 @@
 
   instructions += BuildExpression();  // read operand.
 
-  instructions += B->Call1ArgStub(pos, Call1ArgStubInstr::StubId::kAwaitAsync);
+  instructions += B->Call1ArgStub(pos, Call1ArgStubInstr::StubId::kAwait);
   return instructions;
 }
 
@@ -5228,8 +5247,83 @@
   const TokenPosition pos = ReadPosition();  // read position.
   if (position != nullptr) *position = pos;
 
-  uint8_t flags = ReadByte();          // read flags.
-  ASSERT(flags == kNativeYieldFlags);  // Must have been desugared.
+  const uint8_t flags = ReadByte();  // read flags.
+
+  if ((flags & kYieldStatementFlagNative) == 0) {
+    Fragment instructions;
+    // Generate the following code for yield <expr>:
+    //
+    // _AsyncStarStreamController controller = :suspend_state._functionData;
+    // if (controller.add(<expr>)) {
+    //   return;
+    // }
+    // suspend();
+    //
+    // Generate the following code for yield* <expr>:
+    //
+    // _AsyncStarStreamController controller = :suspend_state._functionData;
+    // controller.addStream(<expr>);
+    // if (suspend()) {
+    //   return;
+    // }
+    //
+
+    // Load :suspend_state variable using low-level FP-relative load
+    // in order to avoid confusing SSA construction (which cannot
+    // track its value as it is modified implicitly by stubs).
+    LocalVariable* suspend_state = parsed_function()->suspend_state_var();
+    ASSERT(suspend_state != nullptr);
+    instructions += IntConstant(0);
+    instructions += B->LoadFpRelativeSlot(
+        compiler::target::frame_layout.FrameSlotForVariable(suspend_state) *
+            compiler::target::kWordSize,
+        CompileType::Dynamic(), kTagged);
+    instructions += LoadNativeField(Slot::SuspendState_function_data());
+
+    instructions += BuildExpression();  // read expression.
+
+    auto& add_method = Function::ZoneHandle(Z);
+    const bool is_yield_star = (flags & kYieldStatementFlagYieldStar) != 0;
+    if (is_yield_star) {
+      add_method =
+          IG->object_store()->async_star_stream_controller_add_stream();
+    } else {
+      add_method = IG->object_store()->async_star_stream_controller_add();
+    }
+    instructions += StaticCall(pos, add_method, 2, ICData::kNoRebind);
+
+    if (is_yield_star) {
+      // Discard result of _AsyncStarStreamController.addStream().
+      instructions += Drop();
+      // Suspend and test value passed to the resumed async* body.
+      instructions += NullConstant();
+      instructions +=
+          B->Call1ArgStub(pos, Call1ArgStubInstr::StubId::kYieldAsyncStar);
+    } else {
+      // Test value returned by _AsyncStarStreamController.add().
+    }
+
+    TargetEntryInstr* exit;
+    TargetEntryInstr* continue_execution;
+    instructions += BranchIfTrue(&exit, &continue_execution, false);
+
+    Fragment do_exit(exit);
+    do_exit += TranslateFinallyFinalizers(nullptr, -1);
+    do_exit += NullConstant();
+    do_exit += Return(TokenPosition::kNoSource);
+
+    instructions = Fragment(instructions.entry, continue_execution);
+    if (!is_yield_star) {
+      instructions += NullConstant();
+      instructions +=
+          B->Call1ArgStub(pos, Call1ArgStubInstr::StubId::kYieldAsyncStar);
+      instructions += Drop();
+    }
+
+    return instructions;
+  }
+
+  ASSERT(flags == kYieldStatementFlagNative);  // Must have been desugared.
 
   // Setup yield/continue point:
   //
@@ -5476,6 +5570,16 @@
           function.set_is_inlinable(false);
           function.set_is_visible(true);
           ASSERT(function.IsCompactAsyncFunction());
+        } else if (function_node_helper.async_marker_ ==
+                   FunctionNodeHelper::kAsyncStar) {
+          if (!FLAG_precompiled_mode) {
+            FATAL("Compact async* functions are only supported in AOT mode.");
+          }
+          function.set_modifier(UntaggedFunction::kAsyncGen);
+          function.set_is_debuggable(true);
+          function.set_is_inlinable(false);
+          function.set_is_visible(true);
+          ASSERT(function.IsCompactAsyncStarFunction());
         } else {
           ASSERT((function_node_helper.async_marker_ ==
                   FunctionNodeHelper::kSync) ||
@@ -5514,6 +5618,7 @@
             function.set_is_inlinable(!FLAG_lazy_async_stacks);
           }
           ASSERT(!function.IsCompactAsyncFunction());
+          ASSERT(!function.IsCompactAsyncStarFunction());
         }
 
         // If the start token position is synthetic, the end token position
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 6f0e43c..86576be 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -834,7 +834,7 @@
   V(LinkedHashBase_getIndex, LinkedHashBase_index)                             \
   V(LinkedHashBase_getUsedData, LinkedHashBase_used_data)                      \
   V(ObjectArrayLength, Array_length)                                           \
-  V(SuspendState_getFuture, SuspendState_future)                               \
+  V(SuspendState_getFunctionData, SuspendState_function_data)                  \
   V(SuspendState_getThenCallback, SuspendState_then_callback)                  \
   V(SuspendState_getErrorCallback, SuspendState_error_callback)                \
   V(TypedDataViewOffsetInBytes, TypedDataView_offset_in_bytes)                 \
@@ -852,7 +852,7 @@
   V(NativeFinalizer_setCallback, NativeFinalizer_callback)                     \
   V(LinkedHashBase_setData, LinkedHashBase_data)                               \
   V(LinkedHashBase_setIndex, LinkedHashBase_index)                             \
-  V(SuspendState_setFuture, SuspendState_future)                               \
+  V(SuspendState_setFunctionData, SuspendState_function_data)                  \
   V(SuspendState_setThenCallback, SuspendState_then_callback)                  \
   V(SuspendState_setErrorCallback, SuspendState_error_callback)                \
   V(WeakProperty_setKey, WeakProperty_key)                                     \
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index c20ee54..6363a5e 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -89,7 +89,7 @@
   scope_->set_begin_token_pos(function.token_pos());
   scope_->set_end_token_pos(function.end_token_pos());
 
-  if (function.IsCompactAsyncFunction()) {
+  if (function.IsSuspendableFunction()) {
     LocalVariable* suspend_state_var =
         MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                      Symbols::SuspendStateVar(), AbstractType::dynamic_type());
@@ -1276,15 +1276,16 @@
       word flags = helper_.ReadByte();  // read flags.
       VisitExpression();                // read expression.
 
-      ASSERT(flags == kNativeYieldFlags);
-      if (depth_.function_ == 0) {
-        AddSwitchVariable();
-        // Promote all currently visible local variables into the context.
-        // TODO(27590) CaptureLocalVariables promotes to many variables into
-        // the scope. Mark those variables as stack_local.
-        // TODO(27590) we don't need to promote those variables that are
-        // not used across yields.
-        scope_->CaptureLocalVariables(current_function_scope_);
+      if ((flags & kYieldStatementFlagNative) != 0) {
+        if (depth_.function_ == 0) {
+          AddSwitchVariable();
+          // Promote all currently visible local variables into the context.
+          // TODO(27590) CaptureLocalVariables promotes to many variables into
+          // the scope. Mark those variables as stack_local.
+          // TODO(27590) we don't need to promote those variables that are
+          // not used across yields.
+          scope_->CaptureLocalVariables(current_function_scope_);
+        }
       }
       return;
     }
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index f1ce6f5..e887d24 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -83,8 +83,10 @@
   V(::, copyRangeFromUint8ListToOneByteString,                                 \
     CopyRangeFromUint8ListToOneByteString, 0x19a1bf41)                         \
   V(_StringBase, _interpolate, StringBaseInterpolate, 0x7da2a580)              \
-  V(_SuspendState, get:_future, SuspendState_getFuture, 0x0e2a7e73)            \
-  V(_SuspendState, set:_future, SuspendState_setFuture, 0x179923b0)            \
+  V(_SuspendState, get:_functionData, SuspendState_getFunctionData,            \
+    0x7290026e)                                                                \
+  V(_SuspendState, set:_functionData, SuspendState_setFunctionData,            \
+    0x2b6668ab)                                                                \
   V(_SuspendState, get:_thenCallback, SuspendState_getThenCallback,            \
     0xff1dccec)                                                                \
   V(_SuspendState, set:_thenCallback, SuspendState_setThenCallback,            \
@@ -95,7 +97,9 @@
     0x4935f88c)                                                                \
   V(_SuspendState, _createAsyncCallbacks, SuspendState_createAsyncCallbacks,   \
     0x4add6c13)                                                                \
-  V(_SuspendState, _resume, SuspendState_resume, 0x93d8c5e8)                   \
+  V(_SuspendState, _createAsyncStarCallback,                                   \
+    SuspendState_createAsyncStarCallback, 0xfa7537e4)                          \
+  V(_SuspendState, _resume, SuspendState_resume, 0xc738e9d2)                   \
   V(_IntegerImplementation, toDouble, IntegerToDouble, 0x97728b46)             \
   V(_Double, _add, DoubleAdd, 0xea666327)                                      \
   V(_Double, _sub, DoubleSub, 0x28474c2e)                                      \
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 267337f..31c7822 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -992,7 +992,7 @@
  public:
   static word frame_size_offset();
   static word pc_offset();
-  static word future_offset();
+  static word function_data_offset();
   static word then_callback_offset();
   static word error_callback_offset();
   static word payload_offset();
@@ -1239,9 +1239,14 @@
   static word random_offset();
 
   static word suspend_state_init_async_entry_point_offset();
-  static word suspend_state_await_async_entry_point_offset();
+  static word suspend_state_await_entry_point_offset();
   static word suspend_state_return_async_entry_point_offset();
   static word suspend_state_return_async_not_future_entry_point_offset();
+
+  static word suspend_state_init_async_star_entry_point_offset();
+  static word suspend_state_yield_async_star_entry_point_offset();
+  static word suspend_state_return_async_star_entry_point_offset();
+
   static word suspend_state_handle_exception_entry_point_offset();
 
   static word OffsetFromThread(const dart::Object& object);
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 738ed65..2fc188c 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -248,7 +248,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -256,9 +257,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    780;
+    792;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    784;
+    796;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -281,7 +282,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 820;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 832;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -292,13 +293,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 848;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 856;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 824;
+    Thread_double_truncate_round_supported_offset = 836;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 852;
+    Thread_service_extension_stream_offset = 860;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -314,7 +315,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    800;
+    812;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -336,13 +337,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    788;
+    800;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    816;
+    828;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 856;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 864;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -384,11 +385,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 792;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 804;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 796;
+    Thread_saved_shadow_call_stack_offset = 808;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    804;
+    816;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -409,7 +410,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 764;
+    Thread_suspend_state_await_entry_point_offset = 764;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 760;
 static constexpr dart::compiler::target::word
@@ -417,7 +418,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 772;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 776;
+    Thread_suspend_state_init_async_star_entry_point_offset = 776;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 780;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 784;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 788;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -432,13 +439,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 808;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 820;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 812;
-static constexpr dart::compiler::target::word Thread_random_offset = 832;
+    Thread_callback_stack_return_offset = 824;
+static constexpr dart::compiler::target::word Thread_random_offset = 840;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 840;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 848;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -863,7 +870,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -871,9 +879,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
+    1584;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1568;
+    1592;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -897,7 +905,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -908,13 +916,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1680;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1704;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1688;
+    Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -930,7 +938,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1624;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -952,14 +960,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1600;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -1001,11 +1009,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1632;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -1026,7 +1034,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1528;
+    Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -1034,7 +1042,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -1050,13 +1064,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word Thread_random_offset = 1656;
+    Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1664;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1688;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -1481,7 +1495,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -1489,9 +1504,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    748;
+    760;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    752;
+    764;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -1514,7 +1529,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 788;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 800;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -1525,13 +1540,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 816;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 824;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 792;
+    Thread_double_truncate_round_supported_offset = 804;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 820;
+    Thread_service_extension_stream_offset = 828;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -1547,7 +1562,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    768;
+    780;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -1569,13 +1584,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    756;
+    768;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    784;
+    796;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 824;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 832;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -1617,11 +1632,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 760;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 772;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 764;
+    Thread_saved_shadow_call_stack_offset = 776;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    772;
+    784;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -1642,7 +1657,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 732;
+    Thread_suspend_state_await_entry_point_offset = 732;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 728;
 static constexpr dart::compiler::target::word
@@ -1650,7 +1665,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 740;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 744;
+    Thread_suspend_state_init_async_star_entry_point_offset = 744;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 748;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 752;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 756;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -1665,13 +1686,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 776;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 788;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 780;
-static constexpr dart::compiler::target::word Thread_random_offset = 800;
+    Thread_callback_stack_return_offset = 792;
+static constexpr dart::compiler::target::word Thread_random_offset = 808;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 808;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 816;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -2093,7 +2114,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -2101,9 +2123,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -2127,7 +2149,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -2138,13 +2160,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1744;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1768;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1712;
+    Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1752;
+    Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -2160,7 +2182,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -2182,14 +2204,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -2231,11 +2253,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1648;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1656;
+    Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -2256,7 +2278,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1592;
+    Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -2264,7 +2286,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -2280,13 +2308,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word Thread_random_offset = 1720;
+    Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1728;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1752;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -2713,7 +2741,8 @@
     SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -2721,9 +2750,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
+    1584;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1568;
+    1592;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -2747,7 +2776,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -2758,13 +2787,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1680;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1704;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1688;
+    Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -2780,7 +2809,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1624;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -2802,14 +2831,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1600;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -2851,11 +2880,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1632;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -2876,7 +2905,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1528;
+    Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -2884,7 +2913,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -2900,13 +2935,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word Thread_random_offset = 1656;
+    Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1664;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1688;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -3332,7 +3367,8 @@
     SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -3340,9 +3376,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -3366,7 +3402,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -3377,13 +3413,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1744;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1768;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1712;
+    Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1752;
+    Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -3399,7 +3435,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -3421,14 +3457,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -3470,11 +3506,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1648;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1656;
+    Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -3495,7 +3531,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1592;
+    Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -3503,7 +3539,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -3519,13 +3561,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word Thread_random_offset = 1720;
+    Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1728;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1752;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -3951,7 +3993,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -3959,9 +4002,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    820;
+    832;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    824;
+    836;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -3984,7 +4027,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 860;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 872;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -3995,13 +4038,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 888;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 896;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 864;
+    Thread_double_truncate_round_supported_offset = 876;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 892;
+    Thread_service_extension_stream_offset = 900;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -4017,7 +4060,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    840;
+    852;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -4039,13 +4082,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    828;
+    840;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    856;
+    868;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 896;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 904;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -4087,11 +4130,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 832;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 844;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 836;
+    Thread_saved_shadow_call_stack_offset = 848;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    844;
+    856;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -4112,7 +4155,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 804;
+    Thread_suspend_state_await_entry_point_offset = 804;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 800;
 static constexpr dart::compiler::target::word
@@ -4120,7 +4163,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 812;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 816;
+    Thread_suspend_state_init_async_star_entry_point_offset = 816;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 820;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 824;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 828;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -4135,13 +4184,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 848;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 860;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 852;
-static constexpr dart::compiler::target::word Thread_random_offset = 872;
+    Thread_callback_stack_return_offset = 864;
+static constexpr dart::compiler::target::word Thread_random_offset = 880;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 880;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 888;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -4568,7 +4617,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -4576,9 +4626,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -4602,7 +4652,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -4613,13 +4663,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1760;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1704;
+    Thread_double_truncate_round_supported_offset = 1728;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1744;
+    Thread_service_extension_stream_offset = 1768;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -4635,7 +4685,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1656;
+    1680;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -4657,14 +4707,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1688;
+    1712;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1752;
+    1776;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -4706,11 +4756,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1640;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1664;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1648;
+    Thread_saved_shadow_call_stack_offset = 1672;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -4731,7 +4781,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1584;
+    Thread_suspend_state_await_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
@@ -4739,7 +4789,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1600;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1608;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1608;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1632;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -4755,13 +4811,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1680;
-static constexpr dart::compiler::target::word Thread_random_offset = 1712;
+    Thread_callback_stack_return_offset = 1704;
+static constexpr dart::compiler::target::word Thread_random_offset = 1736;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1720;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1744;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -5183,7 +5239,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -5191,9 +5248,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    780;
+    792;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    784;
+    796;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -5216,7 +5273,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 820;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 832;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -5227,13 +5284,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 848;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 856;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 824;
+    Thread_double_truncate_round_supported_offset = 836;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 852;
+    Thread_service_extension_stream_offset = 860;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -5249,7 +5306,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    800;
+    812;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -5271,13 +5328,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    788;
+    800;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    816;
+    828;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 856;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 864;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -5319,11 +5376,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 792;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 804;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 796;
+    Thread_saved_shadow_call_stack_offset = 808;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    804;
+    816;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -5344,7 +5401,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 764;
+    Thread_suspend_state_await_entry_point_offset = 764;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 760;
 static constexpr dart::compiler::target::word
@@ -5352,7 +5409,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 772;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 776;
+    Thread_suspend_state_init_async_star_entry_point_offset = 776;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 780;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 784;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 788;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -5367,13 +5430,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 808;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 820;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 812;
-static constexpr dart::compiler::target::word Thread_random_offset = 832;
+    Thread_callback_stack_return_offset = 824;
+static constexpr dart::compiler::target::word Thread_random_offset = 840;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 840;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 848;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -5792,7 +5855,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -5800,9 +5864,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
+    1584;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1568;
+    1592;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -5826,7 +5890,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -5837,13 +5901,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1680;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1704;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1688;
+    Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -5859,7 +5923,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1624;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -5881,14 +5945,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1600;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -5930,11 +5994,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1632;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -5955,7 +6019,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1528;
+    Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -5963,7 +6027,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -5979,13 +6049,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word Thread_random_offset = 1656;
+    Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1664;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1688;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -6404,7 +6474,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -6412,9 +6483,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    748;
+    760;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    752;
+    764;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -6437,7 +6508,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 788;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 800;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -6448,13 +6519,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 816;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 824;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 792;
+    Thread_double_truncate_round_supported_offset = 804;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 820;
+    Thread_service_extension_stream_offset = 828;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -6470,7 +6541,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    768;
+    780;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -6492,13 +6563,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    756;
+    768;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    784;
+    796;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 824;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 832;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -6540,11 +6611,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 760;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 772;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 764;
+    Thread_saved_shadow_call_stack_offset = 776;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    772;
+    784;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -6565,7 +6636,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 732;
+    Thread_suspend_state_await_entry_point_offset = 732;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 728;
 static constexpr dart::compiler::target::word
@@ -6573,7 +6644,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 740;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 744;
+    Thread_suspend_state_init_async_star_entry_point_offset = 744;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 748;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 752;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 756;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -6588,13 +6665,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 776;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 788;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 780;
-static constexpr dart::compiler::target::word Thread_random_offset = 800;
+    Thread_callback_stack_return_offset = 792;
+static constexpr dart::compiler::target::word Thread_random_offset = 808;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 808;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 816;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -7010,7 +7087,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -7018,9 +7096,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -7044,7 +7122,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -7055,13 +7133,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1744;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1768;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1712;
+    Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1752;
+    Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -7077,7 +7155,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -7099,14 +7177,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -7148,11 +7226,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1648;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1656;
+    Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -7173,7 +7251,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1592;
+    Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -7181,7 +7259,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -7197,13 +7281,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word Thread_random_offset = 1720;
+    Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1728;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1752;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -7624,7 +7708,8 @@
     SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -7632,9 +7717,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
+    1584;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1568;
+    1592;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -7658,7 +7743,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -7669,13 +7754,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1680;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1704;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1688;
+    Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -7691,7 +7776,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1624;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -7713,14 +7798,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1600;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -7762,11 +7847,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1632;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -7787,7 +7872,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1528;
+    Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -7795,7 +7880,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -7811,13 +7902,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word Thread_random_offset = 1656;
+    Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1664;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1688;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -8237,7 +8328,8 @@
     SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -8245,9 +8337,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -8271,7 +8363,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -8282,13 +8374,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1744;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1768;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1712;
+    Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1752;
+    Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -8304,7 +8396,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -8326,14 +8418,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -8375,11 +8467,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1648;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1672;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1656;
+    Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -8400,7 +8492,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1592;
+    Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -8408,7 +8500,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -8424,13 +8522,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word Thread_random_offset = 1720;
+    Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1728;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1752;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -8850,7 +8948,8 @@
     SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     4;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 12;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 8;
 static constexpr dart::compiler::target::word
@@ -8858,9 +8957,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    820;
+    832;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    824;
+    836;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -8883,7 +8982,7 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 860;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 872;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
@@ -8894,13 +8993,13 @@
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 140;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 888;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 896;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 864;
+    Thread_double_truncate_round_supported_offset = 876;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 892;
+    Thread_service_extension_stream_offset = 900;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
@@ -8916,7 +9015,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    840;
+    852;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -8938,13 +9037,13 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    828;
+    840;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    856;
+    868;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 896;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 904;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -8986,11 +9085,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 832;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 844;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 836;
+    Thread_saved_shadow_call_stack_offset = 848;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    844;
+    856;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -9011,7 +9110,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     76;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 804;
+    Thread_suspend_state_await_entry_point_offset = 804;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 800;
 static constexpr dart::compiler::target::word
@@ -9019,7 +9118,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 812;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 816;
+    Thread_suspend_state_init_async_star_entry_point_offset = 816;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 820;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 824;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 828;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word Thread_top_offset = 48;
@@ -9034,13 +9139,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 848;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 860;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 852;
-static constexpr dart::compiler::target::word Thread_random_offset = 872;
+    Thread_callback_stack_return_offset = 864;
+static constexpr dart::compiler::target::word Thread_random_offset = 880;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 328;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 880;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 888;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -9461,7 +9566,8 @@
     SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word SuspendState_frame_size_offset =
     8;
-static constexpr dart::compiler::target::word SuspendState_future_offset = 24;
+static constexpr dart::compiler::target::word
+    SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word SuspendState_payload_offset = 48;
 static constexpr dart::compiler::target::word SuspendState_pc_offset = 16;
 static constexpr dart::compiler::target::word
@@ -9469,9 +9575,9 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1624;
+    1648;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -9495,7 +9601,7 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
@@ -9506,13 +9612,13 @@
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1760;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1704;
+    Thread_double_truncate_round_supported_offset = 1728;
 static constexpr dart::compiler::target::word
-    Thread_service_extension_stream_offset = 1744;
+    Thread_service_extension_stream_offset = 1768;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 432;
@@ -9528,7 +9634,7 @@
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1656;
+    1680;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -9550,14 +9656,14 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1632;
+    1656;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1688;
+    1712;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1752;
+    1776;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -9599,11 +9705,11 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1640;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1664;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1648;
+    Thread_saved_shadow_call_stack_offset = 1672;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -9624,7 +9730,7 @@
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     152;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_await_async_entry_point_offset = 1584;
+    Thread_suspend_state_await_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
     Thread_suspend_state_init_async_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
@@ -9632,7 +9738,13 @@
 static constexpr dart::compiler::target::word
     Thread_suspend_state_return_async_not_future_entry_point_offset = 1600;
 static constexpr dart::compiler::target::word
-    Thread_suspend_state_handle_exception_entry_point_offset = 1608;
+    Thread_suspend_state_init_async_star_entry_point_offset = 1608;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_yield_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_return_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    Thread_suspend_state_handle_exception_entry_point_offset = 1632;
 static constexpr dart::compiler::target::word
     Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word Thread_top_offset = 96;
@@ -9648,13 +9760,13 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1680;
-static constexpr dart::compiler::target::word Thread_random_offset = 1712;
+    Thread_callback_stack_return_offset = 1704;
+static constexpr dart::compiler::target::word Thread_random_offset = 1736;
 static constexpr dart::compiler::target::word
     Thread_jump_to_frame_entry_point_offset = 632;
-static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1720;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1744;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
     0;
 static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
@@ -10112,8 +10224,8 @@
     AOT_SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 4;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     24;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 8;
@@ -10122,9 +10234,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 780;
+    AOT_Thread_active_exception_offset = 792;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 784;
+    AOT_Thread_active_stacktrace_offset = 796;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -10148,7 +10260,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 200;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    820;
+    832;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -10161,13 +10273,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 140;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    848;
+    856;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 824;
+    AOT_Thread_double_truncate_round_supported_offset = 836;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 852;
+    AOT_Thread_service_extension_stream_offset = 860;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -10184,7 +10296,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 800;
+    AOT_Thread_execution_state_offset = 812;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -10206,14 +10318,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 788;
+    AOT_Thread_global_object_pool_offset = 800;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 816;
+    AOT_Thread_exit_through_ffi_offset = 828;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    856;
+    864;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -10257,11 +10369,11 @@
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 792;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 804;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 796;
+    AOT_Thread_saved_shadow_call_stack_offset = 808;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 804;
+    AOT_Thread_safepoint_state_offset = 816;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -10283,7 +10395,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 76;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 764;
+    AOT_Thread_suspend_state_await_entry_point_offset = 764;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 760;
 static constexpr dart::compiler::target::word
@@ -10291,7 +10403,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 772;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 776;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 776;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 780;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 784;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 788;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 48;
@@ -10308,14 +10426,14 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    808;
+    820;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 812;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 832;
+    AOT_Thread_callback_stack_return_offset = 824;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 840;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    840;
+    848;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -10803,8 +10921,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -10813,9 +10931,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -10839,7 +10957,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -10852,13 +10970,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1688;
+    AOT_Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -10875,7 +10993,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -10897,14 +11015,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1600;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -10949,11 +11067,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -10975,7 +11093,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1528;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -10983,7 +11101,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -11000,14 +11124,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1656;
+    AOT_Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -11500,8 +11624,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -11510,9 +11634,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1624;
+    AOT_Thread_active_exception_offset = 1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1632;
+    AOT_Thread_active_stacktrace_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -11536,7 +11660,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -11549,13 +11673,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1744;
+    1768;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1712;
+    AOT_Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1752;
+    AOT_Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -11572,7 +11696,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1664;
+    AOT_Thread_execution_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -11594,14 +11718,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1640;
+    AOT_Thread_global_object_pool_offset = 1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1696;
+    AOT_Thread_exit_through_ffi_offset = 1720;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -11646,11 +11770,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1648;
+    1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1656;
+    AOT_Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1672;
+    AOT_Thread_safepoint_state_offset = 1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -11672,7 +11796,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1592;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -11680,7 +11804,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -11697,14 +11827,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1720;
+    AOT_Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1728;
+    1752;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -12194,8 +12324,8 @@
     AOT_SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     40;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -12204,9 +12334,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -12230,7 +12360,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -12243,13 +12373,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1688;
+    AOT_Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -12266,7 +12396,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -12288,14 +12418,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1600;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -12340,11 +12470,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -12366,7 +12496,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1528;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -12374,7 +12504,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -12391,14 +12527,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1656;
+    AOT_Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -12887,8 +13023,8 @@
     AOT_SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     40;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -12897,9 +13033,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1624;
+    AOT_Thread_active_exception_offset = 1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1632;
+    AOT_Thread_active_stacktrace_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -12923,7 +13059,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -12936,13 +13072,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1744;
+    1768;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1712;
+    AOT_Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1752;
+    AOT_Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -12959,7 +13095,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1664;
+    AOT_Thread_execution_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -12981,14 +13117,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1640;
+    AOT_Thread_global_object_pool_offset = 1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1696;
+    AOT_Thread_exit_through_ffi_offset = 1720;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -13033,11 +13169,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1648;
+    1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1656;
+    AOT_Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1672;
+    AOT_Thread_safepoint_state_offset = 1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -13059,7 +13195,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1592;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -13067,7 +13203,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -13084,14 +13226,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1720;
+    AOT_Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1728;
+    1752;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -13581,8 +13723,8 @@
     AOT_SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 4;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     24;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 8;
@@ -13591,9 +13733,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 820;
+    AOT_Thread_active_exception_offset = 832;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 824;
+    AOT_Thread_active_stacktrace_offset = 836;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -13617,7 +13759,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 200;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    860;
+    872;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -13630,13 +13772,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 140;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    888;
+    896;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 864;
+    AOT_Thread_double_truncate_round_supported_offset = 876;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 892;
+    AOT_Thread_service_extension_stream_offset = 900;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -13653,7 +13795,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 840;
+    AOT_Thread_execution_state_offset = 852;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -13675,14 +13817,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 828;
+    AOT_Thread_global_object_pool_offset = 840;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 856;
+    AOT_Thread_exit_through_ffi_offset = 868;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    896;
+    904;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -13726,11 +13868,11 @@
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 832;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 844;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 836;
+    AOT_Thread_saved_shadow_call_stack_offset = 848;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 844;
+    AOT_Thread_safepoint_state_offset = 856;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -13752,7 +13894,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 76;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 804;
+    AOT_Thread_suspend_state_await_entry_point_offset = 804;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 800;
 static constexpr dart::compiler::target::word
@@ -13760,7 +13902,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 812;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 816;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 816;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 820;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 824;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 828;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 48;
@@ -13777,14 +13925,14 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    848;
+    860;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 852;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 872;
+    AOT_Thread_callback_stack_return_offset = 864;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 880;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    880;
+    888;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -14274,8 +14422,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -14284,9 +14432,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1616;
+    AOT_Thread_active_exception_offset = 1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1624;
+    AOT_Thread_active_stacktrace_offset = 1648;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -14310,7 +14458,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -14323,13 +14471,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1736;
+    1760;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1704;
+    AOT_Thread_double_truncate_round_supported_offset = 1728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1744;
+    AOT_Thread_service_extension_stream_offset = 1768;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -14346,7 +14494,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1656;
+    AOT_Thread_execution_state_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -14368,14 +14516,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1632;
+    AOT_Thread_global_object_pool_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1688;
+    AOT_Thread_exit_through_ffi_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1752;
+    1776;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -14420,11 +14568,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1648;
+    AOT_Thread_saved_shadow_call_stack_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1664;
+    AOT_Thread_safepoint_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -14446,7 +14594,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1584;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
@@ -14454,7 +14602,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1608;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1608;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -14471,14 +14625,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1680;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1712;
+    AOT_Thread_callback_stack_return_offset = 1704;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1736;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1720;
+    1744;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -14963,8 +15117,8 @@
     AOT_SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 4;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     24;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 8;
@@ -14973,9 +15127,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 780;
+    AOT_Thread_active_exception_offset = 792;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 784;
+    AOT_Thread_active_stacktrace_offset = 796;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -14999,7 +15153,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 200;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    820;
+    832;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -15012,13 +15166,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 140;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    848;
+    856;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 824;
+    AOT_Thread_double_truncate_round_supported_offset = 836;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 852;
+    AOT_Thread_service_extension_stream_offset = 860;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -15035,7 +15189,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 800;
+    AOT_Thread_execution_state_offset = 812;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -15057,14 +15211,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 788;
+    AOT_Thread_global_object_pool_offset = 800;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 816;
+    AOT_Thread_exit_through_ffi_offset = 828;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    856;
+    864;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -15108,11 +15262,11 @@
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 792;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 804;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 796;
+    AOT_Thread_saved_shadow_call_stack_offset = 808;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 804;
+    AOT_Thread_safepoint_state_offset = 816;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -15134,7 +15288,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 76;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 764;
+    AOT_Thread_suspend_state_await_entry_point_offset = 764;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 760;
 static constexpr dart::compiler::target::word
@@ -15142,7 +15296,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 772;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 776;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 776;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 780;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 784;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 788;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 48;
@@ -15159,14 +15319,14 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    808;
+    820;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 812;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 832;
+    AOT_Thread_callback_stack_return_offset = 824;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 840;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    840;
+    848;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -15647,8 +15807,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -15657,9 +15817,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -15683,7 +15843,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -15696,13 +15856,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1688;
+    AOT_Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -15719,7 +15879,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -15741,14 +15901,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1600;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -15793,11 +15953,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -15819,7 +15979,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1528;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -15827,7 +15987,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -15844,14 +16010,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1656;
+    AOT_Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -16337,8 +16503,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -16347,9 +16513,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1624;
+    AOT_Thread_active_exception_offset = 1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1632;
+    AOT_Thread_active_stacktrace_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -16373,7 +16539,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -16386,13 +16552,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1744;
+    1768;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1712;
+    AOT_Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1752;
+    AOT_Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -16409,7 +16575,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1664;
+    AOT_Thread_execution_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -16431,14 +16597,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1640;
+    AOT_Thread_global_object_pool_offset = 1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1696;
+    AOT_Thread_exit_through_ffi_offset = 1720;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -16483,11 +16649,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1648;
+    1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1656;
+    AOT_Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1672;
+    AOT_Thread_safepoint_state_offset = 1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -16509,7 +16675,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1592;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -16517,7 +16683,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -16534,14 +16706,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1720;
+    AOT_Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1728;
+    1752;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -17024,8 +17196,8 @@
     AOT_SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     40;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -17034,9 +17206,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -17060,7 +17232,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -17073,13 +17245,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1688;
+    AOT_Thread_service_extension_stream_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -17096,7 +17268,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -17118,14 +17290,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1600;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -17170,11 +17342,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -17196,7 +17368,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1528;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1528;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1520;
 static constexpr dart::compiler::target::word
@@ -17204,7 +17376,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1552;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1552;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1560;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1568;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -17221,14 +17399,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1656;
+    AOT_Thread_callback_stack_return_offset = 1648;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1664;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -17710,8 +17888,8 @@
     AOT_SuspendState_error_callback_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     40;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -17720,9 +17898,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1624;
+    AOT_Thread_active_exception_offset = 1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1632;
+    AOT_Thread_active_stacktrace_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -17746,7 +17924,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1704;
+    1728;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -17759,13 +17937,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1744;
+    1768;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1712;
+    AOT_Thread_double_truncate_round_supported_offset = 1736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1752;
+    AOT_Thread_service_extension_stream_offset = 1776;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -17782,7 +17960,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1664;
+    AOT_Thread_execution_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -17804,14 +17982,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1640;
+    AOT_Thread_global_object_pool_offset = 1664;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1696;
+    AOT_Thread_exit_through_ffi_offset = 1720;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1760;
+    1784;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -17856,11 +18034,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1648;
+    1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1656;
+    AOT_Thread_saved_shadow_call_stack_offset = 1680;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1672;
+    AOT_Thread_safepoint_state_offset = 1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -17882,7 +18060,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1592;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1592;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
@@ -17890,7 +18068,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1616;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1632;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1640;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -17907,14 +18091,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1680;
+    1704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1688;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1720;
+    AOT_Thread_callback_stack_return_offset = 1712;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1744;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1728;
+    1752;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -18397,8 +18581,8 @@
     AOT_SuspendState_error_callback_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 4;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 12;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     24;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 8;
@@ -18407,9 +18591,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 820;
+    AOT_Thread_active_exception_offset = 832;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 824;
+    AOT_Thread_active_stacktrace_offset = 836;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
@@ -18433,7 +18617,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 200;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    860;
+    872;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -18446,13 +18630,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 140;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    888;
+    896;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 864;
+    AOT_Thread_double_truncate_round_supported_offset = 876;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 892;
+    AOT_Thread_service_extension_stream_offset = 900;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -18469,7 +18653,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 840;
+    AOT_Thread_execution_state_offset = 852;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
@@ -18491,14 +18675,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 828;
+    AOT_Thread_global_object_pool_offset = 840;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 856;
+    AOT_Thread_exit_through_ffi_offset = 868;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    896;
+    904;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -18542,11 +18726,11 @@
     112;
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 348;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 832;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 844;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 836;
+    AOT_Thread_saved_shadow_call_stack_offset = 848;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 844;
+    AOT_Thread_safepoint_state_offset = 856;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 244;
 static constexpr dart::compiler::target::word
@@ -18568,7 +18752,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 76;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 804;
+    AOT_Thread_suspend_state_await_entry_point_offset = 804;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 800;
 static constexpr dart::compiler::target::word
@@ -18576,7 +18760,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 812;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 816;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 816;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 820;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 824;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 828;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 48;
@@ -18593,14 +18783,14 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    848;
+    860;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 852;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 872;
+    AOT_Thread_callback_stack_return_offset = 864;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 880;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 328;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    880;
+    888;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
@@ -19083,8 +19273,8 @@
     AOT_SuspendState_error_callback_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_SuspendState_frame_size_offset = 8;
-static constexpr dart::compiler::target::word AOT_SuspendState_future_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_SuspendState_function_data_offset = 24;
 static constexpr dart::compiler::target::word AOT_SuspendState_payload_offset =
     48;
 static constexpr dart::compiler::target::word AOT_SuspendState_pc_offset = 16;
@@ -19093,9 +19283,9 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1616;
+    AOT_Thread_active_exception_offset = 1640;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1624;
+    AOT_Thread_active_stacktrace_offset = 1648;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_entry_point_offset = 520;
 static constexpr dart::compiler::target::word
@@ -19119,7 +19309,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 376;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1696;
+    1720;
 static constexpr dart::compiler::target::word
     AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
@@ -19132,13 +19322,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 256;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1736;
+    1760;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1704;
+    AOT_Thread_double_truncate_round_supported_offset = 1728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_service_extension_stream_offset = 1744;
+    AOT_Thread_service_extension_stream_offset = 1768;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -19155,7 +19345,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1656;
+    AOT_Thread_execution_state_offset = 1680;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
@@ -19177,14 +19367,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1632;
+    AOT_Thread_global_object_pool_offset = 1656;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1688;
+    AOT_Thread_exit_through_ffi_offset = 1712;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1752;
+    1776;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -19229,11 +19419,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1640;
+    1664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1648;
+    AOT_Thread_saved_shadow_call_stack_offset = 1672;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1664;
+    AOT_Thread_safepoint_state_offset = 1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 464;
 static constexpr dart::compiler::target::word
@@ -19255,7 +19445,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_await_async_entry_point_offset = 1584;
+    AOT_Thread_suspend_state_await_entry_point_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_init_async_entry_point_offset = 1576;
 static constexpr dart::compiler::target::word
@@ -19263,7 +19453,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_suspend_state_return_async_not_future_entry_point_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1608;
+    AOT_Thread_suspend_state_init_async_star_entry_point_offset = 1608;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_yield_async_star_entry_point_offset = 1616;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_return_async_star_entry_point_offset = 1624;
+static constexpr dart::compiler::target::word
+    AOT_Thread_suspend_state_handle_exception_entry_point_offset = 1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_top_exit_frame_info_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_top_offset = 96;
@@ -19280,14 +19476,14 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1672;
+    1696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1680;
-static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1712;
+    AOT_Thread_callback_stack_return_offset = 1704;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1736;
 static constexpr dart::compiler::target::word
     AOT_Thread_jump_to_frame_entry_point_offset = 632;
 static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
-    1720;
+    1744;
 static constexpr dart::compiler::target::word
     AOT_TsanUtils_setjmp_function_offset = 0;
 static constexpr dart::compiler::target::word
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 8fa14a3..04aa47b 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -192,7 +192,7 @@
   FIELD(SubtypeTestCache, cache_offset)                                        \
   FIELD(SuspendState, error_callback_offset)                                   \
   FIELD(SuspendState, frame_size_offset)                                       \
-  FIELD(SuspendState, future_offset)                                           \
+  FIELD(SuspendState, function_data_offset)                                    \
   FIELD(SuspendState, payload_offset)                                          \
   FIELD(SuspendState, pc_offset)                                               \
   FIELD(SuspendState, then_callback_offset)                                    \
@@ -281,10 +281,13 @@
                                                                                \
   FIELD(Thread, stack_overflow_shared_without_fpu_regs_stub_offset)            \
   FIELD(Thread, store_buffer_block_offset)                                     \
-  FIELD(Thread, suspend_state_await_async_entry_point_offset)                  \
+  FIELD(Thread, suspend_state_await_entry_point_offset)                        \
   FIELD(Thread, suspend_state_init_async_entry_point_offset)                   \
   FIELD(Thread, suspend_state_return_async_entry_point_offset)                 \
   FIELD(Thread, suspend_state_return_async_not_future_entry_point_offset)      \
+  FIELD(Thread, suspend_state_init_async_star_entry_point_offset)              \
+  FIELD(Thread, suspend_state_yield_async_star_entry_point_offset)             \
+  FIELD(Thread, suspend_state_return_async_star_entry_point_offset)            \
   FIELD(Thread, suspend_state_handle_exception_entry_point_offset)             \
   FIELD(Thread, top_exit_frame_info_offset)                                    \
   FIELD(Thread, top_offset)                                                    \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 1049101..fd5b486 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -112,8 +112,8 @@
 void StubCodeCompiler::GenerateInitInstanceFieldStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for result.
-  __ PushRegister(InitInstanceFieldABI::kInstanceReg);
-  __ PushRegister(InitInstanceFieldABI::kFieldReg);
+  __ PushRegistersInOrder(
+      {InitInstanceFieldABI::kInstanceReg, InitInstanceFieldABI::kFieldReg});
   __ CallRuntime(kInitInstanceFieldRuntimeEntry, /*argument_count=*/2);
   __ Drop(2);
   __ PopRegister(InitInstanceFieldABI::kResultReg);
@@ -130,11 +130,9 @@
   const Register kScratchReg = InitLateInstanceFieldInternalRegs::kScratchReg;
 
   __ EnterStubFrame();
-  // Save for later.
-  __ PushRegisterPair(kInstanceReg, kFieldReg);
-
+  // Save kFieldReg and kInstanceReg for later.
   // Call initializer function.
-  __ PushRegister(kInstanceReg);
+  __ PushRegistersInOrder({kFieldReg, kInstanceReg, kInstanceReg});
 
   static_assert(
       InitInstanceFieldABI::kResultReg == CallingConventions::kReturnReg,
@@ -219,8 +217,8 @@
 void StubCodeCompiler::GenerateReThrowStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for (unused) result.
-  __ PushRegister(ReThrowABI::kExceptionReg);
-  __ PushRegister(ReThrowABI::kStackTraceReg);
+  __ PushRegistersInOrder(
+      {ReThrowABI::kExceptionReg, ReThrowABI::kStackTraceReg});
   __ CallRuntime(kReThrowRuntimeEntry, /*argument_count=*/2);
   __ Breakpoint();
 }
@@ -235,11 +233,11 @@
 
 void StubCodeCompiler::GenerateAssertSubtypeStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
-  __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
-  __ PushRegister(AssertSubtypeABI::kSubTypeReg);
-  __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
-  __ PushRegister(AssertSubtypeABI::kDstNameReg);
+  __ PushRegistersInOrder({AssertSubtypeABI::kInstantiatorTypeArgumentsReg,
+                           AssertSubtypeABI::kFunctionTypeArgumentsReg,
+                           AssertSubtypeABI::kSubTypeReg,
+                           AssertSubtypeABI::kSuperTypeReg,
+                           AssertSubtypeABI::kDstNameReg});
   __ CallRuntime(kSubtypeCheckRuntimeEntry, /*argument_count=*/5);
   __ Drop(5);  // Drop unused result as well as arguments.
   __ LeaveStubFrame();
@@ -261,8 +259,8 @@
       target::kWordSize * AssertAssignableStubABI::kInstantiatorTAVSlotFromFp));
   __ pushl(Address(EBP, target::kWordSize *
                             AssertAssignableStubABI::kFunctionTAVSlotFromFp));
-  __ PushRegister(AssertAssignableStubABI::kDstNameReg);
-  __ PushRegister(AssertAssignableStubABI::kSubtypeTestReg);
+  __ PushRegistersInOrder({AssertAssignableStubABI::kDstNameReg,
+                           AssertAssignableStubABI::kSubtypeTestReg});
   __ PushObject(Smi::ZoneHandle(Smi::New(kTypeCheckFromInline)));
   __ CallRuntime(kTypeCheckRuntimeEntry, /*argument_count=*/7);
   __ Drop(8);
@@ -274,9 +272,9 @@
 static void BuildInstantiateTypeRuntimeCall(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(Object::null_object());
-  __ PushRegister(InstantiateTypeABI::kTypeReg);
-  __ PushRegister(InstantiateTypeABI::kInstantiatorTypeArgumentsReg);
-  __ PushRegister(InstantiateTypeABI::kFunctionTypeArgumentsReg);
+  __ PushRegistersInOrder({InstantiateTypeABI::kTypeReg,
+                           InstantiateTypeABI::kInstantiatorTypeArgumentsReg,
+                           InstantiateTypeABI::kFunctionTypeArgumentsReg});
   __ CallRuntime(kInstantiateTypeRuntimeEntry, /*argument_count=*/3);
   __ Drop(3);
   __ PopRegister(InstantiateTypeABI::kResultTypeReg);
@@ -416,11 +414,10 @@
 void StubCodeCompiler::GenerateInstanceOfStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for the result.
-  __ PushRegister(TypeTestABI::kInstanceReg);
-  __ PushRegister(TypeTestABI::kDstTypeReg);
-  __ PushRegister(TypeTestABI::kInstantiatorTypeArgumentsReg);
-  __ PushRegister(TypeTestABI::kFunctionTypeArgumentsReg);
-  __ PushRegister(TypeTestABI::kSubtypeTestCacheReg);
+  __ PushRegistersInOrder({TypeTestABI::kInstanceReg, TypeTestABI::kDstTypeReg,
+                           TypeTestABI::kInstantiatorTypeArgumentsReg,
+                           TypeTestABI::kFunctionTypeArgumentsReg,
+                           TypeTestABI::kSubtypeTestCacheReg});
   __ CallRuntime(kInstanceofRuntimeEntry, /*argument_count=*/5);
   __ Drop(5);
   __ PopRegister(TypeTestABI::kInstanceOfResultReg);
@@ -816,10 +813,9 @@
 static void InvokeTypeCheckFromTypeTestStub(Assembler* assembler,
                                             TypeCheckMode mode) {
   __ PushObject(NullObject());  // Make room for result.
-  __ PushRegister(TypeTestABI::kInstanceReg);
-  __ PushRegister(TypeTestABI::kDstTypeReg);
-  __ PushRegister(TypeTestABI::kInstantiatorTypeArgumentsReg);
-  __ PushRegister(TypeTestABI::kFunctionTypeArgumentsReg);
+  __ PushRegistersInOrder({TypeTestABI::kInstanceReg, TypeTestABI::kDstTypeReg,
+                           TypeTestABI::kInstantiatorTypeArgumentsReg,
+                           TypeTestABI::kFunctionTypeArgumentsReg});
   __ PushObject(NullObject());
   __ PushRegister(TypeTestABI::kSubtypeTestCacheReg);
   __ PushImmediate(target::ToRawSmi(mode));
@@ -1015,8 +1011,8 @@
   __ Comment("Closure allocation via runtime");
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Space on the stack for the return value.
-  __ PushRegister(AllocateClosureABI::kFunctionReg);
-  __ PushRegister(AllocateClosureABI::kContextReg);
+  __ PushRegistersInOrder(
+      {AllocateClosureABI::kFunctionReg, AllocateClosureABI::kContextReg});
   __ CallRuntime(kAllocateClosureRuntimeEntry, 2);
   __ PopRegister(AllocateClosureABI::kContextReg);
   __ PopRegister(AllocateClosureABI::kFunctionReg);
@@ -1287,7 +1283,7 @@
   const Register kTemp = SuspendStubABI::kTempReg;
   const Register kFrameSize = SuspendStubABI::kFrameSizeReg;
   const Register kSuspendState = SuspendStubABI::kSuspendStateReg;
-  const Register kFuture = SuspendStubABI::kFutureReg;
+  const Register kFunctionData = SuspendStubABI::kFunctionDataReg;
   const Register kSrcFrame = SuspendStubABI::kSrcFrameReg;
   const Register kDstFrame = SuspendStubABI::kDstFrameReg;
   Label alloc_slow_case, alloc_done, init_done, old_gen_object, call_await;
@@ -1308,7 +1304,7 @@
   __ CompareClassId(kSuspendState, kSuspendStateCid, kTemp);
   __ BranchIf(EQUAL, &init_done);
 
-  __ MoveRegister(kFuture, kSuspendState);
+  __ MoveRegister(kFunctionData, kSuspendState);
   __ Comment("Allocate SuspendState");
 
   // Check for allocation tracing.
@@ -1361,8 +1357,8 @@
       FieldAddress(kSuspendState, target::SuspendState::frame_size_offset()));
   __ StoreCompressedIntoObjectNoBarrier(
       kSuspendState,
-      FieldAddress(kSuspendState, target::SuspendState::future_offset()),
-      kFuture);
+      FieldAddress(kSuspendState, target::SuspendState::function_data_offset()),
+      kFunctionData);
 
   {
 #if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_RISCV32) ||              \
@@ -1444,8 +1440,7 @@
 #endif
 
   // Push arguments for _SuspendState._await* method.
-  __ PushRegister(kSuspendState);
-  __ PushRegister(kArgument);
+  __ PushRegistersInOrder({kSuspendState, kArgument});
 
   // Write barrier.
   __ BranchIfBit(kSuspendState, target::ObjectAlignment::kNewObjectBitPosition,
@@ -1470,12 +1465,12 @@
 #endif
   __ Bind(&alloc_slow_case);
   __ Comment("SuspendState Allocation slow case");
-  __ PushRegister(kArgument);   // Save argument.
-  __ PushRegister(kFrameSize);  // Save frame size.
+  // Save argument and frame size.
+  __ PushRegistersInOrder({kArgument, kFrameSize});
   __ PushObject(NullObject());  // Make space on stack for the return value.
   __ SmiTag(kFrameSize);
-  __ PushRegister(kFrameSize);  // Pass frame size to runtime entry.
-  __ PushRegister(kFuture);     // Pass future.
+  // Pass frame size and function data to runtime entry.
+  __ PushRegistersInOrder({kFrameSize, kFunctionData});
   __ CallRuntime(kAllocateSuspendStateRuntimeEntry, 2);
   __ Drop(2);                     // Drop arguments
   __ PopRegister(kSuspendState);  // Get result.
@@ -1502,10 +1497,15 @@
   __ Jump(&call_await);
 }
 
-void StubCodeCompiler::GenerateAwaitAsyncStub(Assembler* assembler) {
+void StubCodeCompiler::GenerateAwaitStub(Assembler* assembler) {
+  GenerateSuspendStub(assembler,
+                      target::Thread::suspend_state_await_entry_point_offset());
+}
+
+void StubCodeCompiler::GenerateYieldAsyncStarStub(Assembler* assembler) {
   GenerateSuspendStub(
       assembler,
-      target::Thread::suspend_state_await_async_entry_point_offset());
+      target::Thread::suspend_state_yield_async_star_entry_point_offset());
 }
 
 void StubCodeCompiler::GenerateInitSuspendableFunctionStub(
@@ -1531,6 +1531,12 @@
       assembler, target::Thread::suspend_state_init_async_entry_point_offset());
 }
 
+void StubCodeCompiler::GenerateInitAsyncStarStub(Assembler* assembler) {
+  GenerateInitSuspendableFunctionStub(
+      assembler,
+      target::Thread::suspend_state_init_async_star_entry_point_offset());
+}
+
 void StubCodeCompiler::GenerateResumeStub(Assembler* assembler) {
   const Register kSuspendState = ResumeStubABI::kSuspendStateReg;
   const Register kTemp = ResumeStubABI::kTempReg;
@@ -1636,8 +1642,7 @@
 #endif
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for (unused) result.
-  __ PushRegister(kException);
-  __ PushRegister(kStackTrace);
+  __ PushRegistersInOrder({kException, kStackTrace});
   __ CallRuntime(kReThrowRuntimeEntry, /*argument_count=*/2);
   __ Breakpoint();
 }
@@ -1654,8 +1659,7 @@
   __ LeaveDartFrame();
 
   __ EnterStubFrame();
-  __ PushRegister(kSuspendState);
-  __ PushRegister(CallingConventions::kReturnReg);
+  __ PushRegistersInOrder({kSuspendState, CallingConventions::kReturnReg});
   __ Call(Address(THR, return_entry_point_offset));
   __ LeaveStubFrame();
   __ Ret();
@@ -1674,6 +1678,12 @@
           suspend_state_return_async_not_future_entry_point_offset());
 }
 
+void StubCodeCompiler::GenerateReturnAsyncStarStub(Assembler* assembler) {
+  GenerateReturnStub(
+      assembler,
+      target::Thread::suspend_state_return_async_star_entry_point_offset());
+}
+
 void StubCodeCompiler::GenerateAsyncExceptionHandlerStub(Assembler* assembler) {
   const Register kSuspendState = AsyncExceptionHandlerStubABI::kSuspendStateReg;
   ASSERT(kSuspendState != kExceptionObjectReg);
@@ -1694,9 +1704,8 @@
 
   __ LeaveDartFrame();
   __ EnterStubFrame();
-  __ PushRegister(kSuspendState);
-  __ PushRegister(kExceptionObjectReg);
-  __ PushRegister(kStackTraceObjectReg);
+  __ PushRegistersInOrder(
+      {kSuspendState, kExceptionObjectReg, kStackTraceObjectReg});
   __ Call(Address(
       THR,
       target::Thread::suspend_state_handle_exception_entry_point_offset()));
@@ -1712,8 +1721,7 @@
   __ LeaveDartFrame();
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for (unused) result.
-  __ PushRegister(kExceptionObjectReg);
-  __ PushRegister(kStackTraceObjectReg);
+  __ PushRegistersInOrder({kExceptionObjectReg, kStackTraceObjectReg});
   __ CallRuntime(kReThrowRuntimeEntry, /*argument_count=*/2);
   __ Breakpoint();
 }
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 177186a..c252342 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -507,8 +507,8 @@
                                           bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     ASSERT(!GenericCheckBoundInstr::UseUnboxedRepresentation());
-    __ PushRegister(RangeErrorABI::kLengthReg);
-    __ PushRegister(RangeErrorABI::kIndexReg);
+    __ PushRegistersInOrder(
+        {RangeErrorABI::kLengthReg, RangeErrorABI::kIndexReg});
     __ CallRuntime(kRangeErrorRuntimeEntry, /*argument_count=*/2);
     __ Breakpoint();
   };
@@ -1849,11 +1849,10 @@
 
   __ LoadObject(AllocateObjectABI::kResultReg, NullObject());
 
-  // Pushes result slot, then parameter class.
-  __ PushRegisterPair(kClsReg, AllocateObjectABI::kResultReg);
-
-  // Should be Object::null() if class is non-parameterized.
-  __ Push(AllocateObjectABI::kTypeArgumentsReg);
+  // Pushes result slot, then parameter class and type arguments.
+  // Type arguments should be Object::null() if class is non-parameterized.
+  __ PushRegistersInOrder({AllocateObjectABI::kResultReg, kClsReg,
+                           AllocateObjectABI::kTypeArgumentsReg});
 
   __ CallRuntime(kAllocateObjectRuntimeEntry, 2);
 
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index a3cb533..0779276 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -723,8 +723,8 @@
       __ Bind(&length);
       __ SmiTag(RangeErrorABI::kLengthReg);
     }
-    __ PushRegister(RangeErrorABI::kLengthReg);
-    __ PushRegister(RangeErrorABI::kIndexReg);
+    __ PushRegistersInOrder(
+        {RangeErrorABI::kLengthReg, RangeErrorABI::kIndexReg});
     __ CallRuntime(kRangeErrorRuntimeEntry, /*argument_count=*/2);
     __ Breakpoint();
   };
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index 55fc441..9fcc71b 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -440,8 +440,7 @@
   __ Bind(&no_type_args);
 
   // Push type arguments & extracted method.
-  __ PushRegister(T3);
-  __ PushRegister(T1);
+  __ PushRegistersInOrder({T3, T1});
 
   // Allocate context.
   {
@@ -563,8 +562,8 @@
       __ SmiTag(RangeErrorABI::kLengthReg);
     }
 #endif  // XLEN != 32
-    __ PushRegister(RangeErrorABI::kLengthReg);
-    __ PushRegister(RangeErrorABI::kIndexReg);
+    __ PushRegistersInOrder(
+        {RangeErrorABI::kLengthReg, RangeErrorABI::kIndexReg});
     __ CallRuntime(kRangeErrorRuntimeEntry, /*argument_count=*/2);
     __ Breakpoint();
   };
@@ -732,8 +731,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   // Setup space on stack for return value and preserve arguments descriptor.
-  __ PushRegister(S4);
-  __ PushRegister(ZR);
+  __ PushRegistersInOrder({S4, ZR});
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
   __ PopRegister(CODE_REG);
@@ -753,9 +751,9 @@
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
-  __ PushRegister(ZR);  // Result slot.
-  __ PushRegister(A0);  // Preserve receiver.
-  __ PushRegister(S5);  // Old cache value (also 2nd return value).
+  // Setup result slot, preserve receiver and
+  // push old cache value (also 2nd return value).
+  __ PushRegistersInOrder({ZR, A0, S5});
   __ CallRuntime(kFixCallersTargetMonomorphicRuntimeEntry, 2);
   __ PopRegister(S5);        // Get target cache object.
   __ PopRegister(A0);        // Restore receiver.
@@ -928,8 +926,9 @@
   if (kind == kLazyDeoptFromReturn) {
     __ PushRegister(T1);  // Preserve result as first local.
   } else if (kind == kLazyDeoptFromThrow) {
-    __ PushRegister(T1);  // Preserve exception as first local.
-    __ PushRegister(T2);  // Preserve stacktrace as second local.
+    // Preserve exception as first local.
+    // Preserve stacktrace as second local.
+    __ PushRegistersInOrder({T1, T2});
   }
   {
     __ mv(A0, FP);  // Pass last FP as parameter in R0.
@@ -963,8 +962,9 @@
   if (kind == kLazyDeoptFromReturn) {
     __ PushRegister(T1);  // Preserve result, it will be GC-d here.
   } else if (kind == kLazyDeoptFromThrow) {
-    __ PushRegister(T1);  // Preserve exception, it will be GC-d here.
-    __ PushRegister(T2);  // Preserve stacktrace, it will be GC-d here.
+    // Preserve exception, it will be GC-d here.
+    // Preserve stacktrace, it will be GC-d here.
+    __ PushRegistersInOrder({T1, T2});
   }
 
   __ PushRegister(ZR);  // Space for the result.
@@ -1035,10 +1035,9 @@
   __ add(TMP, TMP, FP);
   __ LoadFromOffset(A0, TMP,
                     target::frame_layout.param_end_from_fp * target::kWordSize);
-  __ PushRegister(ZR);  // Result slot.
-  __ PushRegister(A0);  // Receiver.
-  __ PushRegister(S5);  // ICData/MegamorphicCache.
-  __ PushRegister(S4);  // Arguments descriptor.
+  // Push: result slot, receiver, ICData/MegamorphicCache,
+  // arguments descriptor.
+  __ PushRegistersInOrder({ZR, A0, S5, S4});
 
   // Adjust arguments count.
   __ LoadCompressedSmiFieldFromOffset(
@@ -2069,10 +2068,8 @@
   // Load the function.
   __ LoadCompressedFieldFromOffset(TMP, A0, target::Closure::function_offset());
 
-  __ PushRegister(ZR);   // Result slot.
-  __ PushRegister(A0);   // Receiver.
-  __ PushRegister(TMP);  // Function
-  __ PushRegister(S4);   // Arguments descriptor.
+  // Push result slot, receiver, function, arguments descriptor.
+  __ PushRegistersInOrder({ZR, A0, TMP, S4});
 
   // Adjust arguments count.
   __ LoadCompressedSmiFieldFromOffset(
@@ -2382,8 +2379,7 @@
   __ EnterStubFrame();
   // Preserve IC data object and arguments descriptor array and
   // setup space on stack for result (target code object).
-  __ PushRegister(ARGS_DESC_REG);  // Preserve arguments descriptor array.
-  __ PushRegister(IC_DATA_REG);    // Preserve IC Data.
+  __ PushRegistersInOrder({ARGS_DESC_REG, IC_DATA_REG});
   if (save_entry_point) {
     __ SmiTag(T6);
     __ PushRegister(T6);
@@ -2667,8 +2663,8 @@
 void StubCodeCompiler::GenerateLazyCompileStub(Assembler* assembler) {
   // Preserve arg desc.
   __ EnterStubFrame();
-  __ PushRegister(ARGS_DESC_REG);  // Save arg. desc.
-  __ PushRegister(T0);             // Pass function.
+  // Save arguments descriptor and pass function.
+  __ PushRegistersInOrder({ARGS_DESC_REG, T0});
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ PopRegister(T0);             // Restore argument.
   __ PopRegister(ARGS_DESC_REG);  // Restore arg desc.
@@ -3371,11 +3367,9 @@
   __ lx(CODE_REG,
         Address(THR, target::Thread::switchable_call_miss_stub_offset()));
   __ EnterStubFrame();
-  __ PushRegister(A0);  // Preserve receiver.
-
-  __ PushRegister(ZR);  // Result slot.
-  __ PushRegister(ZR);  // Arg0: stub out.
-  __ PushRegister(A0);  // Arg1: Receiver
+  // Preserve receiver, setup result slot,
+  // pass Arg0: stub out and Arg1: Receiver.
+  __ PushRegistersInOrder({A0, ZR, ZR, A0});
   __ CallRuntime(kSwitchableCallMissRuntimeEntry, 2);
   __ Drop(1);
   __ PopRegister(CODE_REG);     // result = stub
@@ -3409,11 +3403,9 @@
 
   __ Bind(&miss);
   __ EnterStubFrame();
-  __ PushRegister(A0);  // Preserve receiver.
-
-  __ PushRegister(ZR);  // Result slot.
-  __ PushRegister(ZR);  // Arg0: Stub out.
-  __ PushRegister(A0);  // Arg1: Receiver
+  // Preserve receiver, setup result slot,
+  // pass Arg0: Stub out and Arg1: Receiver.
+  __ PushRegistersInOrder({A0, ZR, ZR, A0});
   __ CallRuntime(kSwitchableCallMissRuntimeEntry, 2);
   __ Drop(1);
   __ PopRegister(CODE_REG);  // result = stub
@@ -3471,10 +3463,10 @@
   // A runtime call to instantiate the type arguments is required.
   __ Bind(&call_runtime);
   __ EnterStubFrame();
-  __ PushRegisterPair(InstantiationABI::kUninstantiatedTypeArgumentsReg,
-                      NULL_REG);
-  __ PushRegisterPair(InstantiationABI::kFunctionTypeArgumentsReg,
-                      InstantiationABI::kInstantiatorTypeArgumentsReg);
+  __ PushRegistersInOrder({NULL_REG,
+                           InstantiationABI::kUninstantiatedTypeArgumentsReg,
+                           InstantiationABI::kInstantiatorTypeArgumentsReg,
+                           InstantiationABI::kFunctionTypeArgumentsReg});
   __ CallRuntime(kInstantiateTypeArgumentsRuntimeEntry, 3);
   __ Drop(3);  // Drop 2 type vectors, and uninstantiated type.
   __ PopRegister(InstantiationABI::kResultTypeArgumentsReg);
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 0dc8e25..ebbf71e 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -657,8 +657,8 @@
       __ Bind(&length);
       __ SmiTag(RangeErrorABI::kLengthReg);
     }
-    __ PushRegister(RangeErrorABI::kLengthReg);
-    __ PushRegister(RangeErrorABI::kIndexReg);
+    __ PushRegistersInOrder(
+        {RangeErrorABI::kLengthReg, RangeErrorABI::kIndexReg});
     __ CallRuntime(kRangeErrorRuntimeEntry, /*argument_count=*/2);
     __ Breakpoint();
   };
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 722f126..b63efec 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -532,18 +532,18 @@
   static const Register kResultReg = R0;
 };
 
-// ABI for SuspendStub (AwaitAsyncStub).
+// ABI for SuspendStub (AwaitStub, YieldAsyncStarStub).
 struct SuspendStubABI {
   static const Register kArgumentReg = R0;
   static const Register kTempReg = R1;
   static const Register kFrameSizeReg = R2;
   static const Register kSuspendStateReg = R3;
-  static const Register kFutureReg = R4;
+  static const Register kFunctionDataReg = R4;
   static const Register kSrcFrameReg = R8;
   static const Register kDstFrameReg = R9;
 };
 
-// ABI for InitSuspendableFunctionStub (InitAsyncStub).
+// ABI for InitSuspendableFunctionStub (InitAsyncStub, InitAsyncStarStub).
 struct InitSuspendableFunctionStubABI {
   static const Register kTypeArgsReg = R0;
 };
@@ -563,7 +563,8 @@
   static const Register kStackTraceReg = R4;
 };
 
-// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub).
+// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub,
+// ReturnAsyncStarStub).
 struct ReturnStubABI {
   static const Register kSuspendStateReg = R2;
 };
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index da0c132..8ec2b3e 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -366,18 +366,18 @@
   static const Register kResultReg = R0;
 };
 
-// ABI for SuspendStub (AwaitAsyncStub).
+// ABI for SuspendStub (AwaitStub, YieldAsyncStarStub).
 struct SuspendStubABI {
   static const Register kArgumentReg = R0;
   static const Register kTempReg = R1;
   static const Register kFrameSizeReg = R2;
   static const Register kSuspendStateReg = R3;
-  static const Register kFutureReg = R4;
+  static const Register kFunctionDataReg = R4;
   static const Register kSrcFrameReg = R5;
   static const Register kDstFrameReg = R6;
 };
 
-// ABI for InitSuspendableFunctionStub (InitAsyncStub).
+// ABI for InitSuspendableFunctionStub (InitAsyncStub, InitAsyncStarStub).
 struct InitSuspendableFunctionStubABI {
   static const Register kTypeArgsReg = R0;
 };
@@ -397,7 +397,8 @@
   static const Register kStackTraceReg = R4;
 };
 
-// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub).
+// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub,
+// ReturnAsyncStarStub).
 struct ReturnStubABI {
   static const Register kSuspendStateReg = R2;
 };
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 2fa9890..1169aa4 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -260,16 +260,16 @@
   static const Register kResultReg = EAX;
 };
 
-// ABI for SuspendStub (AwaitAsyncStub).
+// ABI for SuspendStub (AwaitStub, YieldAsyncStarStub).
 struct SuspendStubABI {
   static const Register kArgumentReg = EAX;
   static const Register kTempReg = EDX;
   static const Register kFrameSizeReg = ECX;
   static const Register kSuspendStateReg = EBX;
-  static const Register kFutureReg = EDI;
+  static const Register kFunctionDataReg = EDI;
   // Can reuse THR.
   static const Register kSrcFrameReg = ESI;
-  // Can reuse kFutureReg.
+  // Can reuse kFunctionDataReg.
   static const Register kDstFrameReg = EDI;
 
   // Number of bytes to skip after
@@ -278,7 +278,7 @@
   static const intptr_t kResumePcDistance = 5;
 };
 
-// ABI for InitSuspendableFunctionStub (InitAsyncStub).
+// ABI for InitSuspendableFunctionStub (InitAsyncStub, InitAsyncStarStub).
 struct InitSuspendableFunctionStubABI {
   static const Register kTypeArgsReg = EAX;
 };
@@ -298,7 +298,8 @@
   static const Register kStackTraceReg = EDI;
 };
 
-// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub).
+// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub,
+// ReturnAsyncStarStub).
 struct ReturnStubABI {
   static const Register kSuspendStateReg = EBX;
 };
diff --git a/runtime/vm/constants_riscv.h b/runtime/vm/constants_riscv.h
index 8d7a085..4fb57fc 100644
--- a/runtime/vm/constants_riscv.h
+++ b/runtime/vm/constants_riscv.h
@@ -378,18 +378,18 @@
   static constexpr Register kResultReg = A0;
 };
 
-// ABI for SuspendStub (AwaitAsyncStub).
+// ABI for SuspendStub (AwaitStub, YieldAsyncStarStub).
 struct SuspendStubABI {
   static const Register kArgumentReg = A0;
   static const Register kTempReg = T0;
   static const Register kFrameSizeReg = T1;
   static const Register kSuspendStateReg = T2;
-  static const Register kFutureReg = T3;
+  static const Register kFunctionDataReg = T3;
   static const Register kSrcFrameReg = T4;
   static const Register kDstFrameReg = T5;
 };
 
-// ABI for InitSuspendableFunctionStub (InitAsyncStub).
+// ABI for InitSuspendableFunctionStub (InitAsyncStub, InitAsyncStarStub).
 struct InitSuspendableFunctionStubABI {
   static const Register kTypeArgsReg = A0;
 };
@@ -409,7 +409,8 @@
   static const Register kStackTraceReg = T4;
 };
 
-// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub).
+// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub,
+// ReturnAsyncStarStub).
 struct ReturnStubABI {
   static const Register kSuspendStateReg = T1;
 };
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 1f22126..51828ea 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -335,13 +335,13 @@
   static const Register kResultReg = RAX;
 };
 
-// ABI for SuspendStub (AwaitAsyncStub).
+// ABI for SuspendStub (AwaitStub, YieldAsyncStarStub).
 struct SuspendStubABI {
   static const Register kArgumentReg = RAX;
   static const Register kTempReg = RDX;
   static const Register kFrameSizeReg = RCX;
   static const Register kSuspendStateReg = RBX;
-  static const Register kFutureReg = R8;
+  static const Register kFunctionDataReg = R8;
   static const Register kSrcFrameReg = RSI;
   static const Register kDstFrameReg = RDI;
 
@@ -351,7 +351,7 @@
   static const intptr_t kResumePcDistance = 5;
 };
 
-// ABI for InitSuspendableFunctionStub (InitAsyncStub).
+// ABI for InitSuspendableFunctionStub (InitAsyncStub, InitAsyncStarStub).
 struct InitSuspendableFunctionStubABI {
   static const Register kTypeArgsReg = RAX;
 };
@@ -371,7 +371,8 @@
   static const Register kStackTraceReg = RDI;
 };
 
-// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub).
+// ABI for ReturnStub (ReturnAsyncStub, ReturnAsyncNotFutureStub,
+// ReturnAsyncStarStub).
 struct ReturnStubABI {
   static const Register kSuspendStateReg = RBX;
 };
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index d9b9ddf..bb496ef 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -56,8 +56,6 @@
   int value_;
 };
 
-const uint8_t kNativeYieldFlags = 0x2;
-
 enum LogicalOperator { kAnd, kOr };
 
 struct ProgramBinary {
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 6d7b33e..08d9da7 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -213,6 +213,12 @@
 };
 
 // Keep in sync with package:kernel/lib/ast.dart
+enum YieldStatementFlags {
+  kYieldStatementFlagYieldStar = 1 << 0,
+  kYieldStatementFlagNative = 1 << 1,
+};
+
+// Keep in sync with package:kernel/lib/ast.dart
 enum class NamedTypeFlags : uint8_t {
   kIsRequired = 1 << 0,
 };
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 3dcbc81..a9835fa 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1377,15 +1377,19 @@
 
   // Build implemented interface types
   intptr_t interface_count = helper_.ReadListLength();
-  const Array& interfaces =
-      Array::Handle(Z, Array::New(interface_count, Heap::kOld));
-  for (intptr_t i = 0; i < interface_count; i++) {
-    const AbstractType& type =
-        T.BuildTypeWithoutFinalization();  // read ith type.
-    interfaces.SetAt(i, type);
+  if (interface_count == 0) {
+    klass->set_interfaces(Object::empty_array());
+  } else {
+    const Array& interfaces =
+        Array::Handle(Z, Array::New(interface_count, Heap::kOld));
+    for (intptr_t i = 0; i < interface_count; i++) {
+      const AbstractType& type =
+          T.BuildTypeWithoutFinalization();  // read ith type.
+      interfaces.SetAt(i, type);
+    }
+    klass->set_interfaces(interfaces);
   }
   class_helper->SetJustRead(ClassHelper::kImplementedClasses);
-  klass->set_interfaces(interfaces);
 
   if (class_helper->is_abstract()) klass->set_is_abstract();
 
@@ -2039,6 +2043,16 @@
     function.set_is_inlinable(false);
     function.set_is_visible(true);
     ASSERT(function.IsCompactAsyncFunction());
+  } else if (function_node_helper.async_marker_ ==
+             FunctionNodeHelper::kAsyncStar) {
+    if (!FLAG_precompiled_mode) {
+      FATAL("Compact async* functions are only supported in AOT mode.");
+    }
+    function.set_modifier(UntaggedFunction::kAsyncGen);
+    function.set_is_debuggable(true);
+    function.set_is_inlinable(false);
+    function.set_is_visible(true);
+    ASSERT(function.IsCompactAsyncStarFunction());
   } else {
     ASSERT(function_node_helper.async_marker_ == FunctionNodeHelper::kSync);
     function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
@@ -2063,6 +2077,7 @@
         break;
     }
     ASSERT(!function.IsCompactAsyncFunction());
+    ASSERT(!function.IsCompactAsyncStarFunction());
   }
 
   if (!native_name.IsNull()) {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a9fffe2..da4f734 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -26036,7 +26036,7 @@
                     "symbolize stack traces in the precompiled runtime.");
 
 SuspendStatePtr SuspendState::New(intptr_t frame_size,
-                                  const Instance& future,
+                                  const Instance& function_data,
                                   Heap::Space space) {
   SuspendState& result = SuspendState::Handle();
   {
@@ -26047,7 +26047,7 @@
     result ^= raw;
     result.set_frame_size(frame_size);
     result.set_pc(0);
-    result.set_future(future);
+    result.set_function_data(function_data);
   }
   return result.ptr();
 }
@@ -26061,8 +26061,8 @@
   StoreNonPointer(&untag()->pc_, pc);
 }
 
-void SuspendState::set_future(const Instance& future) const {
-  untag()->set_future(future.ptr());
+void SuspendState::set_function_data(const Instance& function_data) const {
+  untag()->set_function_data(function_data.ptr());
 }
 
 const char* SuspendState::ToCString() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 0ea4197..b5eaa99 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3171,7 +3171,7 @@
   // Returns true if parameters of this function are copied into the frame
   // in the function prologue.
   bool MakesCopyOfParameters() const {
-    return HasOptionalParameters() || IsCompactAsyncFunction();
+    return HasOptionalParameters() || IsSuspendableFunction();
   }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -3570,12 +3570,25 @@
     return modifier() == UntaggedFunction::kAsync;
   }
 
-  // TODO(alexmarkov): replace this predicate with IsAsyncFunction() after
-  // old async functions are removed.
+  // TODO(dartbug.com/48378): replace this predicate with IsAsyncFunction()
+  // after old async functions are removed.
   bool IsCompactAsyncFunction() const {
     return IsAsyncFunction() && is_debuggable();
   }
 
+  // TODO(dartbug.com/48378): replace this predicate with IsAsyncGenerator()
+  // after old async* functions are removed.
+  bool IsCompactAsyncStarFunction() const {
+    return IsAsyncGenerator() && is_debuggable();
+  }
+
+  // Returns true for functions which execution can be suspended
+  // using Suspend/Resume stubs. Such functions have an artificial
+  // :suspend_state local variable at the fixed location of the frame.
+  bool IsSuspendableFunction() const {
+    return IsCompactAsyncFunction() || IsCompactAsyncStarFunction();
+  }
+
   // Recognise synthetic sync-yielding functions like the inner-most:
   //   user_func /* was async */ {
   //      :async_op(..) yielding {
@@ -9260,11 +9273,6 @@
     return raw_smi;
   }
 
-  static SmiPtr FromAlignedAddress(uword address) {
-    ASSERT((address & kSmiTagMask) == kSmiTag);
-    return static_cast<SmiPtr>(address);
-  }
-
   static ClassPtr Class();
 
   static intptr_t Value(const SmiPtr raw_smi) { return RawSmiValue(raw_smi); }
@@ -11809,8 +11817,8 @@
     return OFFSET_OF(UntaggedSuspendState, frame_size_);
   }
   static intptr_t pc_offset() { return OFFSET_OF(UntaggedSuspendState, pc_); }
-  static intptr_t future_offset() {
-    return OFFSET_OF(UntaggedSuspendState, future_);
+  static intptr_t function_data_offset() {
+    return OFFSET_OF(UntaggedSuspendState, function_data_);
   }
   static intptr_t then_callback_offset() {
     return OFFSET_OF(UntaggedSuspendState, then_callback_);
@@ -11823,10 +11831,10 @@
   }
 
   static SuspendStatePtr New(intptr_t frame_size,
-                             const Instance& future,
+                             const Instance& function_data,
                              Heap::Space space = Heap::kNew);
 
-  InstancePtr future() const { return untag()->future(); }
+  InstancePtr function_data() const { return untag()->function_data(); }
   uword pc() const { return untag()->pc_; }
 
   // Returns Code object corresponding to the suspended function.
@@ -11835,7 +11843,7 @@
  private:
   void set_frame_size(intptr_t frame_size) const;
   void set_pc(uword pc) const;
-  void set_future(const Instance& future) const;
+  void set_function_data(const Instance& function_data) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(SuspendState, Instance);
   friend class Class;
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 7cc7f02..f2959f4 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -286,8 +286,17 @@
   cls =
       async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController());
   ASSERT(!cls.IsNull());
+  RELEASE_ASSERT(cls.EnsureIsFinalized(thread) == Error::null());
   set_async_star_stream_controller(cls);
 
+  function = cls.LookupFunctionAllowPrivate(Symbols::add());
+  ASSERT(!function.IsNull());
+  set_async_star_stream_controller_add(function);
+
+  function = cls.LookupFunctionAllowPrivate(Symbols::addStream());
+  ASSERT(!function.IsNull());
+  set_async_star_stream_controller_add_stream(function);
+
   if (FLAG_async_debugger) {
     // Disable debugging and inlining of all functions on the
     // _AsyncStarStreamController class.
@@ -301,6 +310,10 @@
     }
   }
 
+  cls = async_lib.LookupClassAllowPrivate(Symbols::Stream());
+  ASSERT(!cls.IsNull());
+  set_stream_class(cls);
+
   cls = async_lib.LookupClassAllowPrivate(Symbols::_SuspendState());
   ASSERT(!cls.IsNull());
   const auto& error = cls.EnsureIsFinalized(thread);
@@ -310,9 +323,9 @@
   ASSERT(!function.IsNull());
   set_suspend_state_init_async(function);
 
-  function = cls.LookupFunctionAllowPrivate(Symbols::_awaitAsync());
+  function = cls.LookupFunctionAllowPrivate(Symbols::_await());
   ASSERT(!function.IsNull());
-  set_suspend_state_await_async(function);
+  set_suspend_state_await(function);
 
   function = cls.LookupFunctionAllowPrivate(Symbols::_returnAsync());
   ASSERT(!function.IsNull());
@@ -322,6 +335,18 @@
   ASSERT(!function.IsNull());
   set_suspend_state_return_async_not_future(function);
 
+  function = cls.LookupFunctionAllowPrivate(Symbols::_initAsyncStar());
+  ASSERT(!function.IsNull());
+  set_suspend_state_init_async_star(function);
+
+  function = cls.LookupFunctionAllowPrivate(Symbols::_yieldAsyncStar());
+  ASSERT(!function.IsNull());
+  set_suspend_state_yield_async_star(function);
+
+  function = cls.LookupFunctionAllowPrivate(Symbols::_returnAsyncStar());
+  ASSERT(!function.IsNull());
+  set_suspend_state_return_async_star(function);
+
   function = cls.LookupFunctionAllowPrivate(Symbols::_handleException());
   ASSERT(!function.IsNull());
   set_suspend_state_handle_exception(function);
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index ee7844a..674d1b4 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -165,15 +165,21 @@
   RW(Function, simple_instance_of_true_function)                               \
   RW(Function, simple_instance_of_false_function)                              \
   RW(Function, async_star_move_next_helper)                                    \
+  RW(Function, async_star_stream_controller_add)                               \
+  RW(Function, async_star_stream_controller_add_stream)                        \
   RW(Function, complete_on_async_return)                                       \
   RW(Function, complete_with_no_future_on_async_return)                        \
   RW(Function, complete_on_async_error)                                        \
   RW(Function, suspend_state_init_async)                                       \
-  RW(Function, suspend_state_await_async)                                      \
+  RW(Function, suspend_state_await)                                            \
   RW(Function, suspend_state_return_async)                                     \
   RW(Function, suspend_state_return_async_not_future)                          \
+  RW(Function, suspend_state_init_async_star)                                  \
+  RW(Function, suspend_state_yield_async_star)                                 \
+  RW(Function, suspend_state_return_async_star)                                \
   RW(Function, suspend_state_handle_exception)                                 \
   RW(Class, async_star_stream_controller)                                      \
+  RW(Class, stream_class)                                                      \
   ARW_RELAXED(Smi, future_timeout_future_index)                                \
   ARW_RELAXED(Smi, future_wait_future_index)                                   \
   RW(CompressedStackMaps, canonicalized_stack_map_entries)                     \
@@ -244,11 +250,14 @@
   RW(Code, type_parameter_tts_stub)                                            \
   RW(Code, unreachable_tts_stub)                                               \
   RW(Code, slow_tts_stub)                                                      \
-  RW(Code, await_async_stub)                                                   \
+  RW(Code, await_stub)                                                         \
   RW(Code, init_async_stub)                                                    \
   RW(Code, resume_stub)                                                        \
   RW(Code, return_async_stub)                                                  \
   RW(Code, return_async_not_future_stub)                                       \
+  RW(Code, init_async_star_stub)                                               \
+  RW(Code, yield_async_star_stub)                                              \
+  RW(Code, return_async_star_stub)                                             \
   RW(Array, dispatch_table_code_entries)                                       \
   RW(GrowableObjectArray, instructions_tables)                                 \
   RW(Array, obfuscation_map)                                                   \
@@ -324,11 +333,14 @@
   DO(init_instance_field_stub, InitInstanceField)                              \
   DO(init_late_instance_field_stub, InitLateInstanceField)                     \
   DO(init_late_final_instance_field_stub, InitLateFinalInstanceField)          \
-  DO(await_async_stub, AwaitAsync)                                             \
+  DO(await_stub, Await)                                                        \
   DO(init_async_stub, InitAsync)                                               \
   DO(resume_stub, Resume)                                                      \
   DO(return_async_stub, ReturnAsync)                                           \
   DO(return_async_not_future_stub, ReturnAsyncNotFuture)                       \
+  DO(init_async_star_stub, InitAsyncStar)                                      \
+  DO(yield_async_star_stub, YieldAsyncStar)                                    \
+  DO(return_async_star_stub, ReturnAsyncStar)                                  \
   DO(instance_of_stub, InstanceOf)
 
 #define ISOLATE_OBJECT_STORE_FIELD_LIST(R_, RW)                                \
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5677ff9..6b5dab8 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -3292,10 +3292,15 @@
   intptr_t frame_size_;
   uword pc_;
 
-  COMPRESSED_POINTER_FIELD(InstancePtr, future)
+  // Holds function-specific object which is returned from
+  // SuspendState.init* method.
+  // For async functions: _Future instance.
+  // For async* functions: _AsyncStarStreamController instance.
+  COMPRESSED_POINTER_FIELD(InstancePtr, function_data)
+
   COMPRESSED_POINTER_FIELD(ClosurePtr, then_callback)
   COMPRESSED_POINTER_FIELD(ClosurePtr, error_callback)
-  VISIT_FROM(future)
+  VISIT_FROM(function_data)
   VISIT_TO(error_callback)
 
  public:
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 749e1d2..a7e7a92 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -191,7 +191,7 @@
   F(RegExp, two_byte_sticky_)                                                  \
   F(RegExp, external_one_byte_sticky_)                                         \
   F(RegExp, external_two_byte_sticky_)                                         \
-  F(SuspendState, future_)                                                     \
+  F(SuspendState, function_data_)                                              \
   F(SuspendState, then_callback_)                                              \
   F(SuspendState, error_callback_)                                             \
   F(WeakProperty, key_)                                                        \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index b1b3345..ac9d41a 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -711,13 +711,14 @@
 
 // Allocate a SuspendState object.
 // Arg0: frame size.
-// Arg1: future.
+// Arg1: function data.
 // Return value: newly allocated object.
 DEFINE_RUNTIME_ENTRY(AllocateSuspendState, 2) {
   const Smi& frame_size = Smi::CheckedHandle(zone, arguments.ArgAt(0));
-  const Instance& future = Instance::CheckedHandle(zone, arguments.ArgAt(1));
+  const Instance& function_data =
+      Instance::CheckedHandle(zone, arguments.ArgAt(1));
   const SuspendState& result = SuspendState::Handle(
-      zone, SuspendState::New(frame_size.Value(), future,
+      zone, SuspendState::New(frame_size.Value(), function_data,
                               SpaceForRuntimeAllocation()));
   arguments.SetReturn(result);
 }
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index d172704..a5c7bdd 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -70,7 +70,7 @@
       callback_instance_(Object::Handle(zone)),
       future_impl_class(Class::Handle(zone)),
       future_listener_class(Class::Handle(zone)),
-      async_start_stream_controller_class(Class::Handle(zone)),
+      async_star_stream_controller_class(Class::Handle(zone)),
       stream_controller_class(Class::Handle(zone)),
       sync_stream_controller_class(Class::Handle(zone)),
       controller_subscription_class(Class::Handle(zone)),
@@ -95,9 +95,9 @@
       async_lib.LookupClassAllowPrivate(Symbols::_FutureListener());
   ASSERT(!future_listener_class.IsNull());
   // - async*:
-  async_start_stream_controller_class =
+  async_star_stream_controller_class =
       async_lib.LookupClassAllowPrivate(Symbols::_AsyncStarStreamController());
-  ASSERT(!async_start_stream_controller_class.IsNull());
+  ASSERT(!async_star_stream_controller_class.IsNull());
   stream_controller_class =
       async_lib.LookupClassAllowPrivate(Symbols::_StreamController());
   ASSERT(!stream_controller_class.IsNull());
@@ -130,7 +130,7 @@
   ASSERT(!future_listener_result_field.IsNull());
   // - async*:
   controller_controller_field =
-      async_start_stream_controller_class.LookupFieldAllowPrivate(
+      async_star_stream_controller_class.LookupFieldAllowPrivate(
           Symbols::controller());
   ASSERT(!controller_controller_field.IsNull());
   state_field =
@@ -163,14 +163,19 @@
 
 ClosurePtr CallerClosureFinder::FindCallerInAsyncGenClosure(
     const Context& receiver_context) {
-  // Get the async* _StreamController.
+  // Get the async* _AsyncStarStreamController.
   context_entry_ = receiver_context.At(Context::kControllerIndex);
-  ASSERT(context_entry_.IsInstance());
-  ASSERT(context_entry_.GetClassId() ==
-         async_start_stream_controller_class.id());
+  return FindCallerInAsyncStarStreamController(context_entry_);
+}
 
-  const Instance& controller = Instance::Cast(context_entry_);
-  controller_ = controller.GetField(controller_controller_field);
+ClosurePtr CallerClosureFinder::FindCallerInAsyncStarStreamController(
+    const Object& async_star_stream_controller) {
+  ASSERT(async_star_stream_controller.IsInstance());
+  ASSERT(async_star_stream_controller.GetClassId() ==
+         async_star_stream_controller_class.id());
+
+  controller_ = Instance::Cast(async_star_stream_controller)
+                    .GetField(controller_controller_field);
   ASSERT(!controller_.IsNull());
   ASSERT(controller_.GetClassId() == sync_stream_controller_class.id());
 
@@ -269,8 +274,15 @@
 
 ClosurePtr CallerClosureFinder::FindCallerFromSuspendState(
     const SuspendState& suspend_state) {
-  future_ = suspend_state.future();
-  return GetCallerInFutureImpl(future_);
+  context_entry_ = suspend_state.function_data();
+  if (context_entry_.GetClassId() == future_impl_class.id()) {
+    return GetCallerInFutureImpl(context_entry_);
+  } else if (context_entry_.GetClassId() ==
+             async_star_stream_controller_class.id()) {
+    return FindCallerInAsyncStarStreamController(context_entry_);
+  } else {
+    UNREACHABLE();
+  }
 }
 
 ClosurePtr CallerClosureFinder::UnwrapAsyncThen(const Closure& closure) {
@@ -289,14 +301,15 @@
 
 bool CallerClosureFinder::IsCompactAsyncCallback(const Function& function) {
   parent_function_ = function.parent_function();
-  return parent_function_.recognized_kind() ==
-         MethodRecognizer::kSuspendState_createAsyncCallbacks;
+  auto kind = parent_function_.recognized_kind();
+  return (kind == MethodRecognizer::kSuspendState_createAsyncCallbacks) ||
+         (kind == MethodRecognizer::kSuspendState_createAsyncStarCallback);
 }
 
 SuspendStatePtr CallerClosureFinder::GetSuspendStateFromAsyncCallback(
     const Closure& closure) {
   ASSERT(IsCompactAsyncCallback(Function::Handle(closure.function())));
-  // Async handler only captures the receiver (SuspendState).
+  // Async/async* handler only captures the receiver (SuspendState).
   receiver_context_ = closure.context();
   RELEASE_ASSERT(receiver_context_.num_variables() == 1);
   return SuspendState::RawCast(receiver_context_.At(0));
@@ -469,7 +482,8 @@
     return Closure::null();
   }
 
-  if (function.IsCompactAsyncFunction()) {
+  if (function.IsCompactAsyncFunction() ||
+      function.IsCompactAsyncStarFunction()) {
     auto& suspend_state = Object::Handle(
         zone, *reinterpret_cast<ObjectPtr*>(LocalVarAddress(
                   frame->fp(), runtime_frame_layout.FrameSlotForVariableIndex(
diff --git a/runtime/vm/stack_trace.h b/runtime/vm/stack_trace.h
index bab4fd1..2e33b71 100644
--- a/runtime/vm/stack_trace.h
+++ b/runtime/vm/stack_trace.h
@@ -31,6 +31,12 @@
   // Returns either the `onData` or the Future awaiter.
   ClosurePtr FindCallerInAsyncGenClosure(const Context& receiver_context);
 
+  // Find caller closure from an _AsyncStarStreamController instance
+  // corresponding to async* function.
+  // Returns either the `onData` or the Future awaiter.
+  ClosurePtr FindCallerInAsyncStarStreamController(
+      const Object& async_star_stream_controller);
+
   // Find caller closure from a function receiver closure.
   // For async* functions, async functions, `Future.timeout` and `Future.wait`,
   // we can do this by finding and following their awaited Futures.
@@ -40,11 +46,11 @@
   ClosurePtr FindCallerFromSuspendState(const SuspendState& suspend_state);
 
   // Returns true if given closure function is a Future callback
-  // corresponding to an async function.
+  // corresponding to an async/async* function or async* body callback.
   bool IsCompactAsyncCallback(const Function& function);
 
-  // Returns SuspendState from the given Future callback which corresponds
-  // to an async function.
+  // Returns SuspendState from the given callback which corresponds
+  // to an async/async* function.
   SuspendStatePtr GetSuspendStateFromAsyncCallback(const Closure& closure);
 
   // Finds the awaited Future from an async function receiver closure.
@@ -88,7 +94,7 @@
 
   Class& future_impl_class;
   Class& future_listener_class;
-  Class& async_start_stream_controller_class;
+  Class& async_star_stream_controller_class;
   Class& stream_controller_class;
   Class& sync_stream_controller_class;
   Class& controller_subscription_class;
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index b035700..f9110be 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -149,11 +149,14 @@
   V(InstantiateTypeArgumentsMayShareInstantiatorTA)                            \
   V(InstantiateTypeArgumentsMayShareFunctionTA)                                \
   V(NoSuchMethodDispatcher)                                                    \
-  V(AwaitAsync)                                                                \
+  V(Await)                                                                     \
   V(InitAsync)                                                                 \
   V(Resume)                                                                    \
   V(ReturnAsync)                                                               \
   V(ReturnAsyncNotFuture)                                                      \
+  V(InitAsyncStar)                                                             \
+  V(YieldAsyncStar)                                                            \
+  V(ReturnAsyncStar)                                                           \
   V(AsyncExceptionHandler)                                                     \
   V(UnknownDartCode)
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 34053dc..7eb6d2d 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -241,6 +241,7 @@
   V(SpaceWhereNewLine, " where\n")                                             \
   V(StackOverflowError, "StackOverflowError")                                  \
   V(StackTraceParameter, ":stack_trace")                                       \
+  V(Stream, "Stream")                                                          \
   V(StringBase, "_StringBase")                                                 \
   V(Struct, "Struct")                                                          \
   V(SubtypeTestCache, "SubtypeTestCache")                                      \
@@ -410,7 +411,7 @@
   V(_WeakProperty, "_WeakProperty")                                            \
   V(_WeakReferenceImpl, "_WeakReferenceImpl")                                  \
   V(_typedDataBase, "_typedDataBase")                                          \
-  V(_awaitAsync, "_awaitAsync")                                                \
+  V(_await, "_await")                                                          \
   V(_classRangeCheck, "_classRangeCheck")                                      \
   V(_ensureScheduleImmediate, "_ensureScheduleImmediate")                      \
   V(_future, "_future")                                                        \
@@ -420,6 +421,7 @@
   V(_handleNativeFinalizerMessage, "_handleNativeFinalizerMessage")            \
   V(_hasValue, "_hasValue")                                                    \
   V(_initAsync, "_initAsync")                                                  \
+  V(_initAsyncStar, "_initAsyncStar")                                          \
   V(_instanceOf, "_instanceOf")                                                \
   V(_listGetAt, "_listGetAt")                                                  \
   V(_listLength, "_listLength")                                                \
@@ -439,6 +441,7 @@
   V(_resultOrListeners, "_resultOrListeners")                                  \
   V(_returnAsync, "_returnAsync")                                              \
   V(_returnAsyncNotFuture, "_returnAsyncNotFuture")                            \
+  V(_returnAsyncStar, "_returnAsyncStar")                                      \
   V(_runExtension, "_runExtension")                                            \
   V(_runPendingImmediateCallback, "_runPendingImmediateCallback")              \
   V(_scanFlags, "_scanFlags")                                                  \
@@ -451,6 +454,9 @@
   V(_toString, "_toString")                                                    \
   V(_varData, "_varData")                                                      \
   V(_wordCharacterMap, "_wordCharacterMap")                                    \
+  V(_yieldAsyncStar, "_yieldAsyncStar")                                        \
+  V(add, "add")                                                                \
+  V(addStream, "addStream")                                                    \
   V(callback, "callback")                                                      \
   V(capture_length, ":capture_length")                                         \
   V(capture_start_index, ":capture_start_index")                               \
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 172831f..fab7da6 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -9,6 +9,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/class_id.h"
+#include "vm/globals.h"
 #include "vm/pointer_tagging.h"
 
 namespace dart {
@@ -66,13 +67,29 @@
     return (addr & kObjectAlignmentMask) != kOldObjectBits;                    \
   }                                                                            \
                                                                                \
-  bool operator==(const type& other) { return ptr == other.ptr; }              \
-  bool operator!=(const type& other) { return ptr != other.ptr; }              \
+  bool operator==(const type& other) {                                         \
+    return (ptr & kSmiTagMask) == kHeapObjectTag                               \
+               ? ptr == other.ptr                                              \
+               : static_cast<compressed_uword>(ptr) ==                         \
+                     static_cast<compressed_uword>(other.ptr);                 \
+  }                                                                            \
+  bool operator!=(const type& other) {                                         \
+    return (ptr & kSmiTagMask) == kHeapObjectTag                               \
+               ? ptr != other.ptr                                              \
+               : static_cast<compressed_uword>(ptr) !=                         \
+                     static_cast<compressed_uword>(other.ptr);                 \
+  }                                                                            \
   constexpr bool operator==(const type& other) const {                         \
-    return ptr == other.ptr;                                                   \
+    return (ptr & kSmiTagMask) == kHeapObjectTag                               \
+               ? ptr == other.ptr                                              \
+               : static_cast<compressed_uword>(ptr) ==                         \
+                     static_cast<compressed_uword>(other.ptr);                 \
   }                                                                            \
   constexpr bool operator!=(const type& other) const {                         \
-    return ptr != other.ptr;                                                   \
+    return (ptr & kSmiTagMask) == kHeapObjectTag                               \
+               ? ptr != other.ptr                                              \
+               : static_cast<compressed_uword>(ptr) !=                         \
+                     static_cast<compressed_uword>(other.ptr);                 \
   }
 
 class ObjectPtr {
@@ -251,11 +268,6 @@
       : compressed_pointer_(static_cast<uint32_t>(tagged)) {}
 
   ObjectPtr Decompress(uword heap_base) const {
-    if ((compressed_pointer_ & kSmiTagMask) != kHeapObjectTag) {
-      // TODO(liama): Make all native code robust to junk in the upper 32-bits
-      // of SMIs, then remove this special casing.
-      return DecompressSmi();
-    }
     return static_cast<ObjectPtr>(static_cast<uword>(compressed_pointer_) +
                                   heap_base);
   }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 32dc3ba..dc5b90b 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -168,9 +168,12 @@
 
 #define CACHED_FUNCTION_ENTRY_POINTS_LIST(V)                                   \
   V(suspend_state_init_async)                                                  \
-  V(suspend_state_await_async)                                                 \
+  V(suspend_state_await)                                                       \
   V(suspend_state_return_async)                                                \
   V(suspend_state_return_async_not_future)                                     \
+  V(suspend_state_init_async_star)                                             \
+  V(suspend_state_yield_async_star)                                            \
+  V(suspend_state_return_async_star)                                           \
   V(suspend_state_handle_exception)
 
 // This assertion marks places which assume that boolean false immediate
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 27eb7e6..d6f6c74 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -110,7 +110,7 @@
 class _AsyncStarStreamController<T> {
   @pragma("vm:entry-point")
   StreamController<T> controller;
-  Function asyncStarBody;
+  Function? asyncStarBody;
   bool isAdding = false;
   bool onListenReceived = false;
   bool isScheduled = false;
@@ -127,7 +127,7 @@
   Stream<T> get stream {
     final Stream<T> local = controller.stream;
     if (local is _StreamImpl<T>) {
-      local._generator = asyncStarBody;
+      local._generator = asyncStarBody!;
     }
     return local;
   }
@@ -137,7 +137,7 @@
     isSuspendedAtYield = false;
     final bool? argument = continuationArgument;
     continuationArgument = null;
-    asyncStarBody(argument, null);
+    asyncStarBody!(argument, null);
   }
 
   void scheduleGenerator() {
@@ -158,6 +158,7 @@
   // controller.add(e);
   // suspend;
   // if (controller.isCancelled) return;
+  @pragma("vm:entry-point", "call")
   bool add(T event) {
     if (!onListenReceived) _fatal("yield before stream is listened to");
     if (isSuspendedAtYield) _fatal("unexpected yield");
@@ -174,6 +175,7 @@
   // Adds the elements of stream into this controller's stream.
   // The generator will be scheduled again when all of the
   // elements of the added stream have been consumed.
+  @pragma("vm:entry-point", "call")
   void addStream(Stream<T> stream) {
     if (!onListenReceived) _fatal("yield before stream is listened to");
 
@@ -327,7 +329,7 @@
   @pragma("vm:invisible")
   static Object? _initAsync<T>() {
     if (_trace) print('_initAsync<$T>');
-    return new _Future<T>();
+    return _Future<T>();
   }
 
   @pragma("vm:invisible")
@@ -371,14 +373,14 @@
 
   @pragma("vm:entry-point", "call")
   @pragma("vm:invisible")
-  Object? _awaitAsync(Object? object) {
+  Object? _await(Object? object) {
     if (_trace) print('_awaitAsync (object=$object)');
     if (_thenCallback == null) {
       _createAsyncCallbacks();
     }
     _awaitHelper(object, unsafeCast<dynamic Function(dynamic)>(_thenCallback),
         unsafeCast<dynamic Function(Object, StackTrace)>(_errorCallback));
-    return _future;
+    return _functionData;
   }
 
   @pragma("vm:entry-point", "call")
@@ -391,7 +393,7 @@
     _Future future;
     bool isSync = true;
     if (suspendState is _SuspendState) {
-      future = suspendState._future;
+      future = unsafeCast<_Future>(suspendState._functionData);
     } else {
       future = unsafeCast<_Future>(suspendState);
       isSync = false;
@@ -411,7 +413,7 @@
     _Future future;
     bool isSync = true;
     if (suspendState is _SuspendState) {
-      future = suspendState._future;
+      future = unsafeCast<_Future>(suspendState._functionData);
     } else {
       future = unsafeCast<_Future>(suspendState);
       isSync = false;
@@ -422,31 +424,79 @@
 
   @pragma("vm:entry-point", "call")
   @pragma("vm:invisible")
-  static Future _handleException(
+  static Object? _initAsyncStar<T>() {
+    if (_trace) print('_initAsyncStar<$T>');
+    return _AsyncStarStreamController<T>(null);
+  }
+
+  @pragma("vm:invisible")
+  @pragma("vm:recognized", "other")
+  _createAsyncStarCallback(_AsyncStarStreamController controller) {
+    controller.asyncStarBody = (value, _) {
+      if (_trace) print('asyncStarBody callback (value=$value)');
+      _resume(value, null, null);
+    };
+  }
+
+  @pragma("vm:entry-point", "call")
+  @pragma("vm:invisible")
+  Object? _yieldAsyncStar(Object? object) {
+    final controller = unsafeCast<_AsyncStarStreamController>(_functionData);
+    if (controller.asyncStarBody == null) {
+      _createAsyncStarCallback(controller);
+      return controller.stream;
+    }
+    return null;
+  }
+
+  @pragma("vm:entry-point", "call")
+  @pragma("vm:invisible")
+  static void _returnAsyncStar(Object suspendState, Object? returnValue) {
+    if (_trace) {
+      print('_returnAsyncStar (suspendState=$suspendState, '
+          'returnValue=$returnValue)');
+    }
+    final controller = unsafeCast<_AsyncStarStreamController>(
+        unsafeCast<_SuspendState>(suspendState)._functionData);
+    controller.close();
+  }
+
+  @pragma("vm:entry-point", "call")
+  @pragma("vm:invisible")
+  static Object? _handleException(
       Object suspendState, Object exception, StackTrace stackTrace) {
     if (_trace) {
       print('_handleException (suspendState=$suspendState, '
           'exception=$exception, stackTrace=$stackTrace)');
     }
-    _Future future;
+    Object? functionData;
     bool isSync = true;
     if (suspendState is _SuspendState) {
-      future = suspendState._future;
+      functionData = suspendState._functionData;
     } else {
-      future = unsafeCast<_Future>(suspendState);
+      functionData = suspendState;
       isSync = false;
     }
-    _completeOnAsyncError(future, exception, stackTrace, isSync);
-    return future;
+    if (functionData is _Future) {
+      // async function.
+      _completeOnAsyncError(functionData, exception, stackTrace, isSync);
+    } else if (functionData is _AsyncStarStreamController) {
+      // async* function.
+      functionData.addError(exception, stackTrace);
+      functionData.close();
+    } else {
+      throw 'Unexpected function data ${functionData.runtimeType} $functionData';
+    }
+    return functionData;
   }
 
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  external set _future(_Future value);
+  external set _functionData(Object value);
 
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
-  external _Future get _future;
+  external Object get _functionData;
 
   @pragma("vm:recognized", "other")
   @pragma("vm:prefer-inline")
@@ -467,5 +517,5 @@
   @pragma("vm:recognized", "other")
   @pragma("vm:never-inline")
   external void _resume(
-      dynamic value, Object? exception, StackTrace? stackTrace);
+      Object? value, Object? exception, StackTrace? stackTrace);
 }
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 573457d..0b9ae80 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -792,7 +792,7 @@
       return _getTypeSyncHelper(rawPath, followLinks);
     }
     return overrides.fseGetTypeSync(
-        utf8.decode(rawPath, allowMalformed: true), followLinks);
+        _toStringFromUtf8Array(rawPath), followLinks);
   }
 
   static Future<FileSystemEntityType> _getTypeRequest(
@@ -813,8 +813,7 @@
     if (overrides == null) {
       return _getTypeRequest(rawPath, followLinks);
     }
-    return overrides.fseGetType(
-        utf8.decode(rawPath, allowMalformed: true), followLinks);
+    return overrides.fseGetType(_toStringFromUtf8Array(rawPath), followLinks);
   }
 
   static _throwIfError(Object result, String msg, [String? path]) {
diff --git a/tests/standalone/io/regress_34885_test.dart b/tests/standalone/io/regress_34885_test.dart
new file mode 100644
index 0000000..dadf8f0
--- /dev/null
+++ b/tests/standalone/io/regress_34885_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, 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:convert';
+import 'dart:io';
+import 'dart:typed_data';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+class FileSystemEntityMock {
+  static Future<FileSystemEntityType> getType(String path, bool followLinks) {
+    Expect.equals(path.length, 4);
+    return new Future.value(FileSystemEntityType.file);
+  }
+
+  static FileSystemEntityType getTypeSync(String path, bool followLinks) {
+    Expect.equals(path.length, 4);
+    return FileSystemEntityType.file;
+  }
+}
+
+main() async {
+  Future<Null> f = IOOverrides.runZoned(
+    () async {
+      Expect.equals(
+          await FileSystemEntity.type("file"), FileSystemEntityType.file);
+      Expect.equals(
+          FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
+    },
+    fseGetType: FileSystemEntityMock.getType,
+    fseGetTypeSync: FileSystemEntityMock.getTypeSync,
+  );
+  await f;
+}
diff --git a/tests/standalone_2/io/regress_34885_test.dart b/tests/standalone_2/io/regress_34885_test.dart
new file mode 100644
index 0000000..dadf8f0
--- /dev/null
+++ b/tests/standalone_2/io/regress_34885_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, 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:convert';
+import 'dart:io';
+import 'dart:typed_data';
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+class FileSystemEntityMock {
+  static Future<FileSystemEntityType> getType(String path, bool followLinks) {
+    Expect.equals(path.length, 4);
+    return new Future.value(FileSystemEntityType.file);
+  }
+
+  static FileSystemEntityType getTypeSync(String path, bool followLinks) {
+    Expect.equals(path.length, 4);
+    return FileSystemEntityType.file;
+  }
+}
+
+main() async {
+  Future<Null> f = IOOverrides.runZoned(
+    () async {
+      Expect.equals(
+          await FileSystemEntity.type("file"), FileSystemEntityType.file);
+      Expect.equals(
+          FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
+    },
+    fseGetType: FileSystemEntityMock.getType,
+    fseGetTypeSync: FileSystemEntityMock.getTypeSync,
+  );
+  await f;
+}
diff --git a/tools/VERSION b/tools/VERSION
index cbf25bd..cb98d08 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 79
+PRERELEASE 80
 PRERELEASE_PATCH 0
\ No newline at end of file