diff --git a/DEPS b/DEPS
index 871d214..4017423 100644
--- a/DEPS
+++ b/DEPS
@@ -63,8 +63,8 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "7e9747b50bcb1be28d4a3236571e8050835497a6",
-  "gn_revision": "1e3fd10c5df6b704fc764ee388149e4f32862823",
+  "clang_revision": "3dc24bc31edbc01dea085b24a6a6b024d7ae531c",
+  "gn_revision": "39a87c0b36310bdf06b692c098f199a0d97fc810",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -106,7 +106,7 @@
   "dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "e6a9b7c536a85e49233c97bb892bbb0ab778e425",
+  "dartdoc_rev" : "305713608c25106d95f9114418d895e08d1a9e9c",
   "devtools_rev" : "e138d55437a59838607415ef21f20bd6c4955dbc",
   "jsshell_tag": "version:88.0",
   "ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index f1ac8c2..91586be 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -294,6 +294,10 @@
       # Clang doesn't support these flags.
       cflags += [ "-finline-limit=64" ]
     }
+    if (current_cpu == "arm64") {
+      # TODO (https://github.com/flutter/flutter/issues/75348).
+      cflags += [ "-mno-outline-atomics" ]
+    }
     if (is_asan) {
       # Android build relies on -Wl,--gc-sections removing unreachable code.
       # ASan instrumentation for globals inhibits this and results in a library
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index d78d0d5..fbff8be 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -16,8 +16,6 @@
 import 'package:analyzer/src/summary2/element_builder.dart';
 import 'package:analyzer/src/summary2/export.dart';
 import 'package:analyzer/src/summary2/link.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/metadata_resolver.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/summary2/reference_resolver.dart';
@@ -28,11 +26,9 @@
   final Linker linker;
   final Uri uri;
   final Reference reference;
-  late final List<Reference> exports;
+  final LibraryElementImpl element;
+  final List<LinkingUnit> units;
 
-  late final LinkedLibraryContext context;
-
-  late final LibraryElementImpl element;
   late final LibraryScope scope;
 
   /// Local declarations.
@@ -42,8 +38,15 @@
   final Scope exportScope = Scope.top();
 
   final List<Export> exporters = [];
+  late final List<Reference> exports;
 
-  LibraryBuilder._(this.linker, this.uri, this.reference);
+  LibraryBuilder._({
+    required this.linker,
+    required this.uri,
+    required this.reference,
+    required this.element,
+    required this.units,
+  });
 
   void addExporters() {
     for (var element in element.exports) {
@@ -97,24 +100,19 @@
     return true;
   }
 
-  void buildElement() {
-    element = linker.elementFactory.createLibraryElementForLinking(context)
-        as LibraryElementImpl;
-  }
-
   /// Build elements for declarations in the library units, add top-level
   /// declarations to the local scope, for combining into export scopes.
   void buildElements() {
-    for (var unitContext in context.units) {
+    for (var linkingUnit in units) {
       var elementBuilder = ElementBuilder(
         libraryBuilder: this,
-        unitReference: unitContext.reference,
-        unitElement: unitContext.element,
+        unitReference: linkingUnit.reference,
+        unitElement: linkingUnit.element,
       );
-      if (unitContext.indexInLibrary == 0) {
-        elementBuilder.buildLibraryElementChildren(unitContext.unit);
+      if (linkingUnit.isDefiningUnit) {
+        elementBuilder.buildLibraryElementChildren(linkingUnit.node);
       }
-      elementBuilder.buildDeclarationElements(unitContext.unit);
+      elementBuilder.buildDeclarationElements(linkingUnit.node);
     }
     if ('$uri' == 'dart:core') {
       localScope.declare('dynamic', reference.getChild('dynamic'));
@@ -137,8 +135,8 @@
   }
 
   void collectMixinSuperInvokedNames() {
-    for (var unitContext in context.units) {
-      for (var declaration in unitContext.unit.declarations) {
+    for (var linkingUnit in units) {
+      for (var declaration in linkingUnit.node.declarations) {
         if (declaration is ast.MixinDeclaration) {
           var names = <String>{};
           var collector = MixinSuperInvokedNamesCollector(names);
@@ -163,28 +161,24 @@
   }
 
   void resolveMetadata() {
-    for (var unitContext in context.units) {
-      var unitElement =
-          unitContext.reference.element as CompilationUnitElementImpl;
-      var resolver = MetadataResolver(linker, scope, unitElement);
-      unitContext.unit.accept(resolver);
+    for (var linkingUnit in units) {
+      var resolver = MetadataResolver(linker, scope, linkingUnit.element);
+      linkingUnit.node.accept(resolver);
     }
   }
 
   void resolveTypes(NodesToBuildType nodesToBuildType) {
-    for (var unitContext in context.units) {
-      var unitRef = reference.getChild('@unit');
-      var unitReference = unitRef.getChild(unitContext.uriStr);
+    for (var linkingUnit in units) {
       var resolver = ReferenceResolver(
         linker,
         nodesToBuildType,
         linker.elementFactory,
         element,
-        unitReference,
-        unitContext.unit.featureSet.isEnabled(Feature.non_nullable),
+        linkingUnit.reference,
+        linkingUnit.node.featureSet.isEnabled(Feature.non_nullable),
         scope,
       );
-      unitContext.unit.accept(resolver);
+      linkingUnit.node.accept(resolver);
     }
   }
 
@@ -209,32 +203,102 @@
   }
 
   static void build(Linker linker, LinkInputLibrary inputLibrary) {
-    var uriStr = inputLibrary.uriStr;
-    var reference = linker.rootReference.getChild(uriStr);
-
     var elementFactory = linker.elementFactory;
-    var context = LinkedLibraryContext(elementFactory, uriStr, reference);
 
-    var unitRef = reference.getChild('@unit');
-    var unitIndex = 0;
-    for (var inputUnit in inputLibrary.units) {
-      var uriStr = inputUnit.uriStr;
-      var reference = unitRef.getChild(uriStr);
-      context.units.add(
-        LinkedUnitContext(
-          context,
-          unitIndex++,
-          inputUnit.partUriStr,
-          uriStr,
-          reference,
-          inputUnit.isSynthetic,
-          unit: inputUnit.unit as ast.CompilationUnitImpl,
-        ),
-      );
+    var rootReference = linker.rootReference;
+    var libraryUriStr = inputLibrary.uriStr;
+    var libraryReference = rootReference.getChild(libraryUriStr);
+
+    var definingUnit = inputLibrary.units[0];
+    var definingUnitNode = definingUnit.unit as ast.CompilationUnitImpl;
+
+    var name = '';
+    var nameOffset = -1;
+    var nameLength = 0;
+    for (var directive in definingUnitNode.directives) {
+      if (directive is ast.LibraryDirective) {
+        name = directive.name.components.map((e) => e.name).join('.');
+        nameOffset = directive.name.offset;
+        nameLength = directive.name.length;
+        break;
+      }
     }
 
-    var builder = LibraryBuilder._(linker, inputLibrary.uri, reference);
+    var libraryElement = LibraryElementImpl(
+      elementFactory.analysisContext,
+      elementFactory.analysisSession,
+      name,
+      nameOffset,
+      nameLength,
+      definingUnitNode.featureSet,
+    );
+    libraryElement.isSynthetic = definingUnit.isSynthetic;
+    libraryElement.languageVersion = definingUnitNode.languageVersion!;
+    _bindReference(libraryReference, libraryElement);
+    elementFactory.setLibraryTypeSystem(libraryElement);
+
+    var unitContainerRef = libraryReference.getChild('@unit');
+    var unitElements = <CompilationUnitElementImpl>[];
+    var isDefiningUnit = true;
+    var linkingUnits = <LinkingUnit>[];
+    for (var inputUnit in inputLibrary.units) {
+      var unitNode = inputUnit.unit as ast.CompilationUnitImpl;
+
+      var unitElement = CompilationUnitElementImpl();
+      unitElement.isSynthetic = inputUnit.isSynthetic;
+      unitElement.librarySource = inputLibrary.source;
+      unitElement.lineInfo = unitNode.lineInfo;
+      unitElement.source = inputUnit.source;
+      unitElement.uri = inputUnit.partUriStr;
+
+      var unitReference = unitContainerRef.getChild(inputUnit.uriStr);
+      _bindReference(unitReference, unitElement);
+
+      unitElements.add(unitElement);
+      linkingUnits.add(
+        LinkingUnit(
+          input: inputUnit,
+          isDefiningUnit: isDefiningUnit,
+          reference: unitReference,
+          node: unitNode,
+          element: unitElement,
+        ),
+      );
+      isDefiningUnit = false;
+    }
+
+    libraryElement.definingCompilationUnit = unitElements[0];
+    libraryElement.parts = unitElements.skip(1).toList();
+
+    var builder = LibraryBuilder._(
+      linker: linker,
+      uri: inputLibrary.uri,
+      reference: libraryReference,
+      element: libraryElement,
+      units: linkingUnits,
+    );
+
     linker.builders[builder.uri] = builder;
-    builder.context = context;
   }
+
+  static void _bindReference(Reference reference, ElementImpl element) {
+    reference.element = element;
+    element.reference = reference;
+  }
+}
+
+class LinkingUnit {
+  final LinkInputUnit input;
+  final bool isDefiningUnit;
+  final Reference reference;
+  final ast.CompilationUnitImpl node;
+  final CompilationUnitElementImpl element;
+
+  LinkingUnit({
+    required this.input,
+    required this.isDefiningUnit,
+    required this.reference,
+    required this.node,
+    required this.element,
+  });
 }
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index d3408d6..225b860 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -115,10 +115,6 @@
 
   void _computeLibraryScopes() {
     for (var library in builders.values) {
-      library.buildElement();
-    }
-
-    for (var library in builders.values) {
       library.buildElements();
     }
 
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index fcd971f..92f3296 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -2,7 +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.
 
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
@@ -10,7 +9,6 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 
 class LinkedElementFactory {
@@ -68,69 +66,6 @@
     return Namespace(exportedNames);
   }
 
-  LibraryElementImpl? createLibraryElementForLinking(
-    LinkedLibraryContext libraryContext,
-  ) {
-    var sourceFactory = analysisContext.sourceFactory;
-    var libraryUriStr = libraryContext.uriStr;
-    var librarySource = sourceFactory.forUri(libraryUriStr);
-
-    // The URI cannot be resolved, we don't know the library.
-    if (librarySource == null) return null;
-
-    var definingUnitContext = libraryContext.definingUnit;
-    var definingUnitNode = definingUnitContext.unit;
-
-    // TODO(scheglov) Do we need this?
-    var name = '';
-    var nameOffset = -1;
-    var nameLength = 0;
-    for (var directive in definingUnitNode.directives) {
-      if (directive is LibraryDirective) {
-        name = directive.name.components.map((e) => e.name).join('.');
-        nameOffset = directive.name.offset;
-        nameLength = directive.name.length;
-        break;
-      }
-    }
-
-    var libraryElement = LibraryElementImpl(
-      analysisContext,
-      analysisSession,
-      name,
-      nameOffset,
-      nameLength,
-      definingUnitNode.featureSet,
-    );
-    libraryElement.isSynthetic = definingUnitContext.isSynthetic;
-    libraryElement.languageVersion = definingUnitNode.languageVersion!;
-    _bindReference(libraryContext.reference, libraryElement);
-    _setLibraryTypeSystem(libraryElement);
-
-    var units = <CompilationUnitElementImpl>[];
-    for (var unitContext in libraryContext.units) {
-      var unitNode = unitContext.unit;
-
-      var unitSource = sourceFactory.forUri(unitContext.uriStr);
-      if (unitSource == null) continue;
-
-      var unitElement = CompilationUnitElementImpl();
-      unitElement.isSynthetic = unitContext.isSynthetic;
-      unitElement.librarySource = librarySource;
-      unitElement.lineInfo = unitNode.lineInfo;
-      unitElement.source = unitSource;
-      unitElement.uri = unitContext.partUriStr;
-      _bindReference(unitContext.reference, unitElement);
-
-      units.add(unitElement);
-    }
-
-    libraryElement.definingCompilationUnit = units[0];
-    libraryElement.parts = units.skip(1).toList();
-
-    return libraryElement;
-  }
-
   LibraryElementImpl? createLibraryElementForReading(String uriStr) {
     var sourceFactory = analysisContext.sourceFactory;
     var librarySource = sourceFactory.forUri(uriStr);
@@ -149,7 +84,7 @@
     var libraryElement = reader.readElement(
       librarySource: librarySource,
     );
-    _setLibraryTypeSystem(libraryElement);
+    setLibraryTypeSystem(libraryElement);
     return libraryElement;
   }
 
@@ -179,7 +114,7 @@
     for (var reference in rootReference.children) {
       var libraryElement = reference.element as LibraryElementImpl?;
       if (libraryElement != null && !libraryElement.hasTypeProviderSystemSet) {
-        _setLibraryTypeSystem(libraryElement);
+        setLibraryTypeSystem(libraryElement);
       }
     }
   }
@@ -276,13 +211,7 @@
     analysisSession.inheritanceManager.removeOfLibraries(uriStrSet);
   }
 
-  void _declareDartCoreDynamicNever() {
-    var dartCoreRef = rootReference.getChild('dart:core');
-    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
-    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
-  }
-
-  void _setLibraryTypeSystem(LibraryElementImpl libraryElement) {
+  void setLibraryTypeSystem(LibraryElementImpl libraryElement) {
     // During linking we create libraries when typeProvider is not ready.
     // And if we link dart:core and dart:async, we cannot create it.
     // We will set typeProvider later, during [createTypeProviders].
@@ -302,8 +231,9 @@
     libraryElement.createLoadLibraryFunction();
   }
 
-  static void _bindReference(Reference reference, ElementImpl element) {
-    reference.element = element;
-    element.reference = reference;
+  void _declareDartCoreDynamicNever() {
+    var dartCoreRef = rootReference.getChild('dart:core');
+    dartCoreRef.getChild('dynamic').element = DynamicElementImpl.instance;
+    dartCoreRef.getChild('Never').element = NeverElementImpl.instance;
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/linked_library_context.dart b/pkg/analyzer/lib/src/summary2/linked_library_context.dart
deleted file mode 100644
index e9c7e77..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_library_context.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/summary2/linked_element_factory.dart';
-import 'package:analyzer/src/summary2/linked_unit_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-class LinkedLibraryContext {
-  final LinkedElementFactory elementFactory;
-  final String uriStr;
-  final Reference reference;
-  final List<LinkedUnitContext> units = [];
-
-  LinkedLibraryContext(this.elementFactory, this.uriStr, this.reference);
-
-  LinkedUnitContext get definingUnit => units.first;
-}
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
deleted file mode 100644
index 472f5cb..0000000
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/summary2/linked_library_context.dart';
-import 'package:analyzer/src/summary2/reference.dart';
-
-/// The context of a unit - the context of the bundle, and the unit tokens.
-class LinkedUnitContext {
-  final LinkedLibraryContext libraryContext;
-  final int indexInLibrary;
-  final String? partUriStr;
-  final String uriStr;
-  final Reference reference;
-  final bool isSynthetic;
-  final CompilationUnitImpl unit;
-
-  LinkedUnitContext(this.libraryContext, this.indexInLibrary, this.partUriStr,
-      this.uriStr, this.reference, this.isSynthetic,
-      {required this.unit});
-
-  CompilationUnitElementImpl get element {
-    return reference.element as CompilationUnitElementImpl;
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 4ff3555..b48b646 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -10,8 +10,8 @@
   /// Check typedefs and mark the ones having self references.
   void perform(Linker linker) {
     for (var builder in linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is FunctionTypeAlias) {
             var finder = _Finder(linker, node);
             finder.functionTypeAlias(node);
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 8d7438d..8543179 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -21,8 +21,8 @@
 
   void perform() {
     for (var builder in _linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is FunctionTypeAlias) {
             _pending.add(node);
           } else if (node is GenericTypeAlias) {
@@ -33,8 +33,8 @@
     }
 
     for (var builder in _linker.builders.values) {
-      for (var unitContext in builder.context.units) {
-        for (var node in unitContext.unit.declarations) {
+      for (var linkingUnit in builder.units) {
+        for (var node in linkingUnit.node.declarations) {
           if (node is ClassTypeAlias) {
             _typeParameters(node.typeParameters);
           } else if (node is ClassDeclaration) {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
index 2bf9161..9d8b897 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart
@@ -13,9 +13,10 @@
   });
 }
 
-/// todo(pq): add tests for topLevelVariables: https://dart-review.googlesource.com/c/sdk/+/200301
 @reflectiveTest
 class InvalidAnnotationTargetTest extends PubPackageResolutionTest {
+  // todo(pq): add tests for topLevelVariables:
+  // https://dart-review.googlesource.com/c/sdk/+/200301
   void test_classType_class() async {
     writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
index 2b0c310..3584005 100644
--- a/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/strict_raw_type_test.dart
@@ -117,6 +117,34 @@
 ''');
   }
 
+  test_nonFunctionTypeAlias_explicitTypeArg() async {
+    writeTestPackageConfigWithMeta();
+    await assertNoErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2<int> a) {}
+''');
+  }
+
+  test_nonFunctionTypeAlias_missingTypeArg() async {
+    writeTestPackageConfigWithMeta();
+    await assertErrorsInCode('''
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''', [
+      error(HintCode.STRICT_RAW_TYPE, 35, 5),
+    ]);
+  }
+
+  test_nonFunctionTypeAlias_optionalTypeArgs() async {
+    writeTestPackageConfigWithMeta();
+    await assertNoErrorsInCode('''
+import 'package:meta/meta.dart';
+@optionalTypeArgs
+typedef List2<T> = List<T>;
+void f(List2 a) {}
+''');
+  }
+
   test_parameter_missingTypeArg() async {
     await assertErrorsInCode(r'''
 void f(List a) {}
@@ -181,21 +209,21 @@
 ''', [error(HintCode.STRICT_RAW_TYPE, 11, 4)]);
   }
 
-  test_typedef_classic_missingTypeArg() async {
+  test_typeAlias_classic_missingTypeArg() async {
     await assertErrorsInCode(r'''
 typedef T F1<T>(T _);
 F1 func = (a) => a;
 ''', [error(HintCode.STRICT_RAW_TYPE, 22, 2)]);
   }
 
-  test_typedef_modern_missingTypeArg() async {
+  test_typeAlias_modern_missingTypeArg() async {
     await assertErrorsInCode(r'''
 typedef F1<T> = T Function(T);
 F1 func = (a) => a;
 ''', [error(HintCode.STRICT_RAW_TYPE, 31, 2)]);
   }
 
-  test_typedef_modern_optionalTypeArgs() async {
+  test_typeAlias_modern_optionalTypeArgs() async {
     writeTestPackageConfigWithMeta();
     await assertNoErrorsInCode(r'''
 import 'package:meta/meta.dart';
@@ -208,7 +236,7 @@
 ''');
   }
 
-  test_typedef_modern_withTypeArg() async {
+  test_typeAlias_modern_withTypeArg() async {
     await assertNoErrorsInCode(r'''
 typedef T F1<T>(T _);
 typedef F2<T> = T Function(T);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 66dfa4d..925dec6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -12749,6 +12749,8 @@
 part 'test.dart';
 class B {
 }
+class B {
+}
 ''');
   }
 
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 5841c60..6bebee4 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -199,8 +199,10 @@
 ///   overriding member `m`.
 const _NonVirtual nonVirtual = _NonVirtual();
 
-/// Used to annotate a class, mixin, or extension declaration `C`. Indicates
-/// that any type arguments declared on `C` are to be treated as optional.
+/// Used to annotate a class, mixin, extension, function, method, or typedef
+/// declaration `C`. Indicates that any type arguments declared on `C` are to
+/// be treated as optional.
+///
 /// Tools such as the analyzer and linter can use this information to suppress
 /// warnings that would otherwise require type arguments on `C` to be provided.
 const _OptionalTypeArgs optionalTypeArgs = _OptionalTypeArgs();
@@ -396,6 +398,14 @@
   const _NonVirtual();
 }
 
+@Target({
+  TargetKind.classType,
+  TargetKind.extension,
+  TargetKind.function,
+  TargetKind.method,
+  TargetKind.mixinType,
+  TargetKind.typedefType,
+})
 class _OptionalTypeArgs {
   const _OptionalTypeArgs();
 }
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index a5d848f..e15ff53 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -1133,6 +1133,7 @@
     Exceptions::ThrowArgumentError(error);
     UNREACHABLE();
   }
+  tpeer->handle()->EnsureFreedExternal(IsolateGroup::Current());
   tpeer->ClearData();
 
   const ExternalTypedData& typed_data = ExternalTypedData::Handle(
diff --git a/runtime/tests/vm/dart/transferable_allocations_test.dart b/runtime/tests/vm/dart/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+  final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+  for (int i = 0; i < 1000; i++) {
+    TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+  }
+}
diff --git a/runtime/tests/vm/dart_2/transferable_allocations_test.dart b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
new file mode 100644
index 0000000..ec61786
--- /dev/null
+++ b/runtime/tests/vm/dart_2/transferable_allocations_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, 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.
+
+// Verifies that Transferable (external old space) objects are promptly gc'ed.
+// The test will run out of ia32 3GB heap allocation if objects are not gc'ed.
+
+// VMOptions=--old_gen_heap_size=32
+
+import 'dart:isolate';
+import 'dart:typed_data';
+
+void main() {
+  final data = Uint8List.view(new Uint8List(5 * 1024 * 1024).buffer);
+  for (int i = 0; i < 1000; i++) {
+    TransferableTypedData.fromList(<Uint8List>[data]).materialize();
+  }
+}
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 411dbce..616c6bf 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -163,6 +163,9 @@
   }
 
   if (old_space_.ReachedHardThreshold()) {
+    if (last_gc_was_old_space_) {
+      CollectNewSpaceGarbage(Thread::Current(), kFull);
+    }
     CollectGarbage(kMarkSweep, kExternal);
   } else {
     CheckStartConcurrentMarking(Thread::Current(), kExternal);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bdef06a..6f0bc6c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -24851,8 +24851,7 @@
 }
 
 TransferableTypedDataPtr TransferableTypedData::New(uint8_t* data,
-                                                    intptr_t length,
-                                                    Heap::Space space) {
+                                                    intptr_t length) {
   TransferableTypedDataPeer* peer = new TransferableTypedDataPeer(data, length);
 
   Thread* thread = Thread::Current();
@@ -24860,7 +24859,8 @@
   {
     ObjectPtr raw = Object::Allocate(
         TransferableTypedData::kClassId, TransferableTypedData::InstanceSize(),
-        space, TransferableTypedData::ContainsCompressedPointers());
+        thread->heap()->SpaceForExternal(length),
+        TransferableTypedData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     thread->heap()->SetPeer(raw, peer);
     result ^= raw;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 8461552..c3361b3 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -11138,9 +11138,7 @@
 
 class TransferableTypedData : public Instance {
  public:
-  static TransferableTypedDataPtr New(uint8_t* data,
-                                      intptr_t len,
-                                      Heap::Space space = Heap::kNew);
+  static TransferableTypedDataPtr New(uint8_t* data, intptr_t len);
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(UntaggedTransferableTypedData));
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 6617eec..655857e 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1689,7 +1689,7 @@
   ASSERT(reader != nullptr);
 
   ASSERT(!Snapshot::IsFull(kind));
-  const intptr_t length = reader->Read<int32_t>();
+  const intptr_t length = reader->Read<int64_t>();
 
   const FinalizableData finalizable_data =
       static_cast<MessageSnapshotReader*>(reader)->finalizable_data()->Take();
@@ -1726,7 +1726,7 @@
 
   writer->WriteIndexedObject(GetClassId());
   writer->WriteTags(writer->GetObjectTags(this));
-  writer->Write<int32_t>(length);
+  writer->Write<int64_t>(length);
 
   static_cast<MessageWriter*>(writer)->finalizable_data()->Put(
       length, data, tpeer,
diff --git a/tools/VERSION b/tools/VERSION
index 443649c..4791dbb5 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 147
+PRERELEASE 148
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/gn.py b/tools/gn.py
index f711dd3..108adca 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -175,6 +175,8 @@
     if gn_args['target_os'] in ['linux', 'win']:
         gn_args['dart_use_fallback_root_certificates'] = True
 
+    gn_args['bssl_use_clang_integrated_as'] = True
+
     # Use tcmalloc only when targeting Linux and when not using ASAN.
     gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
                                     sanitizer == 'none')
