Version 2.17.0-80.0.dev

Merge commit '0ec4c3a1b54cd8732795ba46c2617e0b47667d39' into 'dev'
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
index d2d2bec..fa99c2b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
@@ -132,11 +132,13 @@
         // the file we're importing into, rather than the full URI.
         final pathContext = server.resourceProvider.pathContext;
         final autoImportDisplayUri = libraryUri.isScheme('file')
-            ? pathContext.relative(
+            // Compute the relative path and then put into a URI so the display
+            // always uses forward slashes (as a URI) regardless of platform.
+            ? Uri.file(pathContext.relative(
                 libraryUri.toFilePath(),
                 from: pathContext.dirname(file),
-              )
-            : libraryUri.toString();
+              ))
+            : libraryUri;
 
         return success(CompletionItem(
           label: item.label,
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index 4c4cafb..63d8ec0 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -125,7 +125,7 @@
 
   Future<List<CompletionSuggestion>> getSuggestions() async {
     var request = CompletionGetSuggestionsParams(
-      server.testFilePath,
+      server.convertPath(server.testFilePath),
       completionOffset,
     ).toRequest('0');
     var response = await server.handleRequest(request);
@@ -138,7 +138,7 @@
 
   Future<List<CompletionSuggestion>> getSuggestions2() async {
     var request = CompletionGetSuggestions2Params(
-      server.testFilePath,
+      server.convertPath(server.testFilePath),
       completionOffset,
       1 << 16,
       timeout: 60 * 1000,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
index 1da0c9d..6aff080 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
@@ -81,6 +81,25 @@
 ''');
   }
 
+  Future<void> test_nonNullable_superParameter() async {
+    await resolveTestCode('''
+class C {
+  C({required int param});
+}
+class D extends C {
+  D({super.param});
+}
+''');
+    await assertHasFix('''
+class C {
+  C({required int param});
+}
+class D extends C {
+  D({required super.param});
+}
+''');
+  }
+
   Future<void> test_withRequiredAnnotation() async {
     writeTestPackageConfig(meta: true);
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_trailing_comma_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_trailing_comma_test.dart
index bf7c774..f8ba15b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_trailing_comma_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_trailing_comma_test.dart
@@ -72,7 +72,22 @@
   @override
   String get lintCode => LintNames.require_trailing_commas;
 
-  Future<void> test_comma() async {
+  Future<void> test_named() async {
+    await resolveTestCode('''
+void f({a, b}) {
+  f(a: 'a',
+    b: 'b');
+}
+''');
+    await assertHasFix('''
+void f({a, b}) {
+  f(a: 'a',
+    b: 'b',);
+}
+''');
+  }
+
+  Future<void> test_positional() async {
     await resolveTestCode('''
 void f(a, b) {
   f('a',
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
index d904bf6..a549699 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_generic_function_syntax_test.dart
@@ -114,14 +114,29 @@
 }
 
 @reflectiveTest
-class UseFunctionTypeSyntaxForParametersTest extends FixProcessorLintTest
-    with WithNullSafetyLintMixin {
+class UseFunctionTypeSyntaxForParametersTest extends FixProcessorLintTest {
   @override
   FixKind get kind => DartFixKind.CONVERT_TO_GENERIC_FUNCTION_SYNTAX;
 
   @override
   String get lintCode => LintNames.use_function_type_syntax_for_parameters;
 
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/3212')
+  Future<void> test_functionTypedParameter_fieldFormal() async {
+    await resolveTestCode('''
+class C {
+  String Function(int) f;
+  C(String this.f(int x));
+}
+''');
+    await assertHasFix('''
+class C {
+  String Function(int) f;
+  C(String Function(int x) this.f);
+}
+''');
+  }
+
   Future<void> test_functionTypedParameter_noParameterTypes() async {
     await resolveTestCode('''
 g(String f(x)) {}
@@ -155,4 +170,24 @@
 g(String Function(int x) f) {}
 ''');
   }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/3212')
+  Future<void> test_functionTypedParameter_superParameter() async {
+    await resolveTestCode('''
+class C {
+  C(String Function(int x) f);
+}
+class D extends C {
+  D(String super.f(int x));
+}
+''');
+    await assertHasFix('''
+class C {
+  C(String Function(int x) f);
+}
+class D extends C {
+  D(String Function(int x) super.f);
+}
+''');
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index fc0eaa0..7de85d0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -236,6 +236,7 @@
   void setUp() {
     super.setUp();
     createAnalysisOptionsFile(
+      experiments: experiments,
       lints: [lintCode],
     );
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
index 9d27944..c9ab551 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
@@ -107,9 +107,6 @@
 ''');
   }
 
-  @FailingTest(
-    issue: 'https://github.com/dart-lang/linter/issues/3082',
-  )
   Future<void> test_named_betweenRequiredPositional() async {
     await resolveTestCode('''
 void foo(int a, int b, {bool c = true}) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
index 573a033..1992d3f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
@@ -106,6 +106,25 @@
 ''');
   }
 
+  Future<void> test_parameter_super() async {
+    await resolveTestCode('''
+class C {
+  C({String? s});
+}
+class D extends C {
+  D({super.s = null});
+}
+''');
+    await assertHasFix('''
+class C {
+  C({String? s});
+}
+class D extends C {
+  D({super.s});
+}
+''');
+  }
+
   Future<void> test_topLevel() async {
     await resolveTestCode('''
 var x = null;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
index f92c463..deefa32 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
@@ -231,7 +231,7 @@
   @override
   String get lintCode => LintNames.type_init_formals;
 
-  Future<void> test_void() async {
+  Future<void> test_formalFieldParameter() async {
     await resolveTestCode('''
 class C {
   int f;
@@ -245,4 +245,23 @@
 }
 ''');
   }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/3210')
+  Future<void> test_superParameter() async {
+    // If this issue gets closed as "won't fix," remove this test.
+    await resolveTestCode('''
+class C {
+  C(int f);
+}
+class D extends C {
+  D(int super.f);
+}
+''');
+    await assertHasFix('''
+class C {
+  int f;
+  C(super.f);
+}
+''');
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
index 6c5fb20..39f4ed5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_colon_with_equals_test.dart
@@ -55,4 +55,23 @@
 void f({int a = 1}) => null;
 ''');
   }
+
+  Future<void> test_superParameter() async {
+    await resolveTestCode('''
+class C {
+  C({int? i});
+}
+class D extends C {
+  D({int? super.i: 1});
+}
+''');
+    await assertHasFix('''
+class C {
+  C({int? i});
+}
+class D extends C {
+  D({int? super.i = 1});
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index a819b7f..e75af1d 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 3.3.0-dev
 * Added `getField` to `ExtensionElement`.
+* Added `isGenerative` to `ConstructorElement`.
+* Added `isDartCoreEnum` to `ClassElement` and `DartType`.
 
 ## 3.2.0
 * Deprecated `changes` getter in `File` and `Folder`, use `watch()` instead.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 2ee4830..e0478a0 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -104,6 +104,10 @@
   /// <i>abstract</i> is different from <i>has unimplemented members</i>.
   bool get isAbstract;
 
+  /// Return `true` if this class represents the class 'Enum' defined in the
+  /// dart:core library.
+  bool get isDartCoreEnum;
+
   /// Return `true` if this class represents the class 'Object' defined in the
   /// dart:core library.
   bool get isDartCoreObject;
@@ -468,6 +472,9 @@
   /// Return `true` if this constructor represents a factory constructor.
   bool get isFactory;
 
+  /// Return `true` if this constructor represents a generative constructor.
+  bool get isGenerative;
+
   @override
   String get name;
 
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index e3f102e..2f479bd 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -69,6 +69,10 @@
   /// dart:core library.
   bool get isDartCoreDouble;
 
+  /// Return `true` if this type represents the type 'Enum' defined in the
+  /// dart:core library.
+  bool get isDartCoreEnum;
+
   /// Return `true` if this type represents the type 'Function' defined in the
   /// dart:core library.
   bool get isDartCoreFunction;
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index d643def..79182f9 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -208,6 +208,7 @@
   CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
   CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE,
+  CompileTimeErrorCode.ILLEGAL_LANGUAGE_VERSION_OVERRIDE,
   CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
   CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 97b16e1..834d75a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5107,6 +5107,11 @@
   /// The body of the function.
   FunctionBodyImpl _body;
 
+  /// If resolution has been performed, this boolean indicates whether a
+  /// function type was supplied via context for this function expression.
+  /// `false` if resolution hasn't been performed yet.
+  bool wasFunctionTypeSupplied = false;
+
   @override
   ExecutableElement? declaredElement;
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index df1d7da..b0f4037 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -125,6 +125,11 @@
   }
 
   @override
+  bool get isDartCoreEnum {
+    return name == 'Enum' && library.isDartCore;
+  }
+
+  @override
   bool get isDartCoreObject => false;
 
   @override
@@ -1473,6 +1478,11 @@
     // OK, can be used as default constructor
     return true;
   }
+
+  @override
+  bool get isGenerative {
+    return !isFactory;
+  }
 }
 
 /// A [TopLevelVariableElement] for a top-level 'const' variable that has an
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 69fc60b..decbd59 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -8,18 +8,6 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:meta/meta_meta.dart';
 
-extension ClassElementExtension on ClassElement {
-  bool get isDartCoreEnum {
-    return name == 'Enum' && library.isDartCore;
-  }
-}
-
-extension ConstructorElementExtension on ConstructorElement {
-  bool get isGenerative {
-    return !isFactory;
-  }
-}
-
 extension ElementAnnotationExtensions on ElementAnnotation {
   static final Map<String, TargetKind> _targetKindsByName = {
     for (final kind in TargetKind.values) kind.toString(): kind,
@@ -121,12 +109,6 @@
   }
 }
 
-extension InterfaceTypeExtension on InterfaceType {
-  bool get isDartCoreEnum {
-    return element.isDartCoreEnum;
-  }
-}
-
 extension ParameterElementExtensions on ParameterElement {
   /// Return [ParameterElement] with the specified properties replaced.
   ParameterElement copyWith({
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 70f398c..b367dd1 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -532,6 +532,11 @@
   }
 
   @override
+  bool get isDartCoreEnum {
+    return element.isDartCoreEnum;
+  }
+
+  @override
   bool get isDartCoreFunction {
     return element.name == "Function" && element.library.isDartCore;
   }
@@ -988,6 +993,9 @@
   bool get isDartCoreDouble => false;
 
   @override
+  bool get isDartCoreEnum => false;
+
+  @override
   bool get isDartCoreFunction => false;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 718c99b..1009c21 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -69,13 +69,14 @@
     // TODO(scheglov) Use VariableElement and do in resolveForWrite() ?
     _assignmentShared.checkFinalAlreadyAssigned(left);
 
+    DartType? rhsContext;
     {
       var leftType = node.writeType;
       if (writeElement is VariableElement) {
         leftType = _resolver.localVariableTypeProvider
             .getType(left as SimpleIdentifier, isRead: false);
       }
-      _setRhsContext(node, leftType!, operator, right);
+      rhsContext = _computeRhsContext(node, leftType!, operator, right);
     }
 
     var flow = _resolver.flowAnalysis.flow;
@@ -83,7 +84,7 @@
       flow.ifNullExpression_rightBegin(left, node.readType!);
     }
 
-    right.accept(_resolver);
+    _resolver.analyzeExpression(right, rhsContext);
     right = node.rightHandSide;
     var whyNotPromoted = flow?.whyNotPromoted(right);
 
@@ -147,6 +148,28 @@
     return true;
   }
 
+  DartType? _computeRhsContext(AssignmentExpressionImpl node, DartType leftType,
+      TokenType operator, Expression right) {
+    switch (operator) {
+      case TokenType.EQ:
+      case TokenType.QUESTION_QUESTION_EQ:
+        return leftType;
+      case TokenType.AMPERSAND_AMPERSAND_EQ:
+      case TokenType.BAR_BAR_EQ:
+        return _typeProvider.boolType;
+      default:
+        var method = node.staticElement;
+        if (method != null) {
+          var parameters = method.parameters;
+          if (parameters.isNotEmpty) {
+            return _typeSystem.refineNumericInvocationContext(
+                leftType, method, leftType, parameters[0].type);
+          }
+        }
+        return null;
+    }
+  }
+
   void _resolveOperator(AssignmentExpressionImpl node) {
     var left = node.leftHandSide;
     var operator = node.operator;
@@ -260,32 +283,6 @@
           whyNotPromoted: whyNotPromoted);
     }
   }
-
-  void _setRhsContext(AssignmentExpressionImpl node, DartType leftType,
-      TokenType operator, Expression right) {
-    switch (operator) {
-      case TokenType.EQ:
-      case TokenType.QUESTION_QUESTION_EQ:
-        InferenceContext.setType(right, leftType);
-        break;
-      case TokenType.AMPERSAND_AMPERSAND_EQ:
-      case TokenType.BAR_BAR_EQ:
-        InferenceContext.setType(right, _typeProvider.boolType);
-        break;
-      default:
-        var method = node.staticElement;
-        if (method != null) {
-          var parameters = method.parameters;
-          if (parameters.isNotEmpty) {
-            InferenceContext.setType(
-                right,
-                _typeSystem.refineNumericInvocationContext(
-                    leftType, method, leftType, parameters[0].type));
-          }
-        }
-        break;
-    }
-  }
 }
 
 class AssignmentExpressionShared {
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index ad08e2b..927a635 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -140,9 +140,8 @@
     if (leftContextType != null && _isNonNullableByDefault) {
       leftContextType = _typeSystem.makeNullable(leftContextType);
     }
-    InferenceContext.setType(left, leftContextType);
 
-    left.accept(_resolver);
+    _resolver.analyzeExpression(left, leftContextType);
     left = node.leftOperand;
     var leftType = left.typeOrThrow;
 
@@ -150,10 +149,9 @@
     if (rightContextType == null || rightContextType.isDynamic) {
       rightContextType = leftType;
     }
-    InferenceContext.setType(right, rightContextType);
 
     flow?.ifNullExpression_rightBegin(left, leftType);
-    right.accept(_resolver);
+    _resolver.analyzeExpression(right, rightContextType);
     right = node.rightOperand;
     flow?.ifNullExpression_end();
 
@@ -172,18 +170,15 @@
     var right = node.rightOperand;
     var flow = _resolver.flowAnalysis.flow;
 
-    InferenceContext.setType(left, _typeProvider.boolType);
-    InferenceContext.setType(right, _typeProvider.boolType);
-
     flow?.logicalBinaryOp_begin();
-    left.accept(_resolver);
+    _resolver.analyzeExpression(left, _typeProvider.boolType);
     left = node.leftOperand;
     var leftWhyNotPromoted = _resolver.flowAnalysis.flow?.whyNotPromoted(left);
 
     flow?.logicalBinaryOp_rightBegin(left, node, isAnd: true);
     _resolver.checkUnreachableNode(right);
 
-    right.accept(_resolver);
+    _resolver.analyzeExpression(right, _typeProvider.boolType);
     right = node.rightOperand;
     var rightWhyNotPromoted =
         _resolver.flowAnalysis.flow?.whyNotPromoted(right);
@@ -202,18 +197,15 @@
     var right = node.rightOperand;
     var flow = _resolver.flowAnalysis.flow;
 
-    InferenceContext.setType(left, _typeProvider.boolType);
-    InferenceContext.setType(right, _typeProvider.boolType);
-
     flow?.logicalBinaryOp_begin();
-    left.accept(_resolver);
+    _resolver.analyzeExpression(left, _typeProvider.boolType);
     left = node.leftOperand;
     var leftWhyNotPromoted = _resolver.flowAnalysis.flow?.whyNotPromoted(left);
 
     flow?.logicalBinaryOp_rightBegin(left, node, isAnd: false);
     _resolver.checkUnreachableNode(right);
 
-    right.accept(_resolver);
+    _resolver.analyzeExpression(right, _typeProvider.boolType);
     right = node.rightOperand;
     var rightWhyNotPromoted =
         _resolver.flowAnalysis.flow?.whyNotPromoted(right);
@@ -251,20 +243,19 @@
     _resolveUserDefinableElement(node, operator.lexeme);
 
     var invokeType = node.staticInvokeType;
+    DartType? contextType;
     if (invokeType != null && invokeType.parameters.isNotEmpty) {
       // If this is a user-defined operator, set the right operand context
       // using the operator method's parameter type.
       var rightParam = invokeType.parameters[0];
-      InferenceContext.setType(
-          right,
-          _typeSystem.refineNumericInvocationContext(
-              left.staticType,
-              node.staticElement,
-              InferenceContext.getContext(node),
-              rightParam.type));
+      contextType = _typeSystem.refineNumericInvocationContext(
+          left.staticType,
+          node.staticElement,
+          InferenceContext.getContext(node),
+          rightParam.type);
     }
 
-    right.accept(_resolver);
+    _resolver.analyzeExpression(right, contextType);
     right = node.rightOperand;
     var whyNotPromoted = _resolver.flowAnalysis.flow?.whyNotPromoted(right);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index 82ca086..dceec2d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -24,11 +24,14 @@
 
   void resolveElement(ForElementImpl node, CollectionLiteralContext? context) {
     var forLoopParts = node.forLoopParts;
+    void visitBody() {
+      node.body.resolveElement(_resolver, context);
+    }
+
     if (forLoopParts is ForPartsImpl) {
-      _forParts(node, forLoopParts, node.body, context: context);
+      _forParts(node, forLoopParts, visitBody);
     } else if (forLoopParts is ForEachPartsImpl) {
-      _forEachParts(node, node.awaitKeyword != null, forLoopParts, node.body,
-          context: context);
+      _forEachParts(node, node.awaitKeyword != null, forLoopParts, visitBody);
     }
   }
 
@@ -36,10 +39,14 @@
     _resolver.checkUnreachableNode(node);
 
     var forLoopParts = node.forLoopParts;
+    void visitBody() {
+      node.body.accept(_resolver);
+    }
+
     if (forLoopParts is ForPartsImpl) {
-      _forParts(node, forLoopParts, node.body);
+      _forParts(node, forLoopParts, visitBody);
     } else if (forLoopParts is ForEachPartsImpl) {
-      _forEachParts(node, node.awaitKeyword != null, forLoopParts, node.body);
+      _forEachParts(node, node.awaitKeyword != null, forLoopParts, visitBody);
     }
   }
 
@@ -68,9 +75,8 @@
     }
   }
 
-  void _forEachParts(
-      AstNode node, bool isAsync, ForEachParts forEachParts, AstNode body,
-      {CollectionLiteralContext? context}) {
+  void _forEachParts(AstNode node, bool isAsync, ForEachParts forEachParts,
+      void Function() visitBody) {
     Expression iterable = forEachParts.iterable;
     DeclaredIdentifier? loopVariable;
     SimpleIdentifier? identifier;
@@ -103,14 +109,14 @@
         }
       }
     }
+    InterfaceType? targetType;
     if (valueType != null) {
-      InterfaceType targetType = isAsync
+      targetType = isAsync
           ? _resolver.typeProvider.streamType(valueType)
           : _resolver.typeProvider.iterableType(valueType);
-      InferenceContext.setType(iterable, targetType);
     }
 
-    iterable.accept(_resolver);
+    _resolver.analyzeExpression(iterable, targetType);
     iterable = forEachParts.iterable;
 
     _resolver.nullableDereferenceVerifier.expression(
@@ -139,13 +145,12 @@
           elementType ?? DynamicTypeImpl.instance, null);
     }
 
-    _visitBody(body, context);
+    visitBody();
 
     _resolver.flowAnalysis.flow?.forEach_end();
   }
 
-  void _forParts(AstNode node, ForParts forParts, AstNode body,
-      {CollectionLiteralContext? context}) {
+  void _forParts(AstNode node, ForParts forParts, void Function() visitBody) {
     if (forParts is ForPartsWithDeclarations) {
       forParts.variables.accept(_resolver);
     } else if (forParts is ForPartsWithExpression) {
@@ -156,8 +161,7 @@
 
     var condition = forParts.condition;
     if (condition != null) {
-      InferenceContext.setType(condition, _resolver.typeProvider.boolType);
-      condition.accept(_resolver);
+      _resolver.analyzeExpression(condition, _resolver.typeProvider.boolType);
       condition = forParts.condition!;
       var whyNotPromoted =
           _resolver.flowAnalysis.flow?.whyNotPromoted(condition);
@@ -166,20 +170,11 @@
     }
 
     _resolver.flowAnalysis.for_bodyBegin(node, condition);
-    _visitBody(body, context);
+    visitBody();
 
     _resolver.flowAnalysis.flow?.for_updaterBegin();
     forParts.updaters.accept(_resolver);
 
     _resolver.flowAnalysis.flow?.for_end();
   }
-
-  void _visitBody(AstNode body, CollectionLiteralContext? context) {
-    if (body is CollectionElementImpl) {
-      body.resolveElement(_resolver, context);
-    } else {
-      assert(body is Statement);
-      body.accept(_resolver);
-    }
-  }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
index 7204620..94ee5b4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -43,8 +43,10 @@
     }
 
     var contextType = InferenceContext.getContext(node);
+    bool wasFunctionTypeSupplied = contextType is FunctionType;
+    node.wasFunctionTypeSupplied = wasFunctionTypeSupplied;
     DartType? imposedType;
-    if (contextType is FunctionType) {
+    if (wasFunctionTypeSupplied) {
       contextType = _matchTypeParameters(
         node.typeParameters,
         contextType,
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 376a9d7..f6d223d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -197,14 +197,11 @@
     }
 
     var contextType = InferenceContext.getContext(node);
-    if (contextType != null) {
-      if (_isNonNullableByDefault) {
-        contextType = _typeSystem.makeNullable(contextType);
-      }
-      InferenceContext.setType(operand, contextType);
+    if (contextType != null && _isNonNullableByDefault) {
+      contextType = _typeSystem.makeNullable(contextType);
     }
 
-    operand.accept(_resolver);
+    _resolver.analyzeExpression(operand, contextType);
     operand = node.operand;
 
     var operandType = operand.typeOrThrow;
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index a108a8b..c94eb2b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -213,9 +213,8 @@
 
   void _resolveNegation(PrefixExpressionImpl node) {
     var operand = node.operand;
-    InferenceContext.setType(operand, _typeProvider.boolType);
 
-    operand.accept(_resolver);
+    _resolver.analyzeExpression(operand, _typeProvider.boolType);
     operand = node.operand;
     var whyNotPromoted = _resolver.flowAnalysis.flow?.whyNotPromoted(operand);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
index 5cbf8db..3dd455d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variable_declaration_resolver.dart
@@ -49,8 +49,7 @@
       _resolver.flowAnalysis.flow?.lateInitializer_begin(node);
     }
 
-    InferenceContext.setType(initializer, element.type);
-    initializer.accept(_resolver);
+    _resolver.analyzeExpression(initializer, element.type);
     initializer = node.initializer!;
     var whyNotPromoted =
         _resolver.flowAnalysis.flow?.whyNotPromoted(initializer);
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 0016d66..c8c5504 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -133,13 +133,30 @@
     }
   }
 
+  DartType? _computeContextType(
+    BodyInferenceContext bodyContext,
+    YieldStatement node,
+  ) {
+    var elementType = bodyContext.contextType;
+    if (elementType != null) {
+      var contextType = elementType;
+      if (node.star != null) {
+        contextType = bodyContext.isSynchronous
+            ? _typeProvider.iterableType(elementType)
+            : _typeProvider.streamType(elementType);
+      }
+      return contextType;
+    } else {
+      return null;
+    }
+  }
+
   void _resolve_generator(
     BodyInferenceContext bodyContext,
     YieldStatement node,
   ) {
-    _setContextType(bodyContext, node);
-
-    node.expression.accept(_resolver);
+    _resolver.analyzeExpression(
+        node.expression, _computeContextType(bodyContext, node));
 
     if (node.star != null) {
       _resolver.nullableDereferenceVerifier.expression(
@@ -167,20 +184,4 @@
 
     _checkForUseOfVoidResult(node.expression);
   }
-
-  void _setContextType(
-    BodyInferenceContext bodyContext,
-    YieldStatement node,
-  ) {
-    var elementType = bodyContext.contextType;
-    if (elementType != null) {
-      var contextType = elementType;
-      if (node.star != null) {
-        contextType = bodyContext.isSynchronous
-            ? _typeProvider.iterableType(elementType)
-            : _typeProvider.streamType(elementType);
-      }
-      InferenceContext.setType(node.expression, contextType);
-    }
-  }
 }
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 45dce24..74bf441 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -32,7 +32,6 @@
 import 'package:analyzer/src/error/null_safe_api_verifier.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
@@ -529,8 +528,7 @@
     if (node.parent is! FunctionDeclaration) {
       _checkForMissingReturn(node.body, node);
     }
-    var functionType = InferenceContext.getContext(node);
-    if (functionType is! FunctionType) {
+    if (!(node as FunctionExpressionImpl).wasFunctionTypeSupplied) {
       _checkStrictInferenceInParameters(node.parameters, body: node.body);
     }
     super.visitFunctionExpression(node);
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index 9666c16..e3bf80e 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -5690,6 +5690,14 @@
     hasPublishedDocs: true,
   );
 
+  static const CompileTimeErrorCode ILLEGAL_LANGUAGE_VERSION_OVERRIDE =
+      CompileTimeErrorCode(
+    'ILLEGAL_LANGUAGE_VERSION_OVERRIDE',
+    "The language version must be {0}.",
+    correctionMessage:
+        "Try removing the language version override and migrating the code.",
+  );
+
   /**
    * No parameters.
    */
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 5b3d27f..fec81ec 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 6741d98..bc9aba5 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -224,6 +224,10 @@
   @override
   VersionConstraint? sdkVersionConstraint;
 
+  /// The constraint on the language version for every Dart file.
+  /// Violations will be reported as analysis errors.
+  VersionConstraint? sourceLanguageConstraint;
+
   ExperimentStatus _contextFeatures = ExperimentStatus();
 
   /// The language version to use for libraries that are not in a package.
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 6d17094..b46f83c 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -22,7 +22,6 @@
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
@@ -488,6 +487,7 @@
     _featureSet = node.featureSet;
     _duplicateDefinitionVerifier.checkUnit(node);
     _checkForDeferredPrefixCollisions(node);
+    _checkForIllegalLanguageOverride(node);
     super.visitCompilationUnit(node);
     _featureSet = null;
   }
@@ -2687,6 +2687,29 @@
     }
   }
 
+  void _checkForIllegalLanguageOverride(CompilationUnit node) {
+    var sourceLanguageConstraint = _options.sourceLanguageConstraint;
+    if (sourceLanguageConstraint == null) {
+      return;
+    }
+
+    var languageVersionToken = node.languageVersionToken;
+    if (languageVersionToken == null) {
+      return;
+    }
+
+    var languageVersion = _currentLibrary.languageVersion.effective;
+    if (sourceLanguageConstraint.allows(languageVersion)) {
+      return;
+    }
+
+    errorReporter.reportErrorForToken(
+      CompileTimeErrorCode.ILLEGAL_LANGUAGE_VERSION_OVERRIDE,
+      languageVersionToken,
+      ['$sourceLanguageConstraint'],
+    );
+  }
+
   /// Verify that the given implements [clause] does not implement classes such
   /// as 'num' or 'String'.
   ///
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 8506477..375c076 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -957,8 +957,7 @@
         hasWrite: true,
       );
 
-      InferenceContext.setType(node.index, result.indexContextType);
-      node.index.accept(this);
+      analyzeExpression(node.index, result.indexContextType);
       var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(node.index);
       checkIndexExpressionIndex(
         node.index,
@@ -1174,9 +1173,8 @@
 
   @override
   void visitAssertInitializer(AssertInitializer node) {
-    InferenceContext.setType(node.condition, typeProvider.boolType);
     flowAnalysis.flow?.assert_begin();
-    node.condition.accept(this);
+    analyzeExpression(node.condition, typeProvider.boolType);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
       errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
@@ -1189,9 +1187,8 @@
 
   @override
   void visitAssertStatement(AssertStatement node) {
-    InferenceContext.setType(node.condition, typeProvider.boolType);
     flowAnalysis.flow?.assert_begin();
-    node.condition.accept(this);
+    analyzeExpression(node.condition, typeProvider.boolType);
     boolExpressionVerifier.checkForNonBoolExpression(
       node.condition,
       errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
@@ -1211,12 +1208,12 @@
   @override
   void visitAwaitExpression(AwaitExpression node) {
     var contextType = InferenceContext.getContext(node);
+    DartType? futureUnion;
     if (contextType != null) {
-      var futureUnion = _createFutureOr(contextType);
-      InferenceContext.setType(node.expression, futureUnion);
+      futureUnion = _createFutureOr(contextType);
     }
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    analyzeExpression(node.expression, futureUnion);
     typeAnalyzer.visitAwaitExpression(node as AwaitExpressionImpl);
     insertGenericFunctionInstantiation(node);
   }
@@ -1273,8 +1270,7 @@
 
   @override
   void visitCascadeExpression(covariant CascadeExpressionImpl node) {
-    InferenceContext.setTypeFromNode(node.target, node);
-    node.target.accept(this);
+    analyzeExpression(node.target, InferenceContext.getContext(node));
 
     if (node.isNullAware) {
       flowAnalysis.flow!.nullAwareAccess_rightBegin(
@@ -1349,38 +1345,35 @@
 
   @override
   void visitConditionalExpression(ConditionalExpression node) {
+    var contextType = InferenceContext.getContext(node);
     Expression condition = node.condition;
     var flow = flowAnalysis.flow;
     flow?.conditional_conditionBegin();
 
     // TODO(scheglov) Do we need these checks for null?
-    InferenceContext.setType(node.condition, typeProvider.boolType);
-    condition.accept(this);
+    analyzeExpression(node.condition, typeProvider.boolType);
     condition = node.condition;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(condition);
     boolExpressionVerifier.checkForNonBoolCondition(condition,
         whyNotPromoted: whyNotPromoted);
 
-    InferenceContext.setTypeFromNode(node.thenExpression, node);
-
     if (flow != null) {
       flow.conditional_thenBegin(condition, node);
       checkUnreachableNode(node.thenExpression);
     }
-    node.thenExpression.accept(this);
+    analyzeExpression(node.thenExpression, contextType);
     nullSafetyDeadCodeVerifier.flowEnd(node.thenExpression);
 
     Expression elseExpression = node.elseExpression;
-    InferenceContext.setTypeFromNode(elseExpression, node);
 
     if (flow != null) {
       flow.conditional_elseBegin(node.thenExpression);
       checkUnreachableNode(elseExpression);
-      elseExpression.accept(this);
+      analyzeExpression(elseExpression, contextType);
       flow.conditional_end(node, elseExpression);
       nullSafetyDeadCodeVerifier.flowEnd(elseExpression);
     } else {
-      elseExpression.accept(this);
+      analyzeExpression(elseExpression, contextType);
     }
     elseExpression = node.elseExpression;
 
@@ -1440,8 +1433,7 @@
     var fieldElement = enclosingClass!.getField(node.fieldName.name);
     var fieldType = fieldElement?.type;
     var expression = node.expression;
-    InferenceContext.setType(expression, fieldType);
-    expression.accept(this);
+    analyzeExpression(expression, fieldType);
     expression = node.expression;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(expression);
     elementResolver.visitConstructorFieldInitializer(
@@ -1497,13 +1489,16 @@
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
-    InferenceContext.setType(node.defaultValue, node.declaredElement?.type);
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    node.parameter.accept(this);
+    var defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      analyzeExpression(defaultValue, node.declaredElement?.type);
+    }
     ParameterElement element = node.declaredElement!;
 
     if (element is DefaultParameterElementImpl && node.isOfLocalFunction) {
-      element.constantInitializer = node.defaultValue;
+      element.constantInitializer = defaultValue;
     }
   }
 
@@ -1517,8 +1512,7 @@
     node.body.accept(this);
 
     flowAnalysis.flow?.doStatement_conditionBegin();
-    InferenceContext.setType(condition, typeProvider.boolType);
-    condition.accept(this);
+    analyzeExpression(condition, typeProvider.boolType);
     condition = node.condition;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(condition);
     boolExpressionVerifier.checkForNonBoolCondition(condition,
@@ -1579,11 +1573,7 @@
             parameters: constructor.parameters,
           );
           for (var argument in argumentList.arguments) {
-            var parameter = argument.staticParameterElement;
-            if (parameter != null) {
-              InferenceContext.setType(argument, parameter.type);
-            }
-            argument.accept(this);
+            analyzeExpression(argument, argument.staticParameterElement?.type);
           }
         }
         arguments.typeArguments?.accept(this);
@@ -1625,14 +1615,13 @@
 
     try {
       inferenceContext.pushFunctionBodyContext(node, imposedType);
-      InferenceContext.setType(
-        node.expression,
-        inferenceContext.bodyContext!.contextType,
-      );
       _thisAccessTracker.enterFunctionBody(node);
 
       checkUnreachableNode(node);
-      node.visitChildren(this);
+      analyzeExpression(
+        node.expression,
+        inferenceContext.bodyContext!.contextType,
+      );
       insertImplicitCallReference(node.expression);
 
       flowAnalysis.flow?.handleExit();
@@ -1747,13 +1736,16 @@
     );
 
     var functionType = node.declaredElement!.type;
-    InferenceContext.setType(node.functionExpression, functionType);
 
     var outerFunction = _enclosingFunction;
     try {
       _enclosingFunction = node.declaredElement;
       checkUnreachableNode(node);
-      node.visitChildren(this);
+      node.documentationComment?.accept(this);
+      node.metadata.accept(this);
+      node.returnType?.accept(this);
+      node.name.accept(this);
+      analyzeExpression(node.functionExpression, functionType);
       elementResolver.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
@@ -1845,8 +1837,7 @@
   void visitIfElement(IfElement node, {CollectionLiteralContext? context}) {
     flowAnalysis.flow?.ifStatement_conditionBegin();
     Expression condition = node.condition;
-    InferenceContext.setType(condition, typeProvider.boolType);
-    condition.accept(this);
+    analyzeExpression(condition, typeProvider.boolType);
     condition = node.condition;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(condition);
 
@@ -1874,8 +1865,7 @@
 
     Expression condition = node.condition;
 
-    InferenceContext.setType(condition, typeProvider.boolType);
-    condition.accept(this);
+    analyzeExpression(condition, typeProvider.boolType);
     condition = node.condition;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(condition);
 
@@ -1929,8 +1919,7 @@
     var element = result.readElement;
     node.staticElement = element as MethodElement?;
 
-    InferenceContext.setType(node.index, result.indexContextType);
-    node.index.accept(this);
+    analyzeExpression(node.index, result.indexContextType);
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(node.index);
     checkIndexExpressionIndex(
       node.index,
@@ -2114,9 +2103,10 @@
 
   @override
   void visitNamedExpression(NamedExpression node) {
-    InferenceContext.setTypeFromNode(node.expression, node);
+    var contextType = InferenceContext.getContext(node);
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    node.name.accept(this);
+    analyzeExpression(node.expression, contextType);
     typeAnalyzer.visitNamedExpression(node as NamedExpressionImpl);
     // Any "why not promoted" information that flow analysis had associated with
     // `node.expression` now needs to be forwarded to `node`, so that when
@@ -2163,9 +2153,8 @@
 
   @override
   void visitParenthesizedExpression(ParenthesizedExpression node) {
-    InferenceContext.setTypeFromNode(node.expression, node);
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    analyzeExpression(node.expression, InferenceContext.getContext(node));
     typeAnalyzer
         .visitParenthesizedExpression(node as ParenthesizedExpressionImpl);
     flowAnalysis.flow?.parenthesizedExpression(node, node.expression);
@@ -2274,18 +2263,20 @@
 
   @override
   void visitReturnStatement(ReturnStatement node) {
-    InferenceContext.setType(
-      node.expression,
-      inferenceContext.bodyContext?.contextType,
-    );
-
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    var expression = node.expression;
+    if (expression != null) {
+      analyzeExpression(
+        expression,
+        inferenceContext.bodyContext?.contextType,
+      );
+      // Pick up the expression again in case it was rewritten.
+      expression = node.expression;
+    }
 
-    inferenceContext.bodyContext?.addReturnExpression(node.expression);
+    inferenceContext.bodyContext?.addReturnExpression(expression);
     flowAnalysis.flow?.handleExit();
 
-    var expression = node.expression;
     if (expression != null) {
       insertImplicitCallReference(expression);
     }
@@ -2379,10 +2370,10 @@
   void visitSwitchCase(SwitchCase node) {
     checkUnreachableNode(node);
 
-    InferenceContext.setType(
-        node.expression, _enclosingSwitchStatementExpressionType);
     checkUnreachableNode(node);
-    node.visitChildren(this);
+    node.labels.accept(this);
+    analyzeExpression(node.expression, _enclosingSwitchStatementExpressionType);
+    node.statements.accept(this);
 
     var flow = flowAnalysis.flow;
     if (flow != null && flow.isReachable && _isNonNullableByDefault) {
@@ -2578,10 +2569,9 @@
     checkUnreachableNode(node);
 
     Expression condition = node.condition;
-    InferenceContext.setType(condition, typeProvider.boolType);
 
     flowAnalysis.flow?.whileStatement_conditionBegin(node);
-    condition.accept(this);
+    analyzeExpression(condition, typeProvider.boolType);
     condition = node.condition;
     var whyNotPromoted = flowAnalysis.flow?.whyNotPromoted(condition);
 
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index ead4620..e3976e43 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -93,14 +93,11 @@
       node.accept(_resolutionVisitor);
       // Node may have been rewritten so get it again.
       node = getNode();
-      if (contextType != null) {
-        InferenceContext.setType(node, contextType);
-      }
       node.accept(_scopeResolverVisitor);
     }
     _prepareEnclosingDeclarations();
     _flowAnalysis.topLevelDeclaration_enter(node.parent!, null);
-    node.accept(_resolverVisitor);
+    _resolverVisitor.analyzeExpression(node, contextType);
     _flowAnalysis.topLevelDeclaration_exit();
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 5764311..892c2fb 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -220,9 +220,6 @@
       hasConstConstructor: true,
     );
 
-    var needsImplicitConstructor =
-        !node.members.any((e) => e is ConstructorDeclaration);
-
     // Build fields for all enum constants.
     var constants = node.constants;
     var valuesElements = <Expression>[];
@@ -353,6 +350,10 @@
       _visitPropertyFirst<FieldDeclaration>(node.members);
     });
 
+    var needsImplicitConstructor = !holder.constructors.any(
+      (e) => e.name.isEmpty || e.isGenerative,
+    );
+
     if (needsImplicitConstructor) {
       holder.addConstructor(
         ConstructorElementImpl('', -1)
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index 5198c44..ae54e97 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -692,13 +692,16 @@
           .getFolder(root)
           .getChildAssumingFile('BUILD')
           .readAsStringSync();
-      var hasNonNullableFlag = buildContent
+      var flattenedBuildContent = buildContent
           .split('\n')
           .map((e) => e.trim())
           .where((e) => !e.startsWith('#'))
           .map((e) => e.replaceAll(' ', ''))
-          .join()
-          .contains('dart_package(null_safety=True');
+          .join();
+      var hasNonNullableFlag = const {
+        'dart_package(null_safety=True',
+        'dart_package(sound_null_safety=True',
+      }.any(flattenedBuildContent.contains);
       if (hasNonNullableFlag) {
         // Enabled by default.
       } else {
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 8fa7b1a..50014bb 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -4992,6 +4992,9 @@
       ```dart
       int f() => 0;
       ```
+  ILLEGAL_LANGUAGE_VERSION_OVERRIDE:
+    problemMessage: The language version must be {0}.
+    correctionMessage: Try removing the language version override and migrating the code.
   ILLEGAL_SYNC_GENERATOR_RETURN_TYPE:
     problemMessage: "Functions marked 'sync*' must have a return type that is a supertype of 'Iterable<T>' for some type 'T'."
     correctionMessage: "Try fixing the return type of the function, or removing the modifier 'sync*' from the function body."
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 9f2e227..fd06856 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -212,6 +212,10 @@
     );
   }
 
+  /// Override this method to update [analysisOptions] for every context root,
+  /// the default or already updated with `analysis_options.yaml` file.
+  void updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {}
+
   /// Call this method if the test needs to use the empty byte store, without
   /// any information cached.
   void useEmptyByteStore() {
@@ -241,6 +245,7 @@
       resourceProvider: resourceProvider,
       retainDataForTesting: retainDataForTesting,
       sdkPath: sdkRoot.path,
+      updateAnalysisOptions: updateAnalysisOptions,
     );
 
     verifyCreatedCollection();
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
index 8340942..65aaa92 100644
--- a/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_bazel_workspace_test.dart
@@ -125,6 +125,21 @@
     assertType(findNode.namedType('int v'), 'int');
   }
 
+  test_buildFile_nonNullable_soundNullSafety() async {
+    newFile('$myPackageRootPath/BUILD', content: r'''
+dart_package(
+  sound_null_safety = True
+)
+''');
+
+    await resolveFileCode(
+      '$myPackageRootPath/lib/a.dart',
+      'int v = 0;',
+    );
+    assertNoErrorsInResult();
+    assertType(findNode.namedType('int v'), 'int');
+  }
+
   test_buildFile_nonNullable_withComments() async {
     newFile('$myPackageRootPath/BUILD', content: r'''
 dart_package(
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart
new file mode 100644
index 0000000..a212ea3
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/illegal_language_version_override_test.dart
@@ -0,0 +1,54 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:pub_semver/src/version_constraint.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IllegalLanguageVersionOverrideTest);
+  });
+}
+
+@reflectiveTest
+class IllegalLanguageVersionOverrideTest extends PubPackageResolutionTest {
+  test_hasOverride_equal() async {
+    await assertNoErrorsInCode(r'''
+// @dart = 2.12
+void f() {}
+''');
+  }
+
+  test_hasOverride_greater() async {
+    await assertNoErrorsInCode(r'''
+// @dart = 2.14
+void f() {}
+''');
+  }
+
+  test_hasOverride_less() async {
+    await assertErrorsInCode(r'''
+// @dart = 2.9
+int a = null;
+''', [
+      error(CompileTimeErrorCode.ILLEGAL_LANGUAGE_VERSION_OVERRIDE, 0, 14),
+    ]);
+  }
+
+  test_noOverride() async {
+    await assertNoErrorsInCode(r'''
+void f() {}
+''');
+  }
+
+  @override
+  void updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {
+    analysisOptions.sourceLanguageConstraint =
+        VersionConstraint.parse('>= 2.12.0');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 32e5d07..d8504b1 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -241,6 +241,8 @@
 import 'illegal_async_generator_return_type_test.dart'
     as illegal_async_generator_return_type;
 import 'illegal_async_return_type_test.dart' as illegal_async_return_type;
+import 'illegal_language_version_override_test.dart'
+    as illegal_language_version_override;
 import 'illegal_sync_generator_return_type_test.dart'
     as illegal_sync_generator_return_type;
 import 'implements_deferred_class_test.dart' as implements_deferred_class;
@@ -912,6 +914,7 @@
     if_element_condition_from_deferred_library.main();
     illegal_async_generator_return_type.main();
     illegal_async_return_type.main();
+    illegal_language_version_override.main();
     illegal_sync_generator_return_type.main();
     implements_deferred_class.main();
     implements_disallowed_class.main();
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 84c2a4a..7ca0145 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17702,6 +17702,137 @@
 ''');
   }
 
+  test_enum_constructor_factory_named() async {
+    var library = await checkLibrary(r'''
+enum E {
+  v;
+  factory E.named() => v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        supertype: Enum
+        fields
+          static const enumConstant v @11
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          factory named @26
+            periodOffset: 25
+            nameEnd: 31
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_constructor_factory_unnamed() async {
+    var library = await checkLibrary(r'''
+enum E {
+  v;
+  factory E() => v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        supertype: Enum
+        fields
+          static const enumConstant v @11
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          factory @24
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_constructor_fieldFormal_functionTyped_withReturnType() async {
     var library = await checkLibrary(r'''
 enum E {
@@ -18143,7 +18274,7 @@
 ''');
   }
 
-  test_enum_constructor_named() async {
+  test_enum_constructor_generative_named() async {
     var library = await checkLibrary(r'''
 enum E {
   v.named(42);
@@ -18216,7 +18347,7 @@
 ''');
   }
 
-  test_enum_constructor_unnamed() async {
+  test_enum_constructor_generative_unnamed() async {
     var library = await checkLibrary(r'''
 enum E {
   v(42);
diff --git a/pkg/dds/test/dap/integration/test_support.dart b/pkg/dds/test/dap/integration/test_support.dart
index ebabce8..5e4c792 100644
--- a/pkg/dds/test/dap/integration/test_support.dart
+++ b/pkg/dds/test/dap/integration/test_support.dart
@@ -33,7 +33,12 @@
 /// This is useful for debugging locally or on the bots and will include both
 /// DAP traffic (between the test DAP client and the DAP server) and the VM
 /// Service traffic (wrapped in a custom 'dart.log' event).
-final verboseLogging = Platform.environment['DAP_TEST_VERBOSE'] == 'true';
+///
+/// Verbose logging is temporarily enabled for all test runs to try and
+/// understand failures noted at https://github.com/dart-lang/sdk/issues/48274.
+/// Once resolved, this variable can be set back to the result of:
+///     Platform.environment['DAP_TEST_VERBOSE'] == 'true'
+final verboseLogging = true;
 
 /// A [RegExp] that matches the `path` part of a VM Service URI that contains
 /// an authentication token.
diff --git a/runtime/third_party/binary_size/README.dart b/runtime/third_party/binary_size/README.dart
deleted file mode 100644
index 0f2124e..0000000
--- a/runtime/third_party/binary_size/README.dart
+++ /dev/null
@@ -1 +0,0 @@
-A local copy of tools/binary_size from Chromium project.
\ No newline at end of file
diff --git a/runtime/third_party/binary_size/src/binary_size_utils.py b/runtime/third_party/binary_size/src/binary_size_utils.py
deleted file mode 100644
index 8ef283e..0000000
--- a/runtime/third_party/binary_size/src/binary_size_utils.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Common utilities for tools that deal with binary size information.
-"""
-
-import logging
-import re
-
-
-def ParseNm(nm_lines):
-    """Parse nm output, returning data for all relevant (to binary size)
-  symbols and ignoring the rest.
-
-  Args:
-      nm_lines: an iterable over lines of nm output.
-
-  Yields:
-      (symbol name, symbol type, symbol size, source file path).
-
-      Path may be None if nm couldn't figure out the source file.
-  """
-
-    # Match lines with size, symbol, optional location, optional discriminator
-    sym_re = re.compile(r'^([0-9a-f]{8,}) '  # address (8+ hex digits)
-                        '([0-9a-f]{8,}) '  # size (8+ hex digits)
-                        '(.) '  # symbol type, one character
-                        '([^\t]+)'  # symbol name, separated from next by tab
-                        '(?:\t(.*):[\d\?]+)?.*$')  # location
-    # Match lines with addr but no size.
-    addr_re = re.compile(r'^[0-9a-f]{8,} (.) ([^\t]+)(?:\t.*)?$')
-    # Match lines that don't have an address at all -- typically external symbols.
-    noaddr_re = re.compile(r'^ {8,} (.) (.*)$')
-    # Match lines with no symbol name, only addr and type
-    addr_only_re = re.compile(r'^[0-9a-f]{8,} (.)$')
-
-    seen_lines = set()
-    for line in nm_lines:
-        line = line.rstrip()
-        if line in seen_lines:
-            # nm outputs identical lines at times. We don't want to treat
-            # those as distinct symbols because that would make no sense.
-            continue
-        seen_lines.add(line)
-        match = sym_re.match(line)
-        if match:
-            address, size, sym_type, sym = match.groups()[0:4]
-            size = int(size, 16)
-            if sym_type in ('B', 'b'):
-                continue  # skip all BSS for now.
-            path = match.group(5)
-            yield sym, sym_type, size, path, address
-            continue
-        match = addr_re.match(line)
-        if match:
-            # sym_type, sym = match.groups()[0:2]
-            continue  # No size == we don't care.
-        match = noaddr_re.match(line)
-        if match:
-            sym_type, sym = match.groups()
-            if sym_type in ('U', 'w'):
-                continue  # external or weak symbol
-        match = addr_only_re.match(line)
-        if match:
-            continue  # Nothing to do.
-
-        # If we reach this part of the loop, there was something in the
-        # line that we didn't expect or recognize.
-        logging.warning('nm output parser failed to parse: %s', repr(line))
diff --git a/runtime/third_party/binary_size/src/elf_symbolizer.py b/runtime/third_party/binary_size/src/elf_symbolizer.py
deleted file mode 100644
index 5154a9b..0000000
--- a/runtime/third_party/binary_size/src/elf_symbolizer.py
+++ /dev/null
@@ -1,490 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-import datetime
-import logging
-import multiprocessing
-import os
-import posixpath
-import queue
-import re
-import subprocess
-import sys
-import threading
-import time
-
-# addr2line builds a possibly infinite memory cache that can exhaust
-# the computer's memory if allowed to grow for too long. This constant
-# controls how many lookups we do before restarting the process. 4000
-# gives near peak performance without extreme memory usage.
-ADDR2LINE_RECYCLE_LIMIT = 4000
-
-
-class ELFSymbolizer(object):
-    """An uber-fast (multiprocessing, pipelined and asynchronous) ELF symbolizer.
-
-  This class is a frontend for addr2line (part of GNU binutils), designed to
-  symbolize batches of large numbers of symbols for a given ELF file. It
-  supports sharding symbolization against many addr2line instances and
-  pipelining of multiple requests per each instance (in order to hide addr2line
-  internals and OS pipe latencies).
-
-  The interface exhibited by this class is a very simple asynchronous interface,
-  which is based on the following three methods:
-  - SymbolizeAsync(): used to request (enqueue) resolution of a given address.
-  - The |callback| method: used to communicated back the symbol information.
-  - Join(): called to conclude the batch to gather the last outstanding results.
-  In essence, before the Join method returns, this class will have issued as
-  many callbacks as the number of SymbolizeAsync() calls. In this regard, note
-  that due to multiprocess sharding, callbacks can be delivered out of order.
-
-  Some background about addr2line:
-  - it is invoked passing the elf path in the cmdline, piping the addresses in
-    its stdin and getting results on its stdout.
-  - it has pretty large response times for the first requests, but it
-    works very well in streaming mode once it has been warmed up.
-  - it doesn't scale by itself (on more cores). However, spawning multiple
-    instances at the same time on the same file is pretty efficient as they
-    keep hitting the pagecache and become mostly CPU bound.
-  - it might hang or crash, mostly for OOM. This class deals with both of these
-    problems.
-
-  Despite the "scary" imports and the multi* words above, (almost) no multi-
-  threading/processing is involved from the python viewpoint. Concurrency
-  here is achieved by spawning several addr2line subprocesses and handling their
-  output pipes asynchronously. Therefore, all the code here (with the exception
-  of the Queue instance in Addr2Line) should be free from mind-blowing
-  thread-safety concerns.
-
-  The multiprocess sharding works as follows:
-  The symbolizer tries to use the lowest number of addr2line instances as
-  possible (with respect of |max_concurrent_jobs|) and enqueue all the requests
-  in a single addr2line instance. For few symbols (i.e. dozens) sharding isn't
-  worth the startup cost.
-  The multiprocess logic kicks in as soon as the queues for the existing
-  instances grow. Specifically, once all the existing instances reach the
-  |max_queue_size| bound, a new addr2line instance is kicked in.
-  In the case of a very eager producer (i.e. all |max_concurrent_jobs| instances
-  have a backlog of |max_queue_size|), back-pressure is applied on the caller by
-  blocking the SymbolizeAsync method.
-
-  This module has been deliberately designed to be dependency free (w.r.t. of
-  other modules in this project), to allow easy reuse in external projects.
-  """
-
-    def __init__(self,
-                 elf_file_path,
-                 addr2line_path,
-                 callback,
-                 inlines=False,
-                 max_concurrent_jobs=None,
-                 addr2line_timeout=30,
-                 max_queue_size=50,
-                 source_root_path=None,
-                 strip_base_path=None):
-        """Args:
-      elf_file_path: path of the elf file to be symbolized.
-      addr2line_path: path of the toolchain's addr2line binary.
-      callback: a callback which will be invoked for each resolved symbol with
-          the two args (sym_info, callback_arg). The former is an instance of
-          |ELFSymbolInfo| and contains the symbol information. The latter is an
-          embedder-provided argument which is passed to SymbolizeAsync().
-      inlines: when True, the ELFSymbolInfo will contain also the details about
-          the outer inlining functions. When False, only the innermost function
-          will be provided.
-      max_concurrent_jobs: Max number of addr2line instances spawned.
-          Parallelize responsibly, addr2line is a memory and I/O monster.
-      max_queue_size: Max number of outstanding requests per addr2line instance.
-      addr2line_timeout: Max time (in seconds) to wait for a addr2line response.
-          After the timeout, the instance will be considered hung and respawned.
-      source_root_path: In some toolchains only the name of the source file is
-          is output, without any path information; disambiguation searches
-          through the source directory specified by |source_root_path| argument
-          for files whose name matches, adding the full path information to the
-          output. For example, if the toolchain outputs "unicode.cc" and there
-          is a file called "unicode.cc" located under |source_root_path|/foo,
-          the tool will replace "unicode.cc" with
-          "|source_root_path|/foo/unicode.cc". If there are multiple files with
-          the same name, disambiguation will fail because the tool cannot
-          determine which of the files was the source of the symbol.
-      strip_base_path: Rebases the symbols source paths onto |source_root_path|
-          (i.e replace |strip_base_path| with |source_root_path).
-    """
-        assert (os.path.isfile(addr2line_path)), 'Cannot find ' + addr2line_path
-        self.elf_file_path = elf_file_path
-        self.addr2line_path = addr2line_path
-        self.callback = callback
-        self.inlines = inlines
-        self.max_concurrent_jobs = (max_concurrent_jobs or
-                                    min(multiprocessing.cpu_count(), 4))
-        self.max_queue_size = max_queue_size
-        self.addr2line_timeout = addr2line_timeout
-        self.requests_counter = 0  # For generating monotonic request IDs.
-        self._a2l_instances = []  # Up to |max_concurrent_jobs| _Addr2Line inst.
-
-        # If necessary, create disambiguation lookup table
-        self.disambiguate = source_root_path is not None
-        self.disambiguation_table = {}
-        self.strip_base_path = strip_base_path
-        if (self.disambiguate):
-            self.source_root_path = os.path.abspath(source_root_path)
-            self._CreateDisambiguationTable()
-
-        # Create one addr2line instance. More instances will be created on demand
-        # (up to |max_concurrent_jobs|) depending on the rate of the requests.
-        self._CreateNewA2LInstance()
-
-    def SymbolizeAsync(self, addr, callback_arg=None):
-        """Requests symbolization of a given address.
-
-    This method is not guaranteed to return immediately. It generally does, but
-    in some scenarios (e.g. all addr2line instances have full queues) it can
-    block to create back-pressure.
-
-    Args:
-      addr: address to symbolize.
-      callback_arg: optional argument which will be passed to the |callback|."""
-        assert (isinstance(addr, int))
-
-        # Process all the symbols that have been resolved in the meanwhile.
-        # Essentially, this drains all the addr2line(s) out queues.
-        for a2l_to_purge in self._a2l_instances:
-            a2l_to_purge.ProcessAllResolvedSymbolsInQueue()
-            a2l_to_purge.RecycleIfNecessary()
-
-        # Find the best instance according to this logic:
-        # 1. Find an existing instance with the shortest queue.
-        # 2. If all of instances' queues are full, but there is room in the pool,
-        #    (i.e. < |max_concurrent_jobs|) create a new instance.
-        # 3. If there were already |max_concurrent_jobs| instances and all of them
-        #    had full queues, make back-pressure.
-
-        # 1.
-        def _SortByQueueSizeAndReqID(a2l):
-            return (a2l.queue_size, a2l.first_request_id)
-
-        a2l = min(self._a2l_instances, key=_SortByQueueSizeAndReqID)
-
-        # 2.
-        if (a2l.queue_size >= self.max_queue_size and
-                len(self._a2l_instances) < self.max_concurrent_jobs):
-            a2l = self._CreateNewA2LInstance()
-
-        # 3.
-        if a2l.queue_size >= self.max_queue_size:
-            a2l.WaitForNextSymbolInQueue()
-
-        a2l.EnqueueRequest(addr, callback_arg)
-
-    def Join(self):
-        """Waits for all the outstanding requests to complete and terminates."""
-        for a2l in self._a2l_instances:
-            a2l.WaitForIdle()
-            a2l.Terminate()
-
-    def _CreateNewA2LInstance(self):
-        assert (len(self._a2l_instances) < self.max_concurrent_jobs)
-        a2l = ELFSymbolizer.Addr2Line(self)
-        self._a2l_instances.append(a2l)
-        return a2l
-
-    def _CreateDisambiguationTable(self):
-        """ Non-unique file names will result in None entries"""
-        start_time = time.time()
-        logging.info('Collecting information about available source files...')
-        self.disambiguation_table = {}
-
-        for root, _, filenames in os.walk(self.source_root_path):
-            for f in filenames:
-                self.disambiguation_table[f] = os.path.join(
-                    root, f) if (f not in self.disambiguation_table) else None
-        logging.info(
-            'Finished collecting information about '
-            'possible files (took %.1f s).', (time.time() - start_time))
-
-    class Addr2Line(object):
-        """A python wrapper around an addr2line instance.
-
-    The communication with the addr2line process looks as follows:
-      [STDIN]         [STDOUT]  (from addr2line's viewpoint)
-    > f001111
-    > f002222
-                    < Symbol::Name(foo, bar) for f001111
-                    < /path/to/source/file.c:line_number
-    > f003333
-                    < Symbol::Name2() for f002222
-                    < /path/to/source/file.c:line_number
-                    < Symbol::Name3() for f003333
-                    < /path/to/source/file.c:line_number
-    """
-
-        SYM_ADDR_RE = re.compile(r'([^:]+):(\?|\d+).*')
-
-        def __init__(self, symbolizer):
-            self._symbolizer = symbolizer
-            self._lib_file_name = posixpath.basename(symbolizer.elf_file_path)
-
-            # The request queue (i.e. addresses pushed to addr2line's stdin and not
-            # yet retrieved on stdout)
-            self._request_queue = collections.deque()
-
-            # This is essentially len(self._request_queue). It has been optimized to a
-            # separate field because turned out to be a perf hot-spot.
-            self.queue_size = 0
-
-            # Keep track of the number of symbols a process has processed to
-            # avoid a single process growing too big and using all the memory.
-            self._processed_symbols_count = 0
-
-            # Objects required to handle the addr2line subprocess.
-            self._proc = None  # Subprocess.Popen(...) instance.
-            self._thread = None  # Threading.thread instance.
-            self._out_queue = None  # queue.Queue instance (for buffering a2l stdout).
-            self._RestartAddr2LineProcess()
-
-        def EnqueueRequest(self, addr, callback_arg):
-            """Pushes an address to addr2line's stdin (and keeps track of it)."""
-            self._symbolizer.requests_counter += 1  # For global "age" of requests.
-            req_idx = self._symbolizer.requests_counter
-            self._request_queue.append((addr, callback_arg, req_idx))
-            self.queue_size += 1
-            self._WriteToA2lStdin(addr)
-
-        def WaitForIdle(self):
-            """Waits until all the pending requests have been symbolized."""
-            while self.queue_size > 0:
-                self.WaitForNextSymbolInQueue()
-
-        def WaitForNextSymbolInQueue(self):
-            """Waits for the next pending request to be symbolized."""
-            if not self.queue_size:
-                return
-
-            # This outer loop guards against a2l hanging (detecting stdout timeout).
-            while True:
-                start_time = datetime.datetime.now()
-                timeout = datetime.timedelta(
-                    seconds=self._symbolizer.addr2line_timeout)
-
-                # The inner loop guards against a2l crashing (checking if it exited).
-                while (datetime.datetime.now() - start_time < timeout):
-                    # poll() returns !None if the process exited. a2l should never exit.
-                    if self._proc.poll():
-                        logging.warning(
-                            'addr2line crashed, respawning (lib: %s).' %
-                            self._lib_file_name)
-                        self._RestartAddr2LineProcess()
-                        # TODO(primiano): the best thing to do in this case would be
-                        # shrinking the pool size as, very likely, addr2line is crashed
-                        # due to low memory (and the respawned one will die again soon).
-
-                    try:
-                        lines = self._out_queue.get(block=True, timeout=0.25)
-                    except queue.Empty:
-                        # On timeout (1/4 s.) repeat the inner loop and check if either the
-                        # addr2line process did crash or we waited its output for too long.
-                        continue
-
-                    # In nominal conditions, we get straight to this point.
-                    self._ProcessSymbolOutput(lines)
-                    return
-
-                # If this point is reached, we waited more than |addr2line_timeout|.
-                logging.warning('Hung addr2line process, respawning (lib: %s).'
-                                % self._lib_file_name)
-                self._RestartAddr2LineProcess()
-
-        def ProcessAllResolvedSymbolsInQueue(self):
-            """Consumes all the addr2line output lines produced (without blocking)."""
-            if not self.queue_size:
-                return
-            while True:
-                try:
-                    lines = self._out_queue.get_nowait()
-                except queue.Empty:
-                    break
-                self._ProcessSymbolOutput(lines)
-
-        def RecycleIfNecessary(self):
-            """Restarts the process if it has been used for too long.
-
-      A long running addr2line process will consume excessive amounts
-      of memory without any gain in performance."""
-            if self._processed_symbols_count >= ADDR2LINE_RECYCLE_LIMIT:
-                self._RestartAddr2LineProcess()
-
-        def Terminate(self):
-            """Kills the underlying addr2line process.
-
-      The poller |_thread| will terminate as well due to the broken pipe."""
-            try:
-                self._proc.kill()
-                self._proc.communicate(
-                )  # Essentially wait() without risking deadlock.
-            except Exception:  # An exception while terminating? How interesting.
-                pass
-            self._proc = None
-
-        def _WriteToA2lStdin(self, addr):
-            self._proc.stdin.write(('%s\n' % hex(addr)).encode())
-            if self._symbolizer.inlines:
-                # In the case of inlines we output an extra blank line, which causes
-                # addr2line to emit a (??,??:0) tuple that we use as a boundary marker.
-                self._proc.stdin.write('\n')
-            self._proc.stdin.flush()
-
-        def _ProcessSymbolOutput(self, lines):
-            """Parses an addr2line symbol output and triggers the client callback."""
-            (_, callback_arg, _) = self._request_queue.popleft()
-            self.queue_size -= 1
-
-            innermost_sym_info = None
-            sym_info = None
-            for (line1, line2) in lines:
-                prev_sym_info = sym_info
-                name = line1 if not line1.startswith('?') else None
-                source_path = None
-                source_line = None
-                m = ELFSymbolizer.Addr2Line.SYM_ADDR_RE.match(line2)
-                if m:
-                    if not m.group(1).startswith('?'):
-                        source_path = m.group(1)
-                        if not m.group(2).startswith('?'):
-                            source_line = int(m.group(2))
-                else:
-                    logging.warning(
-                        'Got invalid symbol path from addr2line: %s' % line2)
-
-                # In case disambiguation is on, and needed
-                was_ambiguous = False
-                disambiguated = False
-                if self._symbolizer.disambiguate:
-                    if source_path and not posixpath.isabs(source_path):
-                        path = self._symbolizer.disambiguation_table.get(
-                            source_path)
-                        was_ambiguous = True
-                        disambiguated = path is not None
-                        source_path = path if disambiguated else source_path
-
-                    # Use absolute paths (so that paths are consistent, as disambiguation
-                    # uses absolute paths)
-                    if source_path and not was_ambiguous:
-                        source_path = os.path.abspath(source_path)
-
-                if source_path and self._symbolizer.strip_base_path:
-                    # Strip the base path
-                    source_path = re.sub(
-                        '^' + self._symbolizer.strip_base_path,
-                        self._symbolizer.source_root_path or '', source_path)
-
-                sym_info = ELFSymbolInfo(name, source_path, source_line,
-                                         was_ambiguous, disambiguated)
-                if prev_sym_info:
-                    prev_sym_info.inlined_by = sym_info
-                if not innermost_sym_info:
-                    innermost_sym_info = sym_info
-
-            self._processed_symbols_count += 1
-            self._symbolizer.callback(innermost_sym_info, callback_arg)
-
-        def _RestartAddr2LineProcess(self):
-            if self._proc:
-                self.Terminate()
-
-            # The only reason of existence of this Queue (and the corresponding
-            # Thread below) is the lack of a subprocess.stdout.poll_avail_lines().
-            # Essentially this is a pipe able to extract a couple of lines atomically.
-            self._out_queue = queue.Queue()
-
-            # Start the underlying addr2line process in line buffered mode.
-
-            cmd = [
-                self._symbolizer.addr2line_path, '--functions', '--demangle',
-                '--exe=' + self._symbolizer.elf_file_path
-            ]
-            if self._symbolizer.inlines:
-                cmd += ['--inlines']
-            self._proc = subprocess.Popen(
-                cmd,
-                stdout=subprocess.PIPE,
-                stdin=subprocess.PIPE,
-                stderr=sys.stderr,
-                close_fds=True)
-
-            # Start the poller thread, which simply moves atomically the lines read
-            # from the addr2line's stdout to the |_out_queue|.
-            self._thread = threading.Thread(
-                target=ELFSymbolizer.Addr2Line.StdoutReaderThread,
-                args=(self._proc.stdout, self._out_queue,
-                      self._symbolizer.inlines))
-            self._thread.daemon = True  # Don't prevent early process exit.
-            self._thread.start()
-
-            self._processed_symbols_count = 0
-
-            # Replay the pending requests on the new process (only for the case
-            # of a hung addr2line timing out during the game).
-            for (addr, _, _) in self._request_queue:
-                self._WriteToA2lStdin(addr)
-
-        @staticmethod
-        def StdoutReaderThread(process_pipe, queue, inlines):
-            """The poller thread fn, which moves the addr2line stdout to the |queue|.
-
-      This is the only piece of code not running on the main thread. It merely
-      writes to a Queue, which is thread-safe. In the case of inlines, it
-      detects the ??,??:0 marker and sends the lines atomically, such that the
-      main thread always receives all the lines corresponding to one symbol in
-      one shot."""
-            try:
-                lines_for_one_symbol = []
-                while True:
-                    line1 = process_pipe.readline().decode().rstrip('\r\n')
-                    line2 = process_pipe.readline().decode().rstrip('\r\n')
-                    if not line1 or not line2:
-                        break
-                    inline_has_more_lines = inlines and (
-                        len(lines_for_one_symbol) == 0 or
-                        (line1 != '??' and line2 != '??:0'))
-                    if not inlines or inline_has_more_lines:
-                        lines_for_one_symbol += [(line1, line2)]
-                    if inline_has_more_lines:
-                        continue
-                    queue.put(lines_for_one_symbol)
-                    lines_for_one_symbol = []
-                process_pipe.close()
-
-            # Every addr2line processes will die at some point, please die silently.
-            except (IOError, OSError):
-                pass
-
-        @property
-        def first_request_id(self):
-            """Returns the request_id of the oldest pending request in the queue."""
-            return self._request_queue[0][2] if self._request_queue else 0
-
-
-class ELFSymbolInfo(object):
-    """The result of the symbolization passed as first arg. of each callback."""
-
-    def __init__(self,
-                 name,
-                 source_path,
-                 source_line,
-                 was_ambiguous=False,
-                 disambiguated=False):
-        """All the fields here can be None (if addr2line replies with '??')."""
-        self.name = name
-        self.source_path = source_path
-        self.source_line = source_line
-        # In the case of |inlines|=True, the |inlined_by| points to the outer
-        # function inlining the current one (and so on, to form a chain).
-        self.inlined_by = None
-        self.disambiguated = disambiguated
-        self.was_ambiguous = was_ambiguous
-
-    def __str__(self):
-        return '%s [%s:%d]' % (self.name or '??', self.source_path or '??',
-                               self.source_line or 0)
diff --git a/runtime/third_party/binary_size/src/explain_binary_size_delta.py b/runtime/third_party/binary_size/src/explain_binary_size_delta.py
deleted file mode 100755
index 13f7c12..0000000
--- a/runtime/third_party/binary_size/src/explain_binary_size_delta.py
+++ /dev/null
@@ -1,519 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Describe the size difference of two binaries.
-
-Generates a description of the size difference of two binaries based
-on the difference of the size of various symbols.
-
-This tool needs "nm" dumps of each binary with full symbol
-information. You can obtain the necessary dumps by running the
-run_binary_size_analysis.py script upon each binary, with the
-"--nm-out" parameter set to the location in which you want to save the
-dumps. Example:
-
-  # obtain symbol data from first binary in /tmp/nm1.dump
-  cd $CHECKOUT1_SRC
-  ninja -C out/Release binary_size_tool
-  tools/binary_size/run_binary_size_analysis \
-      --library <path_to_library>
-      --destdir /tmp/throwaway
-      --nm-out /tmp/nm1.dump
-
-  # obtain symbol data from second binary in /tmp/nm2.dump
-  cd $CHECKOUT2_SRC
-  ninja -C out/Release binary_size_tool
-  tools/binary_size/run_binary_size_analysis \
-      --library <path_to_library>
-      --destdir /tmp/throwaway
-      --nm-out /tmp/nm2.dump
-
-  # cleanup useless files
-  rm -r /tmp/throwaway
-
-  # run this tool
-  explain_binary_size_delta.py --nm1 /tmp/nm1.dump --nm2 /tmp/nm2.dump
-"""
-
-import collections
-from collections import Counter
-from math import ceil
-import operator
-import optparse
-import os
-import sys
-
-import binary_size_utils
-
-
-def CalculateSharedAddresses(symbols):
-    """Checks how many symbols share the same memory space. This returns a
-Counter result where result[address] will tell you how many times address was
-used by symbols."""
-    count = Counter()
-    for _, _, _, _, address in symbols:
-        count[address] += 1
-
-    return count
-
-
-def CalculateEffectiveSize(share_count, address, symbol_size):
-    """Given a raw symbol_size and an address, this method returns the
-  size we should blame on this symbol considering it might share the
-  machine code/data with other symbols. Using the raw symbol_size for
-  each symbol would in those cases over estimate the true cost of that
-  block.
-
-  """
-    shared_count = share_count[address]
-    if shared_count == 1:
-        return symbol_size
-
-    assert shared_count > 1
-    return int(ceil(symbol_size / float(shared_count)))
-
-
-class SymbolDelta(object):
-    """Stores old size, new size and some metadata."""
-
-    def __init__(self, shared):
-        self.old_size = None
-        self.new_size = None
-        self.shares_space_with_other_symbols = shared
-
-    def __eq__(self, other):
-        return (self.old_size == other.old_size and
-                self.new_size == other.new_size and
-                self.shares_space_with_other_symbols == other.
-                shares_space_with_other_symbols)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def copy_symbol_delta(self):
-        symbol_delta = SymbolDelta(self.shares_space_with_other_symbols)
-        symbol_delta.old_size = self.old_size
-        symbol_delta.new_size = self.new_size
-        return symbol_delta
-
-
-class DeltaInfo(SymbolDelta):
-    """Summary of a the change for one symbol between two instances."""
-
-    def __init__(self, file_path, symbol_type, symbol_name, shared):
-        SymbolDelta.__init__(self, shared)
-        self.file_path = file_path
-        self.symbol_type = symbol_type
-        self.symbol_name = symbol_name
-
-    def __eq__(self, other):
-        return (self.file_path == other.file_path and
-                self.symbol_type == other.symbol_type and
-                self.symbol_name == other.symbol_name and
-                SymbolDelta.__eq__(self, other))
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def ExtractSymbolDelta(self):
-        """Returns a copy of the SymbolDelta for this DeltaInfo."""
-        return SymbolDelta.copy_symbol_delta(self)
-
-
-def Compare(symbols1, symbols2):
-    """Executes a comparison of the symbols in symbols1 and symbols2.
-
-  Returns:
-      tuple of lists: (added_symbols, removed_symbols, changed_symbols, others)
-      where each list contains DeltaInfo objects.
-  """
-    added = []  # tuples
-    removed = []  # tuples
-    changed = []  # tuples
-    unchanged = []  # tuples
-
-    cache1 = {}
-    cache2 = {}
-    # Make a map of (file, symbol_type) : (symbol_name, effective_symbol_size)
-    share_count1 = CalculateSharedAddresses(symbols1)
-    share_count2 = CalculateSharedAddresses(symbols2)
-    for cache, symbols, share_count in ((cache1, symbols1, share_count1),
-                                        (cache2, symbols2, share_count2)):
-        for symbol_name, symbol_type, symbol_size, file_path, address in symbols:
-            if 'vtable for ' in symbol_name:
-                symbol_type = '@'  # hack to categorize these separately
-            if file_path:
-                file_path = os.path.normpath(file_path)
-                if sys.platform.startswith('win'):
-                    file_path = file_path.replace('\\', '/')
-            else:
-                file_path = '(No Path)'
-            # Take into consideration that multiple symbols might share the same
-            # block of code.
-            effective_symbol_size = CalculateEffectiveSize(
-                share_count, address, symbol_size)
-            key = (file_path, symbol_type)
-            bucket = cache.setdefault(key, {})
-            size_list = bucket.setdefault(symbol_name, [])
-            size_list.append((effective_symbol_size,
-                              effective_symbol_size != symbol_size))
-
-    # Now diff them. We iterate over the elements in cache1. For each symbol
-    # that we find in cache2, we record whether it was deleted, changed, or
-    # unchanged. We then remove it from cache2; all the symbols that remain
-    # in cache2 at the end of the iteration over cache1 are the 'new' symbols.
-    for key, bucket1 in cache1.items():
-        bucket2 = cache2.get(key)
-        file_path, symbol_type = key
-        if not bucket2:
-            # A file was removed. Everything in bucket1 is dead.
-            for symbol_name, symbol_size_list in bucket1.items():
-                for (symbol_size, shared) in symbol_size_list:
-                    delta_info = DeltaInfo(file_path, symbol_type, symbol_name,
-                                           shared)
-                    delta_info.old_size = symbol_size
-                    removed.append(delta_info)
-        else:
-            # File still exists, look for changes within.
-            for symbol_name, symbol_size_list in bucket1.items():
-                size_list2 = bucket2.get(symbol_name)
-                if size_list2 is None:
-                    # Symbol no longer exists in bucket2.
-                    for (symbol_size, shared) in symbol_size_list:
-                        delta_info = DeltaInfo(file_path, symbol_type,
-                                               symbol_name, shared)
-                        delta_info.old_size = symbol_size
-                        removed.append(delta_info)
-                else:
-                    del bucket2[
-                        symbol_name]  # Symbol is not new, delete from cache2.
-                    if len(symbol_size_list) == 1 and len(size_list2) == 1:
-                        symbol_size, shared1 = symbol_size_list[0]
-                        size2, shared2 = size_list2[0]
-                        delta_info = DeltaInfo(file_path, symbol_type,
-                                               symbol_name, shared1 or shared2)
-                        delta_info.old_size = symbol_size
-                        delta_info.new_size = size2
-                        if symbol_size != size2:
-                            # Symbol has change size in bucket.
-                            changed.append(delta_info)
-                        else:
-                            # Symbol is unchanged.
-                            unchanged.append(delta_info)
-                    else:
-                        # Complex comparison for when a symbol exists multiple times
-                        # in the same file (where file can be "unknown file").
-                        symbol_size_counter = collections.Counter(
-                            symbol_size_list)
-                        delta_counter = collections.Counter(symbol_size_list)
-                        delta_counter.subtract(size_list2)
-                        for delta_counter_key in sorted(delta_counter.keys()):
-                            delta = delta_counter[delta_counter_key]
-                            unchanged_count = symbol_size_counter[
-                                delta_counter_key]
-                            (symbol_size, shared) = delta_counter_key
-                            if delta > 0:
-                                unchanged_count -= delta
-                            for _ in range(unchanged_count):
-                                delta_info = DeltaInfo(file_path, symbol_type,
-                                                       symbol_name, shared)
-                                delta_info.old_size = symbol_size
-                                delta_info.new_size = symbol_size
-                                unchanged.append(delta_info)
-                            if delta > 0:  # Used to be more of these than there is now.
-                                for _ in range(delta):
-                                    delta_info = DeltaInfo(
-                                        file_path, symbol_type, symbol_name,
-                                        shared)
-                                    delta_info.old_size = symbol_size
-                                    removed.append(delta_info)
-                            elif delta < 0:  # More of this (symbol,size) now.
-                                for _ in range(-delta):
-                                    delta_info = DeltaInfo(
-                                        file_path, symbol_type, symbol_name,
-                                        shared)
-                                    delta_info.new_size = symbol_size
-                                    added.append(delta_info)
-
-                    if len(bucket2) == 0:
-                        del cache1[
-                            key]  # Entire bucket is empty, delete from cache2
-
-    # We have now analyzed all symbols that are in cache1 and removed all of
-    # the encountered symbols from cache2. What's left in cache2 is the new
-    # symbols.
-    for key, bucket2 in cache2.items():
-        file_path, symbol_type = key
-        for symbol_name, symbol_size_list in bucket2.items():
-            for (symbol_size, shared) in symbol_size_list:
-                delta_info = DeltaInfo(file_path, symbol_type, symbol_name,
-                                       shared)
-                delta_info.new_size = symbol_size
-                added.append(delta_info)
-    return (added, removed, changed, unchanged)
-
-
-def DeltaStr(number):
-    """Returns the number as a string with a '+' prefix if it's > 0 and
-  a '-' prefix if it's < 0."""
-    result = str(number)
-    if number > 0:
-        result = '+' + result
-    return result
-
-
-def SharedInfoStr(symbol_info):
-    """Returns a string (prefixed by space) explaining that numbers are
-  adjusted because of shared space between symbols, or an empty string
-  if space had not been shared."""
-
-    if symbol_info.shares_space_with_other_symbols:
-        return " (adjusted sizes because of memory sharing)"
-
-    return ""
-
-
-class CrunchStatsData(object):
-    """Stores a summary of data of a certain kind."""
-
-    def __init__(self, symbols):
-        self.symbols = symbols
-        self.sources = set()
-        self.before_size = 0
-        self.after_size = 0
-        self.symbols_by_path = {}
-
-
-def CrunchStats(added, removed, changed, unchanged, showsources, showsymbols):
-    """Outputs to stdout a summary of changes based on the symbol lists."""
-    # Split changed into grown and shrunk because that is easier to
-    # discuss.
-    grown = []
-    shrunk = []
-    for item in changed:
-        if item.old_size < item.new_size:
-            grown.append(item)
-        else:
-            shrunk.append(item)
-
-    new_symbols = CrunchStatsData(added)
-    removed_symbols = CrunchStatsData(removed)
-    grown_symbols = CrunchStatsData(grown)
-    shrunk_symbols = CrunchStatsData(shrunk)
-    sections = [new_symbols, removed_symbols, grown_symbols, shrunk_symbols]
-    for section in sections:
-        for item in section.symbols:
-            section.sources.add(item.file_path)
-            if item.old_size is not None:
-                section.before_size += item.old_size
-            if item.new_size is not None:
-                section.after_size += item.new_size
-            bucket = section.symbols_by_path.setdefault(item.file_path, [])
-            bucket.append((item.symbol_name, item.symbol_type,
-                           item.ExtractSymbolDelta()))
-
-    total_change = sum(s.after_size - s.before_size for s in sections)
-    summary = 'Total change: %s bytes' % DeltaStr(total_change)
-    print(summary)
-    print('=' * len(summary))
-    for section in sections:
-        if not section.symbols:
-            continue
-        if section.before_size == 0:
-            description = (
-                'added, totalling %s bytes' % DeltaStr(section.after_size))
-        elif section.after_size == 0:
-            description = (
-                'removed, totalling %s bytes' % DeltaStr(-section.before_size))
-        else:
-            if section.after_size > section.before_size:
-                type_str = 'grown'
-            else:
-                type_str = 'shrunk'
-            description = (
-                '%s, for a net change of %s bytes '
-                '(%d bytes before, %d bytes after)' %
-                (type_str, DeltaStr(section.after_size - section.before_size),
-                 section.before_size, section.after_size))
-        print('  %d %s across %d sources' % (len(section.symbols), description,
-                                             len(section.sources)))
-
-    maybe_unchanged_sources = set()
-    unchanged_symbols_size = 0
-    for item in unchanged:
-        maybe_unchanged_sources.add(item.file_path)
-        unchanged_symbols_size += item.old_size  # == item.new_size
-    print('  %d unchanged, totalling %d bytes' % (len(unchanged),
-                                                  unchanged_symbols_size))
-
-    # High level analysis, always output.
-    unchanged_sources = maybe_unchanged_sources
-    for section in sections:
-        unchanged_sources = unchanged_sources - section.sources
-    new_sources = (
-        new_symbols.sources - maybe_unchanged_sources - removed_symbols.sources)
-    removed_sources = (
-        removed_symbols.sources - maybe_unchanged_sources - new_symbols.sources)
-    partially_changed_sources = (
-        grown_symbols.sources | shrunk_symbols.sources | new_symbols.sources |
-        removed_symbols.sources) - removed_sources - new_sources
-    allFiles = set()
-    for section in sections:
-        allFiles = allFiles | section.sources
-    allFiles = allFiles | maybe_unchanged_sources
-    print('Source stats:')
-    print('  %d sources encountered.' % len(allFiles))
-    print('  %d completely new.' % len(new_sources))
-    print('  %d removed completely.' % len(removed_sources))
-    print('  %d partially changed.' % len(partially_changed_sources))
-    print('  %d completely unchanged.' % len(unchanged_sources))
-    remainder = (allFiles - new_sources - removed_sources -
-                 partially_changed_sources - unchanged_sources)
-    assert len(remainder) == 0
-
-    if not showsources:
-        return  # Per-source analysis, only if requested
-    print('Per-source Analysis:')
-    delta_by_path = {}
-    for section in sections:
-        for path in section.symbols_by_path:
-            entry = delta_by_path.get(path)
-            if not entry:
-                entry = {'plus': 0, 'minus': 0}
-                delta_by_path[path] = entry
-            for symbol_name, symbol_type, symbol_delta in \
-                  section.symbols_by_path[path]:
-                if symbol_delta.old_size is None:
-                    delta = symbol_delta.new_size
-                elif symbol_delta.new_size is None:
-                    delta = -symbol_delta.old_size
-                else:
-                    delta = symbol_delta.new_size - symbol_delta.old_size
-
-                if delta > 0:
-                    entry['plus'] += delta
-                else:
-                    entry['minus'] += (-1 * delta)
-
-    def delta_sort_key(item):
-        _path, size_data = item
-        growth = size_data['plus'] - size_data['minus']
-        return growth
-
-    for path, size_data in sorted(delta_by_path.items(),
-                                  key=delta_sort_key,
-                                  reverse=True):
-        gain = size_data['plus']
-        loss = size_data['minus']
-        delta = size_data['plus'] - size_data['minus']
-        header = ' %s - Source: %s - (gained %d, lost %d)' % (DeltaStr(delta),
-                                                              path, gain, loss)
-        divider = '-' * len(header)
-        print('')
-        print(divider)
-        print(header)
-        print(divider)
-        if showsymbols:
-
-            def ExtractNewSize(tup):
-                symbol_delta = tup[2]
-                return symbol_delta.new_size
-
-            def ExtractOldSize(tup):
-                symbol_delta = tup[2]
-                return symbol_delta.old_size
-
-            if path in new_symbols.symbols_by_path:
-                print('  New symbols:')
-                for symbol_name, symbol_type, symbol_delta in \
-                    sorted(new_symbols.symbols_by_path[path],
-                           key=ExtractNewSize,
-                           reverse=True):
-                    print('   %8s: %s type=%s, size=%d bytes%s' %
-                          (DeltaStr(symbol_delta.new_size), symbol_name,
-                           symbol_type, symbol_delta.new_size,
-                           SharedInfoStr(symbol_delta)))
-            if path in removed_symbols.symbols_by_path:
-                print('  Removed symbols:')
-                for symbol_name, symbol_type, symbol_delta in \
-                    sorted(removed_symbols.symbols_by_path[path],
-                           key=ExtractOldSize):
-                    print('   %8s: %s type=%s, size=%d bytes%s' %
-                          (DeltaStr(-symbol_delta.old_size), symbol_name,
-                           symbol_type, symbol_delta.old_size,
-                           SharedInfoStr(symbol_delta)))
-            for (changed_symbols_by_path,
-                 type_str) in [(grown_symbols.symbols_by_path, "Grown"),
-                               (shrunk_symbols.symbols_by_path, "Shrunk")]:
-                if path in changed_symbols_by_path:
-                    print('  %s symbols:' % type_str)
-
-                    def changed_symbol_sortkey(item):
-                        symbol_name, _symbol_type, symbol_delta = item
-                        return (symbol_delta.old_size - symbol_delta.new_size,
-                                symbol_name)
-
-                    for symbol_name, symbol_type, symbol_delta in \
-                        sorted(changed_symbols_by_path[path], key=changed_symbol_sortkey):
-                        print(
-                            '   %8s: %s type=%s, (was %d bytes, now %d bytes)%s'
-                            % (DeltaStr(symbol_delta.new_size -
-                                        symbol_delta.old_size), symbol_name,
-                               symbol_type,
-                               symbol_delta.old_size, symbol_delta.new_size,
-                               SharedInfoStr(symbol_delta)))
-
-
-def main():
-    usage = """%prog [options]
-
-  Analyzes the symbolic differences between two binary files
-  (typically, not necessarily, two different builds of the same
-  library) and produces a detailed description of symbols that have
-  been added, removed, or whose size has changed.
-
-  Example:
-       explain_binary_size_delta.py --nm1 /tmp/nm1.dump --nm2 /tmp/nm2.dump
-
-  Options are available via '--help'.
-  """
-    parser = optparse.OptionParser(usage=usage)
-    parser.add_option(
-        '--nm1', metavar='PATH', help='the nm dump of the first library')
-    parser.add_option(
-        '--nm2', metavar='PATH', help='the nm dump of the second library')
-    parser.add_option(
-        '--showsources',
-        action='store_true',
-        default=False,
-        help='show per-source statistics')
-    parser.add_option(
-        '--showsymbols',
-        action='store_true',
-        default=False,
-        help='show all symbol information; implies --showsources')
-    parser.add_option(
-        '--verbose',
-        action='store_true',
-        default=False,
-        help='output internal debugging stuff')
-    opts, _args = parser.parse_args()
-
-    if not opts.nm1:
-        parser.error('--nm1 is required')
-    if not opts.nm2:
-        parser.error('--nm2 is required')
-    symbols = []
-    for path in [opts.nm1, opts.nm2]:
-        with open(path, 'r') as nm_input:
-            if opts.verbose:
-                print('parsing ' + path + '...')
-            symbols.append(list(binary_size_utils.ParseNm(nm_input)))
-    (added, removed, changed, unchanged) = Compare(symbols[0], symbols[1])
-    CrunchStats(added, removed, changed, unchanged,
-                opts.showsources | opts.showsymbols, opts.showsymbols)
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/runtime/third_party/binary_size/src/run_binary_size_analysis.py b/runtime/third_party/binary_size/src/run_binary_size_analysis.py
deleted file mode 100755
index dfd5b97..0000000
--- a/runtime/third_party/binary_size/src/run_binary_size_analysis.py
+++ /dev/null
@@ -1,710 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Generate a spatial analysis against an arbitrary library.
-
-To use, build the 'binary_size_tool' target. Then run this tool, passing
-in the location of the library to be analyzed along with any other options
-you desire.
-"""
-
-import json
-import logging
-import multiprocessing
-import optparse
-import os
-import re
-import shutil
-import struct
-import subprocess
-import sys
-import tempfile
-import time
-
-import binary_size_utils
-import elf_symbolizer
-
-# Node dictionary keys. These are output in json read by the webapp so
-# keep them short to save file size.
-# Note: If these change, the webapp must also change.
-NODE_TYPE_KEY = 'k'
-NODE_NAME_KEY = 'n'
-NODE_CHILDREN_KEY = 'children'
-NODE_SYMBOL_TYPE_KEY = 't'
-NODE_SYMBOL_SIZE_KEY = 'value'
-NODE_MAX_DEPTH_KEY = 'maxDepth'
-NODE_LAST_PATH_ELEMENT_KEY = 'lastPathElement'
-
-# The display name of the bucket where we put symbols without path.
-NAME_NO_PATH_BUCKET = '(No Path)'
-
-# Try to keep data buckets smaller than this to avoid killing the
-# graphing lib.
-BIG_BUCKET_LIMIT = 3000
-
-
-def _MkChild(node, name):
-    child = node[NODE_CHILDREN_KEY].get(name)
-    if child is None:
-        child = {NODE_NAME_KEY: name, NODE_CHILDREN_KEY: {}}
-        node[NODE_CHILDREN_KEY][name] = child
-    return child
-
-
-def SplitNoPathBucket(node):
-    """NAME_NO_PATH_BUCKET can be too large for the graphing lib to
-  handle. Split it into sub-buckets in that case."""
-    root_children = node[NODE_CHILDREN_KEY]
-    if NAME_NO_PATH_BUCKET in root_children:
-        no_path_bucket = root_children[NAME_NO_PATH_BUCKET]
-        old_children = no_path_bucket[NODE_CHILDREN_KEY]
-        count = 0
-        for symbol_type, symbol_bucket in old_children.items():
-            count += len(symbol_bucket[NODE_CHILDREN_KEY])
-        if count > BIG_BUCKET_LIMIT:
-            new_children = {}
-            no_path_bucket[NODE_CHILDREN_KEY] = new_children
-            current_bucket = None
-            index = 0
-            for symbol_type, symbol_bucket in old_children.items():
-                for symbol_name, value in symbol_bucket[
-                        NODE_CHILDREN_KEY].items():
-                    if index % BIG_BUCKET_LIMIT == 0:
-                        group_no = (index / BIG_BUCKET_LIMIT) + 1
-                        current_bucket = _MkChild(
-                            no_path_bucket,
-                            '%s subgroup %d' % (NAME_NO_PATH_BUCKET, group_no))
-                        assert not NODE_TYPE_KEY in node or node[
-                            NODE_TYPE_KEY] == 'p'
-                        node[NODE_TYPE_KEY] = 'p'  # p for path
-                    index += 1
-                    symbol_size = value[NODE_SYMBOL_SIZE_KEY]
-                    AddSymbolIntoFileNode(current_bucket, symbol_type,
-                                          symbol_name, symbol_size)
-
-
-def MakeChildrenDictsIntoLists(node):
-    largest_list_len = 0
-    if NODE_CHILDREN_KEY in node:
-        largest_list_len = len(node[NODE_CHILDREN_KEY])
-        child_list = []
-        for child in node[NODE_CHILDREN_KEY].values():
-            child_largest_list_len = MakeChildrenDictsIntoLists(child)
-            if child_largest_list_len > largest_list_len:
-                largest_list_len = child_largest_list_len
-            child_list.append(child)
-        node[NODE_CHILDREN_KEY] = child_list
-
-    return largest_list_len
-
-
-def AddSymbolIntoFileNode(node, symbol_type, symbol_name, symbol_size):
-    """Puts symbol into the file path node |node|.
-  Returns the number of added levels in tree. I.e. returns 2."""
-
-    # 'node' is the file node and first step is to find its symbol-type bucket.
-    node[NODE_LAST_PATH_ELEMENT_KEY] = True
-    node = _MkChild(node, symbol_type)
-    assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'b'
-    node[NODE_SYMBOL_TYPE_KEY] = symbol_type
-    node[NODE_TYPE_KEY] = 'b'  # b for bucket
-
-    # 'node' is now the symbol-type bucket. Make the child entry.
-    node = _MkChild(node, symbol_name)
-    if NODE_CHILDREN_KEY in node:
-        if node[NODE_CHILDREN_KEY]:
-            logging.warning(
-                'A container node used as symbol for %s.' % symbol_name)
-        # This is going to be used as a leaf so no use for child list.
-        del node[NODE_CHILDREN_KEY]
-    node[NODE_SYMBOL_SIZE_KEY] = symbol_size
-    node[NODE_SYMBOL_TYPE_KEY] = symbol_type
-    node[NODE_TYPE_KEY] = 's'  # s for symbol
-
-    return 2  # Depth of the added subtree.
-
-
-def MakeCompactTree(symbols, symbol_path_origin_dir):
-    result = {
-        NODE_NAME_KEY: '/',
-        NODE_CHILDREN_KEY: {},
-        NODE_TYPE_KEY: 'p',
-        NODE_MAX_DEPTH_KEY: 0
-    }
-    seen_symbol_with_path = False
-    cwd = os.path.abspath(os.getcwd())
-    for symbol_name, symbol_type, symbol_size, file_path, _address in symbols:
-
-        if 'vtable for ' in symbol_name:
-            symbol_type = '@'  # hack to categorize these separately
-        # Take path like '/foo/bar/baz', convert to ['foo', 'bar', 'baz']
-        if file_path and file_path != "??":
-            file_path = os.path.abspath(
-                os.path.join(symbol_path_origin_dir, file_path))
-            # Let the output structure be relative to $CWD if inside $CWD,
-            # otherwise relative to the disk root. This is to avoid
-            # unnecessary click-through levels in the output.
-            if file_path.startswith(cwd + os.sep):
-                file_path = file_path[len(cwd):]
-            if file_path.startswith('/'):
-                file_path = file_path[1:]
-            seen_symbol_with_path = True
-        else:
-            file_path = NAME_NO_PATH_BUCKET
-
-        path_parts = file_path.split('/')
-
-        # Find pre-existing node in tree, or update if it already exists
-        node = result
-        depth = 0
-        while len(path_parts) > 0:
-            path_part = path_parts.pop(0)
-            if len(path_part) == 0:
-                continue
-            depth += 1
-            node = _MkChild(node, path_part)
-            assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'p'
-            node[NODE_TYPE_KEY] = 'p'  # p for path
-
-        depth += AddSymbolIntoFileNode(node, symbol_type, symbol_name,
-                                       symbol_size)
-        result[NODE_MAX_DEPTH_KEY] = max(result[NODE_MAX_DEPTH_KEY], depth)
-
-    if not seen_symbol_with_path:
-        logging.warning('Symbols lack paths. Data will not be structured.')
-
-    # The (no path) bucket can be extremely large if we failed to get
-    # path information. Split it into subgroups if needed.
-    SplitNoPathBucket(result)
-
-    largest_list_len = MakeChildrenDictsIntoLists(result)
-
-    if largest_list_len > BIG_BUCKET_LIMIT:
-        logging.warning('There are sections with %d nodes. '
-                        'Results might be unusable.' % largest_list_len)
-    return result
-
-
-def DumpCompactTree(symbols, symbol_path_origin_dir, outfile):
-    tree_root = MakeCompactTree(symbols, symbol_path_origin_dir)
-    with open(outfile, 'w') as out:
-        out.write('var tree_data=')
-        # Use separators without whitespace to get a smaller file.
-        json.dump(tree_root, out, separators=(',', ':'))
-    print('Writing %d bytes json' % os.path.getsize(outfile))
-
-
-def MakeSourceMap(symbols):
-    sources = {}
-    for _sym, _symbol_type, size, path, _address in symbols:
-        key = None
-        if path:
-            key = os.path.normpath(path)
-        else:
-            key = '[no path]'
-        if key not in sources:
-            sources[key] = {'path': path, 'symbol_count': 0, 'size': 0}
-        record = sources[key]
-        record['size'] += size
-        record['symbol_count'] += 1
-    return sources
-
-
-# Regex for parsing "nm" output. A sample line looks like this:
-# 0167b39c 00000018 t ACCESS_DESCRIPTION_free /path/file.c:95
-#
-# The fields are: address, size, type, name, source location
-# Regular expression explained ( see also: https://xkcd.com/208 ):
-# ([0-9a-f]{8,}+)   The address
-# [\s]+             Whitespace separator
-# ([0-9a-f]{8,}+)   The size. From here on out it's all optional.
-# [\s]+             Whitespace separator
-# (\S?)             The symbol type, which is any non-whitespace char
-# [\s*]             Whitespace separator
-# ([^\t]*)          Symbol name, any non-tab character (spaces ok!)
-# [\t]?             Tab separator
-# (.*)              The location (filename[:linennum|?][ (discriminator n)]
-sNmPattern = re.compile(
-    r'([0-9a-f]{8,})[\s]+([0-9a-f]{8,})[\s]*(\S?)[\s*]([^\t]*)[\t]?(.*)')
-
-
-class Progress():
-
-    def __init__(self):
-        self.count = 0
-        self.skip_count = 0
-        self.collisions = 0
-        self.time_last_output = time.time()
-        self.count_last_output = 0
-        self.disambiguations = 0
-        self.was_ambiguous = 0
-
-
-def RunElfSymbolizer(outfile, library, addr2line_binary, nm_binary, jobs,
-                     disambiguate, src_path):
-    nm_output = RunNm(library, nm_binary)
-    nm_output_lines = nm_output.splitlines()
-    nm_output_lines_len = len(nm_output_lines)
-    address_symbol = {}
-    progress = Progress()
-
-    def map_address_symbol(symbol, addr):
-        progress.count += 1
-        if addr in address_symbol:
-            # 'Collision between %s and %s.' % (str(symbol.name),
-            #                                   str(address_symbol[addr].name))
-            progress.collisions += 1
-        else:
-            if symbol.disambiguated:
-                progress.disambiguations += 1
-            if symbol.was_ambiguous:
-                progress.was_ambiguous += 1
-
-            address_symbol[addr] = symbol
-
-        progress_output()
-
-    def progress_output():
-        progress_chunk = 100
-        if progress.count % progress_chunk == 0:
-            time_now = time.time()
-            time_spent = time_now - progress.time_last_output
-            if time_spent > 1.0:
-                # Only output at most once per second.
-                progress.time_last_output = time_now
-                chunk_size = progress.count - progress.count_last_output
-                progress.count_last_output = progress.count
-                if time_spent > 0:
-                    speed = chunk_size / time_spent
-                else:
-                    speed = 0
-                progress_percent = (100.0 * (
-                    progress.count + progress.skip_count) / nm_output_lines_len)
-                disambiguation_percent = 0
-                if progress.disambiguations != 0:
-                    disambiguation_percent = (100.0 * progress.disambiguations /
-                                              progress.was_ambiguous)
-
-                sys.stdout.write(
-                    '\r%.1f%%: Looked up %d symbols (%d collisions, '
-                    '%d disambiguations where %.1f%% succeeded)'
-                    ' - %.1f lookups/s.' %
-                    (progress_percent, progress.count, progress.collisions,
-                     progress.disambiguations, disambiguation_percent, speed))
-
-    # In case disambiguation was disabled, we remove the source path (which upon
-    # being set signals the symbolizer to enable disambiguation)
-    if not disambiguate:
-        src_path = None
-    symbolizer = elf_symbolizer.ELFSymbolizer(
-        library,
-        addr2line_binary,
-        map_address_symbol,
-        max_concurrent_jobs=jobs,
-        source_root_path=src_path)
-    user_interrupted = False
-    try:
-        for binary_line in nm_output_lines:
-            line = binary_line.decode()
-            match = sNmPattern.match(line)
-            if match:
-                location = match.group(5)
-                if not location:
-                    addr = int(match.group(1), 16)
-                    size = int(match.group(2), 16)
-                    if addr in address_symbol:  # Already looked up, shortcut
-                        # ELFSymbolizer.
-                        map_address_symbol(address_symbol[addr], addr)
-                        continue
-                    elif size == 0:
-                        # Save time by not looking up empty symbols (do they even exist?)
-                        print('Empty symbol: ' + line)
-                    else:
-                        symbolizer.SymbolizeAsync(addr, addr)
-                        continue
-
-            progress.skip_count += 1
-    except KeyboardInterrupt:
-        user_interrupted = True
-        print('Interrupting - killing subprocesses. Please wait.')
-
-    try:
-        symbolizer.Join()
-    except KeyboardInterrupt:
-        # Don't want to abort here since we will be finished in a few seconds.
-        user_interrupted = True
-        print('Patience you must have my young padawan.')
-
-    print('')
-
-    if user_interrupted:
-        print('Skipping the rest of the file mapping. '
-              'Output will not be fully classified.')
-
-    symbol_path_origin_dir = os.path.dirname(os.path.abspath(library))
-
-    with open(outfile, 'w') as out:
-        for binary_line in nm_output_lines:
-            line = binary_line.decode()
-            match = sNmPattern.match(line)
-            if match:
-                location = match.group(5)
-                if not location:
-                    addr = int(match.group(1), 16)
-                    symbol = address_symbol.get(addr)
-                    if symbol is not None:
-                        path = '??'
-                        if symbol.source_path is not None:
-                            path = os.path.abspath(
-                                os.path.join(symbol_path_origin_dir,
-                                             symbol.source_path))
-                        line_number = 0
-                        if symbol.source_line is not None:
-                            line_number = symbol.source_line
-                        out.write('%s\t%s:%d\n' % (line, path, line_number))
-                        continue
-
-            out.write('%s\n' % line)
-
-    print('%d symbols in the results.' % len(address_symbol))
-
-
-def RunNm(binary, nm_binary):
-    cmd = [
-        nm_binary, '-C', '--print-size', '--size-sort', '--reverse-sort', binary
-    ]
-    nm_process = subprocess.Popen(
-        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    (process_output, err_output) = nm_process.communicate()
-
-    if nm_process.returncode != 0:
-        if err_output:
-            raise Exception(err_output)
-        else:
-            raise Exception(process_output)
-
-    return process_output
-
-
-def GetNmSymbols(nm_infile, outfile, library, jobs, verbose, addr2line_binary,
-                 nm_binary, disambiguate, src_path):
-    if nm_infile is None:
-        if outfile is None:
-            outfile = tempfile.NamedTemporaryFile(delete=False).name
-
-        if verbose:
-            print('Running parallel addr2line, dumping symbols to ' + outfile)
-        RunElfSymbolizer(outfile, library, addr2line_binary, nm_binary, jobs,
-                         disambiguate, src_path)
-
-        nm_infile = outfile
-
-    elif verbose:
-        print('Using nm input from ' + nm_infile)
-    with open(nm_infile, 'r') as infile:
-        return list(binary_size_utils.ParseNm(infile))
-
-
-PAK_RESOURCE_ID_TO_STRING = {"inited": False}
-
-
-def LoadPakIdsFromResourceFile(filename):
-    """Given a file name, it loads everything that looks like a resource id
-  into PAK_RESOURCE_ID_TO_STRING."""
-    with open(filename) as resource_header:
-        for line in resource_header:
-            if line.startswith("#define "):
-                line_data = line.split()
-                if len(line_data) == 3:
-                    try:
-                        resource_number = int(line_data[2])
-                        resource_name = line_data[1]
-                        PAK_RESOURCE_ID_TO_STRING[
-                            resource_number] = resource_name
-                    except ValueError:
-                        pass
-
-
-def GetReadablePakResourceName(pak_file, resource_id):
-    """Pak resources have a numeric identifier. It is not helpful when
-  trying to locate where footprint is generated. This does its best to
-  map the number to a usable string."""
-    if not PAK_RESOURCE_ID_TO_STRING['inited']:
-        # Try to find resource header files generated by grit when
-        # building the pak file. We'll look for files named *resources.h"
-        # and lines of the type:
-        #    #define MY_RESOURCE_JS 1234
-        PAK_RESOURCE_ID_TO_STRING['inited'] = True
-        gen_dir = os.path.join(os.path.dirname(pak_file), 'gen')
-        if os.path.isdir(gen_dir):
-            for dirname, _dirs, files in os.walk(gen_dir):
-                for filename in files:
-                    if filename.endswith('resources.h'):
-                        LoadPakIdsFromResourceFile(
-                            os.path.join(dirname, filename))
-    return PAK_RESOURCE_ID_TO_STRING.get(resource_id,
-                                         'Pak Resource %d' % resource_id)
-
-
-def AddPakData(symbols, pak_file):
-    """Adds pseudo-symbols from a pak file."""
-    pak_file = os.path.abspath(pak_file)
-    with open(pak_file, 'rb') as pak:
-        data = pak.read()
-
-    PAK_FILE_VERSION = 4
-    HEADER_LENGTH = 2 * 4 + 1  # Two uint32s. (file version, number of entries)
-    # and one uint8 (encoding of text resources)
-    INDEX_ENTRY_SIZE = 2 + 4  # Each entry is a uint16 and a uint32.
-    version, num_entries, _encoding = struct.unpack('<IIB',
-                                                    data[:HEADER_LENGTH])
-    assert version == PAK_FILE_VERSION, (
-        'Unsupported pak file '
-        'version (%d) in %s. Only '
-        'support version %d' % (version, pak_file, PAK_FILE_VERSION))
-    if num_entries > 0:
-        # Read the index and data.
-        data = data[HEADER_LENGTH:]
-        for _ in range(num_entries):
-            resource_id, offset = struct.unpack('<HI', data[:INDEX_ENTRY_SIZE])
-            data = data[INDEX_ENTRY_SIZE:]
-            _next_id, next_offset = struct.unpack('<HI',
-                                                  data[:INDEX_ENTRY_SIZE])
-            resource_size = next_offset - offset
-
-            symbol_name = GetReadablePakResourceName(pak_file, resource_id)
-            symbol_path = pak_file
-            symbol_type = 'd'  # Data. Approximation.
-            symbol_size = resource_size
-            symbols.append((symbol_name, symbol_type, symbol_size, symbol_path))
-
-
-def _find_in_system_path(binary):
-    """Locate the full path to binary in the system path or return None
-  if not found."""
-    system_path = os.environ["PATH"].split(os.pathsep)
-    for path in system_path:
-        binary_path = os.path.join(path, binary)
-        if os.path.isfile(binary_path):
-            return binary_path
-    return None
-
-
-def CheckDebugFormatSupport(library, addr2line_binary):
-    """Kills the program if debug data is in an unsupported format.
-
-  There are two common versions of the DWARF debug formats and
-  since we are right now transitioning from DWARF2 to newer formats,
-  it's possible to have a mix of tools that are not compatible. Detect
-  that and abort rather than produce meaningless output."""
-    tool_output = subprocess.check_output([addr2line_binary,
-                                           '--version']).decode()
-    version_re = re.compile(r'^GNU [^ ]+ .* (\d+).(\d+).*?$', re.M)
-    parsed_output = version_re.match(tool_output)
-    major = int(parsed_output.group(1))
-    minor = int(parsed_output.group(2))
-    supports_dwarf4 = major > 2 or major == 2 and minor > 22
-
-    if supports_dwarf4:
-        return
-
-    print('Checking version of debug information in %s.' % library)
-    debug_info = subprocess.check_output(
-        ['readelf', '--debug-dump=info', '--dwarf-depth=1', library])
-    dwarf_version_re = re.compile(r'^\s+Version:\s+(\d+)$', re.M)
-    parsed_dwarf_format_output = dwarf_version_re.search(debug_info)
-    version = int(parsed_dwarf_format_output.group(1))
-    if version > 2:
-        print(
-            'The supplied tools only support DWARF2 debug data but the binary\n'
-            + 'uses DWARF%d. Update the tools or compile the binary\n' % version
-            + 'with -gdwarf-2.')
-        sys.exit(1)
-
-
-def main():
-    usage = """%prog [options]
-
-  Runs a spatial analysis on a given library, looking up the source locations
-  of its symbols and calculating how much space each directory, source file,
-  and so on is taking. The result is a report that can be used to pinpoint
-  sources of large portions of the binary, etceteras.
-
-  Under normal circumstances, you only need to pass two arguments, thusly:
-
-      %prog --library /path/to/library --destdir /path/to/output
-
-  In this mode, the program will dump the symbols from the specified library
-  and map those symbols back to source locations, producing a web-based
-  report in the specified output directory.
-
-  Other options are available via '--help'.
-  """
-    parser = optparse.OptionParser(usage=usage)
-    parser.add_option(
-        '--nm-in',
-        metavar='PATH',
-        help='if specified, use nm input from <path> instead of '
-        'generating it. Note that source locations should be '
-        'present in the file; i.e., no addr2line symbol lookups '
-        'will be performed when this option is specified. '
-        'Mutually exclusive with --library.')
-    parser.add_option(
-        '--destdir',
-        metavar='PATH',
-        help='write output to the specified directory. An HTML '
-        'report is generated here along with supporting files; '
-        'any existing report will be overwritten.')
-    parser.add_option(
-        '--library',
-        metavar='PATH',
-        help='if specified, process symbols in the library at '
-        'the specified path. Mutually exclusive with --nm-in.')
-    parser.add_option(
-        '--pak',
-        metavar='PATH',
-        help='if specified, includes the contents of the '
-        'specified *.pak file in the output.')
-    parser.add_option(
-        '--nm-binary',
-        help='use the specified nm binary to analyze library. '
-        'This is to be used when the nm in the path is not for '
-        'the right architecture or of the right version.')
-    parser.add_option(
-        '--addr2line-binary',
-        help='use the specified addr2line binary to analyze '
-        'library. This is to be used when the addr2line in '
-        'the path is not for the right architecture or '
-        'of the right version.')
-    parser.add_option(
-        '--jobs',
-        type='int',
-        help='number of jobs to use for the parallel '
-        'addr2line processing pool; defaults to 1. More '
-        'jobs greatly improve throughput but eat RAM like '
-        'popcorn, and take several gigabytes each. Start low '
-        'and ramp this number up until your machine begins to '
-        'struggle with RAM. '
-        'This argument is only valid when using --library.')
-    parser.add_option(
-        '-v',
-        '--verbose',
-        dest='verbose',
-        action='store_true',
-        help='be verbose, printing lots of status information.')
-    parser.add_option(
-        '--nm-out',
-        metavar='PATH',
-        help='(deprecated) No-op. nm.out is stored in --destdir.')
-    parser.add_option(
-        '--no-nm-out',
-        action='store_true',
-        help='do not keep the nm output file. This file is useful '
-        'if you want to see the fully processed nm output after '
-        'the symbols have been mapped to source locations, or if '
-        'you plan to run explain_binary_size_delta.py. By default '
-        'the file \'nm.out\' is placed alongside the generated '
-        'report. The nm.out file is only created when using '
-        '--library.')
-    parser.add_option(
-        '--disable-disambiguation',
-        action='store_true',
-        help='disables the disambiguation process altogether,'
-        ' NOTE: this may, depending on your toolchain, produce'
-        ' output with some symbols at the top layer if addr2line'
-        ' could not get the entire source path.')
-    parser.add_option(
-        '--source-path',
-        default='./',
-        help='the path to the source code of the output binary, '
-        'default set to current directory. Used in the'
-        ' disambiguation process.')
-    opts, _args = parser.parse_args()
-
-    if ((not opts.library) and
-        (not opts.nm_in)) or (opts.library and opts.nm_in):
-        parser.error('exactly one of --library or --nm-in is required')
-    if opts.nm_out:
-        print('WARNING: --nm-out is deprecated and has no effect.',
-              file=sys.stderr)
-    if (opts.nm_in):
-        if opts.jobs:
-            print('WARNING: --jobs has no effect when used with --nm-in',
-                  file=sys.stderr)
-    if not opts.destdir:
-        parser.error('--destdir is a required argument')
-    if not opts.jobs:
-        # Use the number of processors but cap between 2 and 4 since raw
-        # CPU power isn't the limiting factor. It's I/O limited, memory
-        # bus limited and available-memory-limited. Too many processes and
-        # the computer will run out of memory and it will be slow.
-        opts.jobs = max(2, min(4, multiprocessing.cpu_count()))
-
-    if opts.addr2line_binary:
-        assert os.path.isfile(opts.addr2line_binary)
-        addr2line_binary = opts.addr2line_binary
-    else:
-        addr2line_binary = _find_in_system_path('addr2line')
-        assert addr2line_binary, 'Unable to find addr2line in the path. '\
-            'Use --addr2line-binary to specify location.'
-
-    if opts.nm_binary:
-        assert os.path.isfile(opts.nm_binary)
-        nm_binary = opts.nm_binary
-    else:
-        nm_binary = _find_in_system_path('nm')
-        assert nm_binary, 'Unable to find nm in the path. Use --nm-binary '\
-            'to specify location.'
-
-    if opts.pak:
-        assert os.path.isfile(opts.pak), 'Could not find ' % opts.pak
-
-    print('addr2line: %s' % addr2line_binary)
-    print('nm: %s' % nm_binary)
-
-    if opts.library:
-        CheckDebugFormatSupport(opts.library, addr2line_binary)
-
-    # Prepare output directory and report guts
-    if not os.path.exists(opts.destdir):
-        os.makedirs(opts.destdir, 0o755)
-    nm_out = os.path.join(opts.destdir, 'nm.out')
-    if opts.no_nm_out:
-        nm_out = None
-
-    # Copy report boilerplate into output directory. This also proves that the
-    # output directory is safe for writing, so there should be no problems writing
-    # the nm.out file later.
-    data_js_file_name = os.path.join(opts.destdir, 'data.js')
-    d3_out = os.path.join(opts.destdir, 'd3')
-    if not os.path.exists(d3_out):
-        os.makedirs(d3_out, 0o755)
-    d3_src = os.path.join(os.path.dirname(__file__), '..', '..', 'd3', 'src')
-    template_src = os.path.join(os.path.dirname(__file__), 'template')
-    shutil.copy(os.path.join(d3_src, 'LICENSE'), d3_out)
-    shutil.copy(os.path.join(d3_src, 'd3.js'), d3_out)
-    shutil.copy(os.path.join(template_src, 'index.html'), opts.destdir)
-    shutil.copy(os.path.join(template_src, 'D3SymbolTreeMap.js'), opts.destdir)
-
-    # Run nm and/or addr2line to gather the data
-    symbols = GetNmSymbols(opts.nm_in, nm_out, opts.library, opts.jobs,
-                           opts.verbose is True, addr2line_binary, nm_binary,
-                           opts.disable_disambiguation is None,
-                           opts.source_path)
-
-    # Post-processing
-    if opts.pak:
-        AddPakData(symbols, opts.pak)
-    if opts.library:
-        symbol_path_origin_dir = os.path.dirname(os.path.abspath(opts.library))
-    else:
-        # Just a guess. Hopefully all paths in the input file are absolute.
-        symbol_path_origin_dir = os.path.abspath(os.getcwd())
-    # Dump JSON for the HTML report.
-    DumpCompactTree(symbols, symbol_path_origin_dir, data_js_file_name)
-    print('Report saved to ' + opts.destdir + '/index.html')
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/runtime/third_party/binary_size/src/template/D3SymbolTreeMap.js b/runtime/third_party/binary_size/src/template/D3SymbolTreeMap.js
deleted file mode 100644
index 88dd692..0000000
--- a/runtime/third_party/binary_size/src/template/D3SymbolTreeMap.js
+++ /dev/null
@@ -1,938 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// TODO:
-// 1. Visibility functions: base on boxPadding.t, not 15
-// 2. Track a maxDisplayDepth that is user-settable:
-//    maxDepth == currentRoot.depth + maxDisplayDepth
-function D3SymbolTreeMap(mapWidth, mapHeight, levelsToShow) {
-  this._mapContainer = undefined;
-  this._mapWidth = mapWidth;
-  this._mapHeight = mapHeight;
-  this.boxPadding = {'l': 5, 'r': 5, 't': 20, 'b': 5};
-  this.infobox = undefined;
-  this._maskContainer = undefined;
-  this._highlightContainer = undefined;
-  // Transition in this order:
-  // 1. Exiting items go away.
-  // 2. Updated items move.
-  // 3. New items enter.
-  this._exitDuration=500;
-  this._updateDuration=500;
-  this._enterDuration=500;
-  this._firstTransition=true;
-  this._layout = undefined;
-  this._currentRoot = undefined;
-  this._currentNodes = undefined;
-  this._treeData = undefined;
-  this._maxLevelsToShow = levelsToShow;
-  this._currentMaxDepth = this._maxLevelsToShow;
-}
-
-/**
- * Make a number pretty, with comma separators.
- */
-D3SymbolTreeMap._pretty = function(num) {
-  var asString = String(num);
-  var result = '';
-  var counter = 0;
-  for (var x = asString.length - 1; x >= 0; x--) {
-    counter++;
-    if (counter === 4) {
-      result = ',' + result;
-      counter = 1;
-    }
-    result = asString.charAt(x) + result;
-  }
-  return result;
-}
-
-/**
- * Express a number in terms of KiB, MiB, GiB, etc.
- * Note that these are powers of 2, not of 10.
- */
-D3SymbolTreeMap._byteify = function(num) {
-  var suffix;
-  if (num >= 1024) {
-    if (num >= 1024 * 1024 * 1024) {
-      suffix = 'GiB';
-      num = num / (1024 * 1024 * 1024);
-    } else if (num >= 1024 * 1024) {
-      suffix = 'MiB';
-      num = num / (1024 * 1024);
-    } else if (num >= 1024) {
-      suffix = 'KiB'
-      num = num / 1024;
-    }
-    return num.toFixed(2) + ' ' + suffix;
-  }
-  return num + ' B';
-}
-
-D3SymbolTreeMap._NM_SYMBOL_TYPE_DESCRIPTIONS = {
-  // Definitions concisely derived from the nm 'man' page
-  'A': 'Global absolute (A)',
-  'B': 'Global uninitialized data (B)',
-  'b': 'Local uninitialized data (b)',
-  'C': 'Global uninitialized common (C)',
-  'D': 'Global initialized data (D)',
-  'd': 'Local initialized data (d)',
-  'G': 'Global small initialized data (G)',
-  'g': 'Local small initialized data (g)',
-  'i': 'Indirect function (i)',
-  'N': 'Debugging (N)',
-  'p': 'Stack unwind (p)',
-  'R': 'Global read-only data (R)',
-  'r': 'Local read-only data (r)',
-  'S': 'Global small uninitialized data (S)',
-  's': 'Local small uninitialized data (s)',
-  'T': 'Global code (T)',
-  't': 'Local code (t)',
-  'U': 'Undefined (U)',
-  'u': 'Unique (u)',
-  'V': 'Global weak object (V)',
-  'v': 'Local weak object (v)',
-  'W': 'Global weak symbol (W)',
-  'w': 'Local weak symbol (w)',
-  '@': 'Vtable entry (@)', // non-standard, hack.
-  '-': 'STABS debugging (-)',
-  '?': 'Unrecognized (?)',
-};
-D3SymbolTreeMap._NM_SYMBOL_TYPES = '';
-for (var symbol_type in D3SymbolTreeMap._NM_SYMBOL_TYPE_DESCRIPTIONS) {
-  D3SymbolTreeMap._NM_SYMBOL_TYPES += symbol_type;
-}
-
-/**
- * Given a symbol type code, look up and return a human-readable description
- * of that symbol type. If the symbol type does not match one of the known
- * types, the unrecognized description (corresponding to symbol type '?') is
- * returned instead of null or undefined.
- */
-D3SymbolTreeMap._getSymbolDescription = function(type) {
-  var result = D3SymbolTreeMap._NM_SYMBOL_TYPE_DESCRIPTIONS[type];
-  if (result === undefined) {
-    result = D3SymbolTreeMap._NM_SYMBOL_TYPE_DESCRIPTIONS['?'];
-  }
-  return result;
-}
-
-// Qualitative 12-value pastel Brewer palette.
-D3SymbolTreeMap._colorArray = [
-  'rgb(141,211,199)',
-  'rgb(255,255,179)',
-  'rgb(190,186,218)',
-  'rgb(251,128,114)',
-  'rgb(128,177,211)',
-  'rgb(253,180,98)',
-  'rgb(179,222,105)',
-  'rgb(252,205,229)',
-  'rgb(217,217,217)',
-  'rgb(188,128,189)',
-  'rgb(204,235,197)',
-  'rgb(255,237,111)'];
-
-D3SymbolTreeMap._initColorMap = function() {
-  var map = {};
-  var numColors = D3SymbolTreeMap._colorArray.length;
-  var count = 0;
-  for (var key in D3SymbolTreeMap._NM_SYMBOL_TYPE_DESCRIPTIONS) {
-    var index = count++ % numColors;
-    map[key] = d3.rgb(D3SymbolTreeMap._colorArray[index]);
-  }
-  D3SymbolTreeMap._colorMap = map;
-}
-D3SymbolTreeMap._initColorMap();
-
-D3SymbolTreeMap.getColorForType = function(type) {
-  var result = D3SymbolTreeMap._colorMap[type];
-  if (result === undefined) return d3.rgb('rgb(255,255,255)');
-  return result;
-}
-
-D3SymbolTreeMap.prototype.init = function() {
-  this.infobox = this._createInfoBox();
-  this._mapContainer = d3.select('body').append('div')
-      .style('position', 'relative')
-      .style('width', this._mapWidth)
-      .style('height', this._mapHeight)
-      .style('padding', 0)
-      .style('margin', 0)
-      .style('box-shadow', '5px 5px 5px #888');
-  this._layout = this._createTreeMapLayout();
-  this._setData(tree_data); // TODO: Don't use global 'tree_data'
-}
-
-/**
- * Sets the data displayed by the treemap and layint out the map.
- */
-D3SymbolTreeMap.prototype._setData = function(data) {
-  this._treeData = data;
-  console.time('_crunchStats');
-  this._crunchStats(data);
-  console.timeEnd('_crunchStats');
-  this._currentRoot = this._treeData;
-  this._currentNodes = this._layout.nodes(this._currentRoot);
-  this._currentMaxDepth = this._maxLevelsToShow;
-  this._doLayout();
-}
-
-/**
- * Recursively traverses the entire tree starting from the specified node,
- * computing statistics and recording metadata as it goes. Call this method
- * only once per imported tree.
- */
-D3SymbolTreeMap.prototype._crunchStats = function(node) {
-  var stack = [];
-  stack.idCounter = 0;
-  this._crunchStatsHelper(stack, node);
-}
-
-/**
- * Invoke the specified visitor function on all data elements currently shown
- * in the treemap including any and all of their children, starting at the
- * currently-displayed root and descending recursively. The function will be
- * passed the datum element representing each node. No traversal guarantees
- * are made.
- */
-D3SymbolTreeMap.prototype.visitFromDisplayedRoot = function(visitor) {
-  this._visit(this._currentRoot, visitor);
-}
-
-/**
- * Helper function for visit functions.
- */
-D3SymbolTreeMap.prototype._visit = function(datum, visitor) {
-  visitor.call(this, datum);
-  if (datum.children) for (var i = 0; i < datum.children.length; i++) {
-    this._visit(datum.children[i], visitor);
-  }
-}
-
-D3SymbolTreeMap.prototype._crunchStatsHelper = function(stack, node) {
-  // Only overwrite the node ID if it isn't already set.
-  // This allows stats to be crunched multiple times on subsets of data
-  // without breaking the data-to-ID bindings. New nodes get new IDs.
-  if (node.id === undefined) node.id = stack.idCounter++;
-  if (node.children === undefined) {
-    // Leaf node (symbol); accumulate stats.
-    for (var i = 0; i < stack.length; i++) {
-      var ancestor = stack[i];
-      if (!ancestor.symbol_stats) ancestor.symbol_stats = {};
-      if (ancestor.symbol_stats[node.t] === undefined) {
-        // New symbol type we haven't seen before, just record.
-        ancestor.symbol_stats[node.t] = {'count': 1,
-                                         'size': node.value};
-      } else {
-        // Existing symbol type, increment.
-        ancestor.symbol_stats[node.t].count++;
-        ancestor.symbol_stats[node.t].size += node.value;
-      }
-    }
-  } else for (var i = 0; i < node.children.length; i++) {
-    stack.push(node);
-    this._crunchStatsHelper(stack, node.children[i]);
-    stack.pop();
-  }
-}
-
-D3SymbolTreeMap.prototype._createTreeMapLayout = function() {
-  var result = d3.layout.treemap()
-      .padding([this.boxPadding.t, this.boxPadding.r,
-                this.boxPadding.b, this.boxPadding.l])
-      .size([this._mapWidth, this._mapHeight]);
-  return result;
-}
-
-D3SymbolTreeMap.prototype.resize = function(width, height) {
-  this._mapWidth = width;
-  this._mapHeight = height;
-  this._mapContainer.style('width', width).style('height', height);
-  this._layout.size([this._mapWidth, this._mapHeight]);
-  this._currentNodes = this._layout.nodes(this._currentRoot);
-  this._doLayout();
-}
-
-D3SymbolTreeMap.prototype._zoomDatum = function(datum) {
-  if (this._currentRoot === datum) return; // already here
-  this._hideHighlight(datum);
-  this._hideInfoBox(datum);
-  this._currentRoot = datum;
-  this._currentNodes = this._layout.nodes(this._currentRoot);
-  this._currentMaxDepth = this._currentRoot.depth + this._maxLevelsToShow;
-  console.log('zooming into datum ' + this._currentRoot.n);
-  this._doLayout();
-}
-
-D3SymbolTreeMap.prototype.setMaxLevels = function(levelsToShow) {
-  this._maxLevelsToShow = levelsToShow;
-  this._currentNodes = this._layout.nodes(this._currentRoot);
-  this._currentMaxDepth = this._currentRoot.depth + this._maxLevelsToShow;
-  console.log('setting max levels to show: ' + this._maxLevelsToShow);
-  this._doLayout();
-}
-
-/**
- * Clone the specified tree, returning an independent copy of the data.
- * Only the original attributes expected to exist prior to invoking
- * _crunchStatsHelper are retained, with the exception of the 'id' attribute
- * (which must be retained for proper transitions).
- * If the optional filter parameter is provided, it will be called with 'this'
- * set to this treemap instance and passed the 'datum' object as an argument.
- * When specified, the copy will retain only the data for which the filter
- * function returns true.
- */
-D3SymbolTreeMap.prototype._clone = function(datum, filter) {
-  var trackingStats = false;
-  if (this.__cloneState === undefined) {
-    console.time('_clone');
-    trackingStats = true;
-    this.__cloneState = {'accepted': 0, 'rejected': 0,
-                         'forced': 0, 'pruned': 0};
-  }
-
-  // Must go depth-first. All parents of children that are accepted by the
-  // filter must be preserved!
-  var copy = {'n': datum.n, 'k': datum.k};
-  var childAccepted = false;
-  if (datum.children !== undefined) {
-    for (var i = 0; i < datum.children.length; i++) {
-      var copiedChild = this._clone(datum.children[i], filter);
-      if (copiedChild !== undefined) {
-        childAccepted = true; // parent must also be accepted.
-        if (copy.children === undefined) copy.children = [];
-        copy.children.push(copiedChild);
-      }
-    }
-  }
-
-  // Ignore nodes that don't match the filter, when present.
-  var accept = false;
-  if (childAccepted) {
-    // Parent of an accepted child must also be accepted.
-    this.__cloneState.forced++;
-    accept = true;
-  } else if (filter !== undefined && filter.call(this, datum) !== true) {
-    this.__cloneState.rejected++;
-  } else if (datum.children === undefined) {
-    // Accept leaf nodes that passed the filter
-    this.__cloneState.accepted++;
-    accept = true;
-  } else {
-    // Non-leaf node. If no children are accepted, prune it.
-    this.__cloneState.pruned++;
-  }
-
-  if (accept) {
-    if (datum.id !== undefined) copy.id = datum.id;
-    if (datum.lastPathElement !== undefined) {
-      copy.lastPathElement = datum.lastPathElement;
-    }
-    if (datum.t !== undefined) copy.t = datum.t;
-    if (datum.value !== undefined && datum.children === undefined) {
-      copy.value = datum.value;
-    }
-  } else {
-    // Discard the copy we were going to return
-    copy = undefined;
-  }
-
-  if (trackingStats === true) {
-    // We are the fist call in the recursive chain.
-    console.timeEnd('_clone');
-    var totalAccepted = this.__cloneState.accepted +
-                        this.__cloneState.forced;
-    console.log(
-        totalAccepted + ' nodes retained (' +
-        this.__cloneState.forced + ' forced by accepted children, ' +
-        this.__cloneState.accepted + ' accepted on their own merits), ' +
-        this.__cloneState.rejected + ' nodes (and their children) ' +
-                                     'filtered out,' +
-        this.__cloneState.pruned + ' nodes pruned because because no ' +
-                                   'children remained.');
-    delete this.__cloneState;
-  }
-  return copy;
-}
-
-D3SymbolTreeMap.prototype.filter = function(filter) {
-  // Ensure we have a copy of the original root.
-  if (this._backupTree === undefined) this._backupTree = this._treeData;
-  this._mapContainer.selectAll('div').remove();
-  this._setData(this._clone(this._backupTree, filter));
-}
-
-D3SymbolTreeMap.prototype._doLayout = function() {
-  console.time('_doLayout');
-  this._handleInodes();
-  this._handleLeaves();
-  this._firstTransition = false;
-  console.timeEnd('_doLayout');
-}
-
-D3SymbolTreeMap.prototype._highlightElement = function(datum, selection) {
-  this._showHighlight(datum, selection);
-}
-
-D3SymbolTreeMap.prototype._unhighlightElement = function(datum, selection) {
-  this._hideHighlight(datum, selection);
-}
-
-D3SymbolTreeMap.prototype._handleInodes = function() {
-  console.time('_handleInodes');
-  var thisTreeMap = this;
-  var inodes = this._currentNodes.filter(function(datum){
-    return (datum.depth <= thisTreeMap._currentMaxDepth) &&
-            datum.children !== undefined;
-  });
-  var cellsEnter = this._mapContainer.selectAll('div.inode')
-      .data(inodes, function(datum) { return datum.id; })
-      .enter()
-      .append('div').attr('class', 'inode').attr('id', function(datum){
-          return 'node-' + datum.id;});
-
-
-  // Define enter/update/exit for inodes
-  cellsEnter
-      .append('div')
-      .attr('class', 'rect inode_rect_entering')
-      .style('z-index', function(datum) { return datum.id * 2; })
-      .style('position', 'absolute')
-      .style('left', function(datum) { return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum){ return datum.dx; })
-      .style('height', function(datum){ return datum.dy; })
-      .style('opacity', '0')
-      .style('border', '1px solid black')
-      .style('background-image', function(datum) {
-        return thisTreeMap._makeSymbolBucketBackgroundImage.call(
-               thisTreeMap, datum);
-      })
-      .style('background-color', function(datum) {
-        if (datum.t === undefined) return 'rgb(220,220,220)';
-        return D3SymbolTreeMap.getColorForType(datum.t).toString();
-      })
-      .on('mouseover', function(datum){
-        thisTreeMap._highlightElement.call(
-            thisTreeMap, datum, d3.select(this));
-        thisTreeMap._showInfoBox.call(thisTreeMap, datum);
-      })
-      .on('mouseout', function(datum){
-        thisTreeMap._unhighlightElement.call(
-            thisTreeMap, datum, d3.select(this));
-        thisTreeMap._hideInfoBox.call(thisTreeMap, datum);
-      })
-      .on('mousemove', function(){
-          thisTreeMap._moveInfoBox.call(thisTreeMap, event);
-      })
-      .on('dblclick', function(datum){
-        if (datum !== thisTreeMap._currentRoot) {
-          // Zoom into the selection
-          thisTreeMap._zoomDatum(datum);
-        } else if (datum.parent) {
-          console.log('event.shiftKey=' + event.shiftKey);
-          if (event.shiftKey === true) {
-            // Back to root
-            thisTreeMap._zoomDatum(thisTreeMap._treeData);
-          } else {
-            // Zoom out of the selection
-            thisTreeMap._zoomDatum(datum.parent);
-          }
-        }
-      });
-  cellsEnter
-      .append('div')
-      .attr('class', 'label inode_label_entering')
-      .style('z-index', function(datum) { return (datum.id * 2) + 1; })
-      .style('position', 'absolute')
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum) { return datum.dx; })
-      .style('height', function(datum) { return thisTreeMap.boxPadding.t; })
-      .style('opacity', '0')
-      .style('pointer-events', 'none')
-      .style('-webkit-user-select', 'none')
-      .style('overflow', 'hidden') // required for ellipsis
-      .style('white-space', 'nowrap') // required for ellipsis
-      .style('text-overflow', 'ellipsis')
-      .style('text-align', 'center')
-      .style('vertical-align', 'top')
-      .style('visibility', function(datum) {
-        return (datum.dx < 15 || datum.dy < 15) ? 'hidden' : 'visible';
-      })
-      .text(function(datum) {
-        var sizeish = ' [' + D3SymbolTreeMap._byteify(datum.value) + ']'
-        var text;
-        if (datum.k === 'b') { // bucket
-          if (datum === thisTreeMap._currentRoot) {
-            text = thisTreeMap.pathFor(datum) + ': '
-                + D3SymbolTreeMap._getSymbolDescription(datum.t)
-          } else {
-            text = D3SymbolTreeMap._getSymbolDescription(datum.t);
-          }
-        } else if (datum === thisTreeMap._currentRoot) {
-          // The top-most level should always show the complete path
-          text = thisTreeMap.pathFor(datum);
-        } else {
-          // Anything that isn't a bucket or a leaf (symbol) or the
-          // current root should just show its name.
-          text = datum.n;
-        }
-        return text + sizeish;
-      }
-  );
-
-  // Complicated transition logic:
-  // For nodes that are entering, we want to fade them in in-place AFTER
-  // any adjusting nodes have resized and moved around. That way, new nodes
-  // seamlessly appear in the right spot after their containers have resized
-  // and moved around.
-  // To do this we do some trickery:
-  // 1. Define a '_entering' class on the entering elements
-  // 2. Use this to select only the entering elements and apply the opacity
-  //    transition.
-  // 3. Use the same transition to drop the '_entering' suffix, so that they
-  //    will correctly update in later zoom/resize/whatever operations.
-  // 4. The update transition is achieved by selecting the elements without
-  //    the '_entering_' suffix and applying movement and resizing transition
-  //    effects.
-  this._mapContainer.selectAll('div.inode_rect_entering').transition()
-      .duration(thisTreeMap._enterDuration).delay(
-          this._firstTransition ? 0 : thisTreeMap._exitDuration +
-              thisTreeMap._updateDuration)
-      .attr('class', 'rect inode_rect')
-      .style('opacity', '1')
-  this._mapContainer.selectAll('div.inode_label_entering').transition()
-      .duration(thisTreeMap._enterDuration).delay(
-          this._firstTransition ? 0 : thisTreeMap._exitDuration +
-              thisTreeMap._updateDuration)
-      .attr('class', 'label inode_label')
-      .style('opacity', '1')
-  this._mapContainer.selectAll('div.inode_rect').transition()
-      .duration(thisTreeMap._updateDuration).delay(thisTreeMap._exitDuration)
-      .style('opacity', '1')
-      .style('background-image', function(datum) {
-        return thisTreeMap._makeSymbolBucketBackgroundImage.call(
-            thisTreeMap, datum);
-      })
-      .style('left', function(datum) { return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum){ return datum.dx; })
-      .style('height', function(datum){ return datum.dy; });
-  this._mapContainer.selectAll('div.inode_label').transition()
-      .duration(thisTreeMap._updateDuration).delay(thisTreeMap._exitDuration)
-      .style('opacity', '1')
-      .style('visibility', function(datum) {
-        return (datum.dx < 15 || datum.dy < 15) ? 'hidden' : 'visible';
-      })
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum) { return datum.dx; })
-      .style('height', function(datum) { return thisTreeMap.boxPadding.t; })
-      .text(function(datum) {
-        var sizeish = ' [' + D3SymbolTreeMap._byteify(datum.value) + ']'
-        var text;
-        if (datum.k === 'b') {
-          if (datum === thisTreeMap._currentRoot) {
-            text = thisTreeMap.pathFor(datum) + ': ' +
-                D3SymbolTreeMap._getSymbolDescription(datum.t)
-          } else {
-            text = D3SymbolTreeMap._getSymbolDescription(datum.t);
-          }
-        } else if (datum === thisTreeMap._currentRoot) {
-          // The top-most level should always show the complete path
-          text = thisTreeMap.pathFor(datum);
-        } else {
-          // Anything that isn't a bucket or a leaf (symbol) or the
-          // current root should just show its name.
-          text = datum.n;
-        }
-        return text + sizeish;
-      });
-  var exit = this._mapContainer.selectAll('div.inode')
-      .data(inodes, function(datum) { return 'inode-' + datum.id; })
-      .exit();
-  exit.selectAll('div.inode_rect').transition().duration(
-      thisTreeMap._exitDuration).style('opacity', 0);
-  exit.selectAll('div.inode_label').transition().duration(
-      thisTreeMap._exitDuration).style('opacity', 0);
-  exit.transition().delay(thisTreeMap._exitDuration + 1).remove();
-
-  console.log(inodes.length + ' inodes layed out.');
-  console.timeEnd('_handleInodes');
-}
-
-D3SymbolTreeMap.prototype._handleLeaves = function() {
-  console.time('_handleLeaves');
-  var color_fn = d3.scale.category10();
-  var thisTreeMap = this;
-  var leaves = this._currentNodes.filter(function(datum){
-    return (datum.depth <= thisTreeMap._currentMaxDepth) &&
-        datum.children === undefined; });
-  var cellsEnter = this._mapContainer.selectAll('div.leaf')
-      .data(leaves, function(datum) { return datum.id; })
-      .enter()
-      .append('div').attr('class', 'leaf').attr('id', function(datum){
-        return 'node-' + datum.id;
-      });
-
-  // Define enter/update/exit for leaves
-  cellsEnter
-      .append('div')
-      .attr('class', 'rect leaf_rect_entering')
-      .style('z-index', function(datum) { return datum.id * 2; })
-      .style('position', 'absolute')
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum){ return datum.dx; })
-      .style('height', function(datum){ return datum.dy; })
-      .style('opacity', '0')
-      .style('background-color', function(datum) {
-        if (datum.t === undefined) return 'rgb(220,220,220)';
-        return D3SymbolTreeMap.getColorForType(datum.t)
-            .darker(0.3).toString();
-      })
-      .style('border', '1px solid black')
-      .on('mouseover', function(datum){
-        thisTreeMap._highlightElement.call(
-            thisTreeMap, datum, d3.select(this));
-        thisTreeMap._showInfoBox.call(thisTreeMap, datum);
-      })
-      .on('mouseout', function(datum){
-        thisTreeMap._unhighlightElement.call(
-            thisTreeMap, datum, d3.select(this));
-        thisTreeMap._hideInfoBox.call(thisTreeMap, datum);
-      })
-      .on('mousemove', function(){ thisTreeMap._moveInfoBox.call(
-        thisTreeMap, event);
-      });
-  cellsEnter
-      .append('div')
-      .attr('class', 'label leaf_label_entering')
-      .style('z-index', function(datum) { return (datum.id * 2) + 1; })
-      .style('position', 'absolute')
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum) { return datum.dx; })
-      .style('height', function(datum) { return datum.dy; })
-      .style('opacity', '0')
-      .style('pointer-events', 'none')
-      .style('-webkit-user-select', 'none')
-      .style('overflow', 'hidden') // required for ellipsis
-      .style('white-space', 'nowrap') // required for ellipsis
-      .style('text-overflow', 'ellipsis')
-      .style('text-align', 'center')
-      .style('vertical-align', 'middle')
-      .style('visibility', function(datum) {
-        return (datum.dx < 15 || datum.dy < 15) ? 'hidden' : 'visible';
-      })
-      .text(function(datum) { return datum.n; });
-
-  // Complicated transition logic: See note in _handleInodes()
-  this._mapContainer.selectAll('div.leaf_rect_entering').transition()
-      .duration(thisTreeMap._enterDuration).delay(
-          this._firstTransition ? 0 : thisTreeMap._exitDuration +
-              thisTreeMap._updateDuration)
-      .attr('class', 'rect leaf_rect')
-      .style('opacity', '1')
-  this._mapContainer.selectAll('div.leaf_label_entering').transition()
-      .duration(thisTreeMap._enterDuration).delay(
-          this._firstTransition ? 0 : thisTreeMap._exitDuration +
-              thisTreeMap._updateDuration)
-      .attr('class', 'label leaf_label')
-      .style('opacity', '1')
-  this._mapContainer.selectAll('div.leaf_rect').transition()
-      .duration(thisTreeMap._updateDuration).delay(thisTreeMap._exitDuration)
-      .style('opacity', '1')
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum){ return datum.dx; })
-      .style('height', function(datum){ return datum.dy; });
-  this._mapContainer.selectAll('div.leaf_label').transition()
-      .duration(thisTreeMap._updateDuration).delay(thisTreeMap._exitDuration)
-      .style('opacity', '1')
-      .style('visibility', function(datum) {
-          return (datum.dx < 15 || datum.dy < 15) ? 'hidden' : 'visible';
-      })
-      .style('left', function(datum){ return datum.x; })
-      .style('top', function(datum){ return datum.y; })
-      .style('width', function(datum) { return datum.dx; })
-      .style('height', function(datum) { return datum.dy; });
-  var exit = this._mapContainer.selectAll('div.leaf')
-      .data(leaves, function(datum) { return 'leaf-' + datum.id; })
-      .exit();
-  exit.selectAll('div.leaf_rect').transition()
-      .duration(thisTreeMap._exitDuration)
-      .style('opacity', 0);
-  exit.selectAll('div.leaf_label').transition()
-      .duration(thisTreeMap._exitDuration)
-      .style('opacity', 0);
-  exit.transition().delay(thisTreeMap._exitDuration + 1).remove();
-
-  console.log(leaves.length + ' leaves layed out.');
-  console.timeEnd('_handleLeaves');
-}
-
-D3SymbolTreeMap.prototype._makeSymbolBucketBackgroundImage = function(datum) {
-  if (!(datum.t === undefined && datum.depth == this._currentMaxDepth)) {
-    return 'none';
-  }
-  var text = '';
-  var lastStop = 0;
-  for (var x = 0; x < D3SymbolTreeMap._NM_SYMBOL_TYPES.length; x++) {
-    symbol_type = D3SymbolTreeMap._NM_SYMBOL_TYPES.charAt(x);
-    var stats = datum.symbol_stats[symbol_type];
-    if (stats !== undefined) {
-      if (text.length !== 0) {
-        text += ', ';
-      }
-      var percent = 100 * (stats.size / datum.value);
-      var nowStop = lastStop + percent;
-      var tempcolor = D3SymbolTreeMap.getColorForType(symbol_type);
-      var color = d3.rgb(tempcolor).toString();
-      text += color + ' ' + lastStop + '%, ' + color + ' ' +
-          nowStop + '%';
-      lastStop = nowStop;
-    }
-  }
-  return 'linear-gradient(' + (datum.dx > datum.dy ? 'to right' :
-                               'to bottom') + ', ' + text + ')';
-}
-
-D3SymbolTreeMap.prototype.pathFor = function(datum) {
-  if (datum.__path) return datum.__path;
-  parts=[];
-  node = datum;
-  while (node) {
-    if (node.k === 'p') { // path node
-      if(node.n !== '/') parts.unshift(node.n);
-    }
-    node = node.parent;
-  }
-  datum.__path = '/' + parts.join('/');
-  return datum.__path;
-}
-
-D3SymbolTreeMap.prototype._createHighlight = function(datum, selection) {
-  var x = parseInt(selection.style('left'));
-  var y = parseInt(selection.style('top'));
-  var w = parseInt(selection.style('width'));
-  var h = parseInt(selection.style('height'));
-  datum.highlight = this._mapContainer.append('div')
-      .attr('id', 'h-' + datum.id)
-      .attr('class', 'highlight')
-      .style('pointer-events', 'none')
-      .style('-webkit-user-select', 'none')
-      .style('z-index', '999999')
-      .style('position', 'absolute')
-      .style('top', y-2)
-      .style('left', x-2)
-      .style('width', w+4)
-      .style('height', h+4)
-      .style('margin', 0)
-      .style('padding', 0)
-      .style('border', '4px outset rgba(250,40,200,0.9)')
-      .style('box-sizing', 'border-box')
-      .style('opacity', 0.0);
-}
-
-D3SymbolTreeMap.prototype._showHighlight = function(datum, selection) {
-  if (datum === this._currentRoot) return;
-  if (datum.highlight === undefined) {
-    this._createHighlight(datum, selection);
-  }
-  datum.highlight.transition().duration(200).style('opacity', 1.0);
-}
-
-D3SymbolTreeMap.prototype._hideHighlight = function(datum, selection) {
-  if (datum.highlight === undefined) return;
-  datum.highlight.transition().duration(750)
-      .style('opacity', 0)
-      .each('end', function(){
-        if (datum.highlight) datum.highlight.remove();
-        delete datum.highlight;
-      });
-}
-
-D3SymbolTreeMap.prototype._createInfoBox = function() {
-  return d3.select('body')
-      .append('div')
-      .attr('id', 'infobox')
-      .style('z-index', '2147483647') // (2^31) - 1: Hopefully safe :)
-      .style('position', 'absolute')
-      .style('visibility', 'hidden')
-      .style('background-color', 'rgba(255,255,255, 0.9)')
-      .style('border', '1px solid black')
-      .style('padding', '10px')
-      .style('-webkit-user-select', 'none')
-      .style('box-shadow', '3px 3px rgba(70,70,70,0.5)')
-      .style('border-radius', '10px')
-      .style('white-space', 'nowrap');
-}
-
-D3SymbolTreeMap.prototype._showInfoBox = function(datum) {
-  this.infobox.text('');
-  var numSymbols = 0;
-  var sizeish = D3SymbolTreeMap._pretty(datum.value) + ' bytes (' +
-      D3SymbolTreeMap._byteify(datum.value) + ')';
-  if (datum.k === 'p' || datum.k === 'b') { // path or bucket
-    if (datum.symbol_stats) { // can be empty if filters are applied
-      for (var x = 0; x < D3SymbolTreeMap._NM_SYMBOL_TYPES.length; x++) {
-        symbol_type = D3SymbolTreeMap._NM_SYMBOL_TYPES.charAt(x);
-        var stats = datum.symbol_stats[symbol_type];
-        if (stats !== undefined) numSymbols += stats.count;
-      }
-    }
-  } else if (datum.k === 's') { // symbol
-    numSymbols = 1;
-  }
-
-  if (datum.k === 'p' && !datum.lastPathElement) {
-    this.infobox.append('div').text('Directory: ' + this.pathFor(datum))
-    this.infobox.append('div').text('Size: ' + sizeish);
-  } else {
-    if (datum.k === 'p') { // path
-      this.infobox.append('div').text('File: ' + this.pathFor(datum))
-      this.infobox.append('div').text('Size: ' + sizeish);
-    } else if (datum.k === 'b') { // bucket
-      this.infobox.append('div').text('Symbol Bucket: ' +
-          D3SymbolTreeMap._getSymbolDescription(datum.t));
-      this.infobox.append('div').text('Count: ' + numSymbols);
-      this.infobox.append('div').text('Size: ' + sizeish);
-      this.infobox.append('div').text('Location: ' + this.pathFor(datum))
-    } else if (datum.k === 's') { // symbol
-      this.infobox.append('div').text('Symbol: ' + datum.n);
-      this.infobox.append('div').text('Type: ' +
-          D3SymbolTreeMap._getSymbolDescription(datum.t));
-      this.infobox.append('div').text('Size: ' + sizeish);
-      this.infobox.append('div').text('Location: ' + this.pathFor(datum))
-    }
-  }
-  if (datum.k === 'p') {
-    this.infobox.append('div')
-        .text('Number of symbols: ' + D3SymbolTreeMap._pretty(numSymbols));
-    if (datum.symbol_stats) { // can be empty if filters are applied
-      var table = this.infobox.append('table')
-          .attr('border', 1).append('tbody');
-      var header = table.append('tr');
-      header.append('th').text('Type');
-      header.append('th').text('Count');
-      header.append('th')
-          .style('white-space', 'nowrap')
-          .text('Total Size (Bytes)');
-      for (var x = 0; x < D3SymbolTreeMap._NM_SYMBOL_TYPES.length; x++) {
-        symbol_type = D3SymbolTreeMap._NM_SYMBOL_TYPES.charAt(x);
-        var stats = datum.symbol_stats[symbol_type];
-        if (stats !== undefined) {
-          var tr = table.append('tr');
-          tr.append('td')
-              .style('white-space', 'nowrap')
-              .text(D3SymbolTreeMap._getSymbolDescription(
-                  symbol_type));
-          tr.append('td').text(D3SymbolTreeMap._pretty(stats.count));
-          tr.append('td').text(D3SymbolTreeMap._pretty(stats.size));
-        }
-      }
-    }
-  }
-  this.infobox.style('visibility', 'visible');
-}
-
-D3SymbolTreeMap.prototype._hideInfoBox = function(datum) {
-  this.infobox.style('visibility', 'hidden');
-}
-
-D3SymbolTreeMap.prototype._moveInfoBox = function(event) {
-  var element = document.getElementById('infobox');
-  var w = element.offsetWidth;
-  var h = element.offsetHeight;
-  var offsetLeft = 10;
-  var offsetTop = 10;
-
-  var rightLimit = window.innerWidth;
-  var rightEdge = event.pageX + offsetLeft + w;
-  if (rightEdge > rightLimit) {
-    // Too close to screen edge, reflect around the cursor
-    offsetLeft = -1 * (w + offsetLeft);
-  }
-
-  var bottomLimit = window.innerHeight;
-  var bottomEdge = event.pageY + offsetTop + h;
-  if (bottomEdge > bottomLimit) {
-    // Too close ot screen edge, reflect around the cursor
-    offsetTop = -1 * (h + offsetTop);
-  }
-
-  this.infobox.style('top', (event.pageY + offsetTop) + 'px')
-      .style('left', (event.pageX + offsetLeft) + 'px');
-}
-
-D3SymbolTreeMap.prototype.biggestSymbols = function(maxRecords) {
-  var result = undefined;
-  var smallest = undefined;
-  var sortFunction = function(a,b) {
-    var result = b.value - a.value;
-    if (result !== 0) return result; // sort by size
-    var pathA = treemap.pathFor(a); // sort by path
-    var pathB = treemap.pathFor(b);
-    if (pathA > pathB) return 1;
-    if (pathB > pathA) return -1;
-    return a.n - b.n; // sort by symbol name
-  };
-  this.visitFromDisplayedRoot(function(datum) {
-    if (datum.children) return; // ignore non-leaves
-    if (!result) { // first element
-      result = [datum];
-      smallest = datum.value;
-      return;
-    }
-    if (result.length < maxRecords) { // filling the array
-      result.push(datum);
-      return;
-    }
-    if (datum.value > smallest) { // array is already full
-      result.push(datum);
-      result.sort(sortFunction);
-      result.pop(); // get rid of smallest element
-      smallest = result[maxRecords - 1].value; // new threshold for entry
-    }
-  });
-  result.sort(sortFunction);
-  return result;
-}
-
-D3SymbolTreeMap.prototype.biggestPaths = function(maxRecords) {
-  var result = undefined;
-  var smallest = undefined;
-  var sortFunction = function(a,b) {
-    var result = b.value - a.value;
-    if (result !== 0) return result; // sort by size
-    var pathA = treemap.pathFor(a); // sort by path
-    var pathB = treemap.pathFor(b);
-    if (pathA > pathB) return 1;
-    if (pathB > pathA) return -1;
-    console.log('warning, multiple entries for the same path: ' + pathA);
-    return 0; // should be impossible
-  };
-  this.visitFromDisplayedRoot(function(datum) {
-    if (!datum.lastPathElement) return; // ignore non-files
-    if (!result) { // first element
-      result = [datum];
-      smallest = datum.value;
-      return;
-    }
-    if (result.length < maxRecords) { // filling the array
-      result.push(datum);
-      return;
-    }
-    if (datum.value > smallest) { // array is already full
-      result.push(datum);
-      result.sort(sortFunction);
-      result.pop(); // get rid of smallest element
-      smallest = result[maxRecords - 1].value; // new threshold for entry
-    }
-  });
-  result.sort(sortFunction);
-  return result;
-}
diff --git a/runtime/third_party/binary_size/src/template/index.html b/runtime/third_party/binary_size/src/template/index.html
deleted file mode 100644
index 7e1a1fc..0000000
--- a/runtime/third_party/binary_size/src/template/index.html
+++ /dev/null
@@ -1,525 +0,0 @@
-<!--
-  Copyright 2014 The Chromium Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style license that can be
-  found in the LICENSE file.
--->
-<html>
-<head>
-<title>Binary Size Analysis</title>
-<script src="d3/d3.js" charset="utf-8"></script>
-<script src="D3SymbolTreeMap.js" charset="utf-8"></script>
-<script src="data.js" charset="utf-8"></script>
-<style>
-body {
-    margin: 0px;
-    padding: 5px;
-}
-.swatch {
-    border: 1px solid rgb(100,100,100);
-    -webkit-user-select: none;
-    cursor: default;
-}
-</style>
-<script>
-var treemap;
-var filterChanging = false;
-var savedSettings = {};
-
-function init() {
-    if (window.metadata !== undefined && window.metadata.subtitle) {
-        document.getElementById('subtitle').innerHTML = ': ' + escape(metadata.subtitle);
-    }
-    initFilterOptions();
-    treemap = new D3SymbolTreeMap(
-        savedSettings.width,
-        savedSettings.height,
-        savedSettings.maxLevels);
-    treemap.init();
-}
-
-function getIdealSizes() {
-    var width = window.innerWidth - 20;
-    var height = window.innerHeight - 70;
-    return {'width': width, 'height': height};
-}
-
-function showReport(title, data, headers, dataFunction, styleFunction) {
-    var div =  d3.select('body').append('div')
-        .style('margin', '0')
-        .style('padding', '5px')
-        .style('position', 'absolute')
-        .style('top', '10%')
-        .style('left', '10%')
-        .style('background-color', 'rgba(255,255,255,0.9)')
-        .style('width', '80%')
-        .style('height', '80%')
-        .style('z-index', '2147483647')
-        .style('border', '3px ridge grey')
-        .style('box-shadow', '10px 10px 5px rgba(80,80,80,0.7)')
-        .style('text-align', 'center')
-        .style('border-radius', '10px');
-    var titlebar = div.append('div')
-        .style('margin', '0')
-        .style('padding', '5px')
-        .style('position', 'absolute')
-        .style('top', '0%')
-        .style('left', '0%')
-        .style('width', '100%')
-        .style('height', '10%')
-        .style('font-size', 'x-large');
-    titlebar.text(title);
-    var controls = div.append('div')
-        .style('margin', '0')
-        .style('padding', '5px')
-        .style('position', 'absolute')
-        .style('top', '90%')
-        .style('left', '0%')
-        .style('width', '100%')
-        .style('height', '10%');
-    controls.append('input').attr('type', 'button')
-        .attr('value', 'Dismiss')
-        .on('click', function(){div.remove();});
-
-    var tableDiv = div.append('div')
-        .style('overflow', 'auto')
-        .style('position', 'absolute')
-        .style('top', '10%')
-        .style('left', '0%')
-        .style('width', '100%')
-        .style('height', '80%')
-        .style('border-top', '1px solid rgb(230,230,230)')
-        .style('border-bottom', '1px solid rgb(230,230,230)');
-    var table = tableDiv.append('table')
-        .attr('border', '1')
-        .attr('cellspacing', '0')
-        .attr('cellpadding', '2')
-        .style('margin-left', 'auto')
-        .style('margin-right', 'auto');
-    var header = table.append('tr');
-    for (var i = 0; i < headers.length; i++) {
-        header.append('th').text(headers[i]);
-    }
-
-    for (var i = 0; i < data.length; i++) {
-        var row = table.append('tr');
-        for (j = 0; j < headers.length; j++) {
-            var td = row.append('td');
-            if (styleFunction) {
-                styleFunction.call(this, td, j);
-            }
-            dataFunction.call(this, data[i], j, td);
-        }
-    }
-}
-
-function bigSymbolsReport() {
-    var list = treemap.biggestSymbols(100);
-    var headers = ['Rank', 'Size (Bytes)', 'Type', 'Location'];
-    var styleFunction = function(selection, index) {
-        if (index === 3) {
-            selection.style('font-family', 'monospace');
-        }
-    };
-    var recordIndex = 1;
-    var dataFunction = function(record, index, cell) {
-        if (index === 0) {
-            cell.text(recordIndex++);
-        } else if (index === 1) {
-            cell.text(D3SymbolTreeMap._pretty(record.value));
-        } else if (index === 2) {
-            cell.text(record.t);
-        } else {
-            if (treemap.pathFor(record).indexOf('/out') == 0) {
-                cell.append('span').text(treemap.pathFor(record));
-                cell.append('br');
-                cell.append('span').text('Symbol: ');
-                cell.append('span').text(record.n);
-            } else {
-                var href = 'https://code.google.com/p/chromium/codesearch#chromium/src'
-                    + treemap.pathFor(record)
-                    + '&q='
-                    + record.n;
-                cell.append('a')
-                    .attr('href', href)
-                    .attr('target', '_blank')
-                    .text(treemap.pathFor(record));
-                cell.append('br');
-                cell.append('span').text('Symbol: ');
-                cell.append('span').text(record.n);
-            }
-        }
-    };
-    showReport('100 Largest Symbols', list, headers, dataFunction, styleFunction);
-}
-
-function bigPathsReport() {
-    var list = treemap.biggestPaths(100);
-    var headers = ['Rank', 'Size (Bytes)', 'Location'];
-    var styleFunction = function(selection, index) {
-        if (index === 2) {
-            selection.style('font-family', 'monospace');
-        }
-    };
-    var recordIndex = 1;
-    var dataFunction = function(record, index, cell) {
-        if (index === 0) {
-            cell.text(recordIndex++);
-        } else if (index === 1) {
-            cell.text(D3SymbolTreeMap._pretty(record.value));
-        } else if (index === 2) {
-            if (treemap.pathFor(record).indexOf('/out') == 0) {
-                cell.text(treemap.pathFor(record));
-            } else {
-                var href = 'https://code.google.com/p/chromium/codesearch#chromium/src' + treemap.pathFor(record);
-                cell.append('a')
-                    .attr('href', href)
-                    .attr('target', '_blank')
-                    .text(treemap.pathFor(record));
-            }
-
-        }
-    };
-    showReport('100 Largest Paths', list, headers, dataFunction, styleFunction);
-}
-
-function symbolFilterTextChanged() {
-    if (filterChanging) return true;
-    filterChanging = true;
-    var enabled = document.getElementById('symbol_types_filter').value;
-    for (var x=0; x<=25; x++) {
-        var checkBox = document.getElementById('check_' + x);
-        checkBox.checked = (enabled.indexOf(checkBox.value) != -1);
-    }
-    filterChanging = false;
-}
-
-function updateFilterText() {
-    if (filterChanging) return true;
-    filterChanging = true;
-    var text = '';
-    for (var x=0; x<=25; x++) {
-        var checkBox = document.getElementById('check_' + x);
-        if (checkBox.checked) {
-            text += checkBox.value;
-        }
-    }
-    document.getElementById('symbol_types_filter').value=text;
-    filterChanging = false;
-}
-
-function initFilterOptions() {
-    updateFilterText();
-    for (var x=0; x<=25; x++) {
-        var checkBox = document.getElementById('check_' + x);
-        checkBox.onchange=updateFilterText;
-        var swatch = document.getElementById('swatch_' + x);
-        swatch.style.backgroundColor = D3SymbolTreeMap.getColorForType(checkBox.value).toString();
-    }
-    var gteCheckbox = document.getElementById('check_gte');
-    gteCheckbox.onchange = function() {
-        document.getElementById('symbol_filter_gte').disabled = !gteCheckbox.checked;
-    }
-    var regexCheckbox = document.getElementById('check_regex');
-    regexCheckbox.onchange = function() {
-        document.getElementById('symbol_filter_regex').disabled = !regexCheckbox.checked;
-    }
-    var excludeRegexCheckbox = document.getElementById('check_exclude_regex');
-    excludeRegexCheckbox.onchange = function() {
-        document.getElementById('symbol_filter_exclude_regex').disabled = !excludeRegexCheckbox.checked;
-    }
-    var idealSizes = getIdealSizes();
-    document.getElementById('width').value = idealSizes.width;
-    document.getElementById('height').value = idealSizes.height;
-    saveFilterSettings();
-}
-
-function filterSetAll(enabled) {
-    for (var x=0; x<=25; x++) {
-        var checkBox = document.getElementById('check_' + x);
-        checkBox.checked = enabled;
-    }
-    updateFilterText();
-}
-
-function showOptions() {
-    loadFilterSettings();
-    var container = document.getElementById('options_container');
-    var w = container.offsetWidth;
-    var h = container.offsetHeight;
-    container.style.margin = '-' + (h/2) + 'px 0 0 -' + (w/2) + 'px';
-    container.style.visibility = 'visible';
-}
-
-function hideOptions() {
-    var container = document.getElementById('options_container');
-    container.style.visibility = 'hidden';
-}
-
-function applySettings() {
-    hideOptions();
-    var oldWidth = savedSettings.width;
-    var oldHeight = savedSettings.height;
-    var oldSymbols = savedSettings.symbolTypes;
-    var oldRegex = savedSettings.regex;
-    var oldExcludeRegex = savedSettings.excludeRegex;
-    var oldGte = savedSettings.gte;
-    var oldMaxLevels = savedSettings.maxLevels;
-    saveFilterSettings();
-    var resizeNeeded = oldWidth !== savedSettings.width || oldHeight !== savedSettings.height;
-    var regexChanged = oldRegex !== savedSettings.regex;
-    var excludeRegexChanged = oldExcludeRegex !== savedSettings.excludeRegex;
-    var symbolsChanged = oldSymbols !== savedSettings.symbolTypes;
-    var gteChanged = oldGte !== savedSettings.gte;
-    var filterChanged = regexChanged || excludeRegexChanged || symbolsChanged || gteChanged;
-    var maxLevelsChanged = oldMaxLevels !== savedSettings.maxLevels;
-
-    if (filterChanged) {
-        // Type filters
-        typeFilter = function(datum) {
-            if (datum.depth === 0) return true; // root node
-            if (datum.t === undefined) return true;
-            return savedSettings.symbolTypes !== undefined &&
-                savedSettings.symbolTypes.indexOf(datum.t) !== -1;
-        }
-
-        // Regex filter
-        var regexFilter = undefined;
-        if (savedSettings.regex !== undefined && savedSettings.regex.length > 0) {
-            console.log('filter: regex is "' + savedSettings.regex + '"');
-            var regex = new RegExp(savedSettings.regex);
-            regexFilter = function(datum) {
-                if (datum.depth === 0) return true; // root node
-                var fullName = this.pathFor(datum);
-                if (datum.children === undefined) { // it is a leaf node (symbol)
-                    fullName += ':' + datum.n;
-                }
-                return regex.test(fullName);
-            }
-        }
-
-        // Exclude regex filter
-        var excludeRegexFilter = undefined;
-        if (savedSettings.excludeRegex !== undefined && savedSettings.excludeRegex.length > 0) {
-            console.log('filter: exclude-regex is "' + savedSettings.excludeRegex + '"');
-            var excludeRegex = new RegExp(savedSettings.excludeRegex);
-            excludeRegexFilter = function(datum) {
-                if (datum.depth === 0) return true; // root node
-                var fullName = this.pathFor(datum);
-                if (datum.children === undefined) { // it is a leaf node (symbol)
-                    fullName += ':' + datum.n;
-                }
-                return !excludeRegex.test(fullName);
-            }
-        }
-
-        // Size filter
-        var sizeFilter = undefined;
-        if (savedSettings.gte !== undefined) {
-            console.log('filter: minimum size is ' + savedSettings.gte + ' bytes');
-            sizeFilter = function(datum) {
-                if (datum.children !== undefined) return true; // non-leaf
-                if (datum.value === undefined) console.log('whoops');
-                return datum.value >= savedSettings.gte;
-            }
-        }
-
-        // Make a filter to apply to the tree
-        var filter = function(datum) {
-            if (typeFilter && !typeFilter.call(this, datum)) return false;
-            if (regexFilter && !regexFilter.call(this, datum)) return false;
-            if (excludeRegexFilter && !excludeRegexFilter.call(this, datum)) return false;
-            if (sizeFilter && !sizeFilter.call(this, datum)) return false;
-            return true;
-        };
-        treemap.filter(filter);
-    }
-
-    // Adjust levels if needed.
-    if (maxLevelsChanged) {
-        treemap.setMaxLevels(savedSettings.maxLevels);
-    }
-
-    // Resize map if necessary.
-    if (resizeNeeded) {
-        console.log('desired treemap dimensions have changed, requesting resize');
-        treemap.resize(savedSettings.width, savedSettings.height);
-    }
-}
-
-function cancelSettings() {
-    hideOptions();
-    loadFilterSettings();
-}
-
-function saveFilterSettings() {
-    savedSettings.symbolTypes = document.getElementById('symbol_types_filter').value;
-    if (document.getElementById('check_regex').checked) {
-        savedSettings.regex = document.getElementById('symbol_filter_regex').value;
-    } else {
-        savedSettings.regex = undefined;
-    }
-    if (document.getElementById('check_exclude_regex').checked) {
-        savedSettings.excludeRegex = document.getElementById('symbol_filter_exclude_regex').value;
-    } else {
-        savedSettings.excludeRegex = undefined;
-    }
-    if (document.getElementById('check_gte').checked) {
-        savedSettings.gte = parseInt(document.getElementById('symbol_filter_gte').value);
-    } else {
-        savedSettings.gte = undefined;
-    }
-    savedSettings.width = parseInt(document.getElementById('width').value);
-    savedSettings.height = parseInt(document.getElementById('height').value);
-    savedSettings.maxLevels = parseInt(document.getElementById('max_levels').value);
-}
-
-function loadFilterSettings() {
-    document.getElementById('symbol_types_filter').value = savedSettings.symbolTypes;
-    symbolFilterTextChanged();
-    if (savedSettings.regex !== undefined) {
-        document.getElementById('check_regex').checked = true;
-        document.getElementById('symbol_filter_regex').value = savedSettings.regex;
-    } else {
-        document.getElementById('check_regex').checked = false;
-    }
-    if (savedSettings.excludeRegex !== undefined) {
-        document.getElementById('check_exclude_regex').checked = true;
-        document.getElementById('symbol_filter_exclude_regex').value = savedSettings.excludeRegex;
-    } else {
-        document.getElementById('check_exclude_regex').checked = false;
-    }
-    if (savedSettings.gte !== undefined) {
-        document.getElementById('check_gte').checked = true;
-        document.getElementById('symbol_filter_gte').value = savedSettings.gte;
-    } else {
-        document.getElementById('check_gte').checked = false;
-    }
-    document.getElementById('width').value = savedSettings.width;
-    document.getElementById('height').value = savedSettings.height;
-    document.getElementById('max_levels').value = savedSettings.maxLevels;
-}
-
-function escape(str) {
-    return str.replace(/&/g, '&amp;')
-              .replace(/"/g, '&quot;')
-              .replace(/</g, '&lt;')
-              .replace(/>/g, '&gt;');
-}
-</script>
-</head>
-<body onload='init()'>
-<div style='position: absolute; top: 5px; left: 5px;'>
-  <input type='button' onclick='showOptions()' value='Options &amp; Legend...'>
-  <span style='-webkit-user-select: none; cursor: help;' title='Click to view the symbol legend or to configure filters and options for the treemap'>[?]</span>
-</div>
-<div style='position: absolute; right: 5px; top: 5px; white-space: nowrap;'>
-    Reports:
-    <input type='button' onclick='bigSymbolsReport()' value='Large Symbols' title='Click to view a report of the largest 100 symbols that are with the bounds of the treemap that is currently displayed.'>
-    <input type='button' onclick='bigPathsReport()' value='Large Files' title='Click to view a report of the largest 100 source files that are with the bounds of the treemap that is currently displayed.'>
-</div>
-<div style='text-align: center; margin-bottom: 5px;'>
-    <span style='font-size: x-large; font-weight: bold; font-variant: small-caps'>Binary Size Analysis<span id='subtitle'></span></span>
-    <br><span style='font-size: small; font-style: italic;'>Double-click a box to zoom in, double-click outermost title to zoom out.</span>
-</div>
-<table id='options_container' style='visibility: hidden; border: 3px ridge grey; padding: 0px; top: 50%; left: 50%; position: fixed; z-index: 2147483646; overflow: auto; background-color: rgba(255,255,255,0.9); border-radius: 10px; box-shadow: 10px 10px 5px rgba(80,80,80,0.7);'><tr><td style='vertical-align: top'>
-    <table cellspacing=0 cellborder=0 style='width:100%'>
-        <tr><th colspan=3 style='padding-bottom: .25em; text-decoration: underline;'>Symbol Types To Show</th></tr>
-        <tr>
-            <td style='width: 33%; white-space: nowrap; vertical-align: top;'>
-                    <span class='swatch' id='swatch_0'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_0' value='A'>Global absolute (A)
-                <br><span class='swatch' id='swatch_1'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_1' value='B'>Global uninitialized data (B)
-                <br><span class='swatch' id='swatch_2'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_2' value='b'>Local uninitialized data (b)
-                <br><span class='swatch' id='swatch_3'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_3' value='C'>Global uninitialized common (C)
-                <br><span class='swatch' id='swatch_4'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_4' value='D'>Global initialized data (D)
-                <br><span class='swatch' id='swatch_5'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_5' value='d'>Local initialized data (d)
-                <br><span class='swatch' id='swatch_6'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_6' value='G'>Global small initialized data (G)
-                <br><span class='swatch' id='swatch_7'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_7' value='g'>Local small initialized data (g)
-                <br><span class='swatch' id='swatch_8'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_8' value='i'>Indirect function (i)
-            </td>
-            <td style='width: 33%; white-space: nowrap; vertical-align: top;'>
-                    <span class='swatch' id='swatch_9'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_9' value='N'>Debugging (N)
-                <br><span class='swatch' id='swatch_10'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_10' value='p'>Stack unwind (p)
-                <br><span class='swatch' id='swatch_11'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_11' value='R'>Global read-only data (R)
-                <br><span class='swatch' id='swatch_12'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_12' value='r'>Local read-only data (r)
-                <br><span class='swatch' id='swatch_13'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_13' value='S'>Global small uninitialized data (S)
-                <br><span class='swatch' id='swatch_14'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_14' value='s'>Local small uninitialized data (s)
-                <br><span class='swatch' id='swatch_15'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_15' value='T'>Global code (T)
-                <br><span class='swatch' id='swatch_16'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_16' value='t'>Local code (t)
-                <br><span class='swatch' id='swatch_17'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_17' value='U'>Undefined (U)
-            </td>
-            <td style='width: 33%; white-space: nowrap; vertical-align: top;'>
-                    <span class='swatch' id='swatch_18'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_18' value='u'>Unique (u)
-                <br><span class='swatch' id='swatch_19'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_19' value='V'>Global weak object (V)
-                <br><span class='swatch' id='swatch_20'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_20' value='v'>Local weak object (v)
-                <br><span class='swatch' id='swatch_21'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_21' value='W'>Global weak symbol (W)
-                <br><span class='swatch' id='swatch_22'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_22' value='w'>Local weak symbol (w)
-                <br><span class='swatch' id='swatch_23'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_23' value='@'>Vtable entry (@)
-                <br><span class='swatch' id='swatch_24'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_24' value='-'>STABS debugging (-)
-                <br><span class='swatch' id='swatch_25'>&nbsp;&nbsp;&nbsp;</span><input checked type='checkbox' id='check_25' value='?'>Unrecognized (?)
-            </td>
-        </tr>
-        <tr><td colspan=3 style='text-align: center; white-space: nowrap; padding-top: 1em;'>
-            Select <input type='button' onclick='filterSetAll(true)' value='All'>,
-            <input type='button' onclick='filterSetAll(false)' value='None'>,
-            or type a string: <input id='symbol_types_filter' size=30 value='' onkeyup='symbolFilterTextChanged()' onblur='updateFilterText()'>
-            <span style='-webkit-user-select: none; cursor: help;' title='Enter codes from the list above for the symbols you want to see. The checkboxes will update automatically to match the string that you enter.'>[?]</span>
-        </td></tr>
-   </table>
-</td></tr><tr><td style='vertical-align: top; padding-top: 10px; border-top: 1px solid grey;'>
-    <table cellspacing=0 cellborder=0 style='width: 100%'>
-        <tr><th colspan=2 style='padding-bottom: .25em; text-decoration: underline;'>Advanced Options</th></tr>
-        <tr>
-            <td style='white-space: nowrap; vertical-align: top;'>
-                <input type='checkbox' id='check_regex'>
-                Only include symbols matching this regex:
-            </td>
-            <td style='text-align: right; vertical-align: top;'>
-                <input disabled id='symbol_filter_regex' size=30 value='' style='text-align: right;'>
-                <span style='-webkit-user-select: none; cursor: help;' title='Enter a javascript regex. Only symbols that match this regex will be shown. This filter applies before any exclusion regex specified below. The format of each symbol is [path]:[symbol_name]'>[?]</span>
-            </td>
-        </tr>
-        <tr>
-            <td style='white-space: nowrap; vertical-align: top;'>
-                <input type='checkbox' id='check_exclude_regex'>
-                Exclude all symbols matching this regex:
-            </td>
-            <td style='text-align: right; vertical-align: top;'>
-                <input disabled id='symbol_filter_exclude_regex' size=30 value='' style='text-align: right;'>
-                <span style='-webkit-user-select: none; cursor: help;' title='Enter a javascript regex. Symbols that match this tegex will not be shown. This filter applies after any inclusion filter specified above. The format of each symbol is [path]:[symbol_name]'>[?]</span>
-            </td>
-        </tr>
-        <tr>
-            <td style='white-space: nowrap; vertical-align: top;'>
-                <input type='checkbox' id='check_gte'>
-                Only include symbols that are at least <span style='font-style: italic;'>n</span> bytes:
-            </td>
-            <td style='text-align: right; vertical-align: top;'>
-                <input disabled id='symbol_filter_gte' size=8 value='' style='text-align: right;'>
-                <span style='-webkit-user-select: none; cursor: help;' title='Symbols whose size is less than this value will be hidden.'>[?]</span>
-            </td>
-        </tr>
-        <tr>
-            <td style='white-space: nowrap vertical-align: top;;'>
-                Show at most <span style='font-style: italic;'>n</span> levels of detail at a time:
-            </td>
-            <td style='text-align: right; vertical-align: top;'>
-                <input id='max_levels' size=4 value='2' style='text-align: right;'><span style='-webkit-user-select: none; cursor: help;' title='Increasing this value shows more detail without the need to zoom, but uses more computing power.'>[?]</span>
-            </td>
-        </tr>
-        <tr>
-            <td style='white-space: nowrap vertical-align: top;;'>
-                Set the size of the treemap to <span style='font-style: italic;'>W x H</span> pixels:
-            </td>
-            <td style='text-align: right; vertical-align: top;'>
-                <input id='width' size=4 value='' style='text-align: right;'>
-                &nbsp;x&nbsp;<input id='height' size=4 value='' style='text-align: right;'>
-            </td>
-        </tr>
-    </table>
-</td></tr>
-<tr><td style='padding-top: 10px; text-align: right; border-top: 1px solid grey'>
-    <input type='button' value='Apply' onclick='applySettings()'>
-    <input type='button' value='Cancel' onclick='cancelSettings()'>
-</td></tr></table>
-</body>
-</html>
diff --git a/runtime/third_party/binary_size/src/template/test-data-generator.html b/runtime/third_party/binary_size/src/template/test-data-generator.html
deleted file mode 100644
index 9c6790a..0000000
--- a/runtime/third_party/binary_size/src/template/test-data-generator.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<!--
-  Copyright 2014 The Chromium Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style license that can be
-  found in the LICENSE file.
--->
-<html>
-<head>
-<script>
-function rnd(max) {
-    return Math.round(Math.random()*max);
-}
-
-function gen() {
-  var dirs1=['usr1', 'etc1', 'var1'];
-  var dirs2=['aaa2', 'bbb2', 'ccc2', 'ddd2', 'eee2', 'fff2', 'ggg2', 'hhh2',
-             'frobozz2', 'kazaam2', 'shazam2'];
-  var dirs3=['iii3', 'jjj3', 'kkk3', 'lll3', 'mmm3', 'nnn3', 'ooo3', 'ppp3',
-             'wonderllama3', 'excelsior3', 'src3'];
-  var filenames=['awesome.cc', 'rad.h', 'tubular.cxx', 'cool.cc', 'groovy.h',
-                 'excellent.c', 'gnarly.h', 'green.C', 'articulate.cc'];
-  //All possible types (we only see a subset in practice): 'ABbCDdGgiNpRrSsTtUuVvWw-?';
-  var nm_symbol_types = 'trd';
-  var minSize = 4;
-  var maxSize = 10000;
-  var numGen = 300000;
-  var text = 'var nm_data=[\n';
-  var vtablePercent = 5;
-  for (var x=0; x<numGen; x++) {
-    var path = '/' +
-        dirs1[rnd(dirs1.length - 1)] + '/' +
-        dirs2[rnd(dirs2.length - 1)] + '/' +
-        dirs3[rnd(dirs3.length - 1)] + '/' +
-        filenames[rnd(filenames.length - 1)];
-    var isVtable = Math.floor((Math.random()*100)+1) <= vtablePercent;
-    var size = rnd(maxSize);
-    var symbol_name;
-    var type;
-    if (!isVtable) {
-      symbol_name = 'sym' + x.toString(16);
-      type = nm_symbol_types.charAt(rnd(nm_symbol_types.length - 1));
-    } else {
-      symbol_name = 'vtable for ' + x.toString(16);
-      type = '@'
-    }
-    text = text + "{'n': '" + symbol_name +
-        "', 't': '" + type +
-        "', 's': " + size +
-        ", 'p': '" + path + "'},\n";
-  }
-  text += '];';
-
-  eval(text);
-  var treeified = to_d3_tree(nm_data);
-  generateDownloadLink('tree_data=' + JSON.stringify(treeified));
-}
-
-function generateDownloadLink(content) {
-  var blob = new Blob([content], {type: 'text/plain'});
-  var link = document.createElement('a');
-  link.download = 'generated-content.txt';
-  link.href = window.URL.createObjectURL(blob);
-  link.textContent = 'Download ready, click here.';
-  link.dataset.downloadurl = ['text/plain', link.download, link.href].join(':');
-  link.onclick = function(e) {
-    if ('disabled' in this.dataset) { return false; }
-    link.dataset.disabled = true;
-    setTimeout(function() { window.URL.revokeObjectURL(link.href); }, 1500);
-  };
-  document.getElementById('linkcontainer').innerHTML = '';
-  document.getElementById('linkcontainer').appendChild(link);
-}
-
-/**
- * This function takes in an array of nm records and converts them into a
- * hierarchical data structure suitable for use in a d3-base treemap layout.
- * Leaves are individual symbols. The parents of the leaves are logical
- * groupings by common symbol-type (for BSS, read-only data, code, etc).
- * Above this, each node represents part of a filesystem path relative
- * to the parent node. The root node has the name '/', and represents
- * a root (though not necessarily THE root) of a file system traversal.
- * The root node also has a special property, 'maxDepth', to which is bound
- * the deepest level of nesting that was found during conversion: for the
- * record at path /a/b/c/d.foo, the maxDepth will be 6; the file 'd.foo'
- * is at depth 4, the type-bucket is depth 5 and the symbols are depth 6.
- */
-function to_d3_tree(records) {
-  var result = {'n': '/', 'children': [], 'k': 'p'};
-  var maxDepth = 0;
-  //{'n': 'symbol1', 't': 'b', 's': 1000, 'p': '/usr/local/foo/foo.cc'},
-  for (index in records) {
-    var record = records[index];
-    var parts = record.p.split("/");
-    var node = result;
-    var depth = 0;
-    // Walk the tree and find the file that is named by the "location"
-    // field of the record. We create any intermediate nodes required.
-    // This is directly analogous to "mkdir -p".
-    while(parts.length > 0) {
-      var part = parts.shift();
-      if (part.length == 0) continue;
-      depth++;
-      node = _mk_child(node, part, record.s);
-      node.k = 'p'; // p for path
-    }
-    node.lastPathElement = true;
-
-    // 'node' is now the file node. Find the symbol-type bucket.
-    node = _mk_child(node, record.t, record.s);
-    node.t = record.t;
-    node.k = 'b'; // b for bucket
-    depth++;
-    // 'node' is now the symbol-type bucket. Make the child entry.
-    node = _mk_child(node, record.n, record.s);
-    delete node.children;
-    node.value = record.s;
-    node.t = record.t;
-    node.k = 's'; // s for symbol
-    depth++;
-
-    maxDepth = Math.max(maxDepth, depth);
-  }
-  result.maxDepth = maxDepth;
-  return result;
-}
-
-/**
- * Given a node and a name, return the child within node.children whose
- * name matches the specified name. If necessary, a new child node is
- * created and appended to node.children.
- * If this method creates a new node, the 'name' attribute is set to the
- * specified name and the 'children' attribute is an empty array, and
- * total_size is the specified size. Otherwise, the existing node is
- * returned and its total_size value is incremented by the specified size.
- */
-function _mk_child(node, name, size) {
-  var child = undefined;
-  for (child_index in node.children) {
-    if (node.children[child_index].n == name) {
-      child = node.children[child_index];
-    }
-  }
-  if (child === undefined) {
-    child = {'n': name, 'children': []};
-    node.children.push(child);
-  }
-  return child;
-}
-</script>
-</head>
-<body style='white-space: pre; font-family: monospace;'>
-This script generates sample data for use in D3SymbolTreeMap, and can be used
-for testing.
-<input type=button onclick='gen();' value='Generate data'></input>
-<div id='linkcontainer'></div>
-</body>
-</html>
diff --git a/runtime/tools/binary_size b/runtime/tools/binary_size
new file mode 100755
index 0000000..5621bf5
--- /dev/null
+++ b/runtime/tools/binary_size
@@ -0,0 +1,402 @@
+#!/usr/bin/env dart
+// 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:io";
+
+class Symbol {
+  String? name;
+  String? type;
+  int? shallowSize;
+  int? retainedSize;
+  List<Symbol> children = <Symbol>[];
+
+  Symbol compressTrivialPaths() {
+    for (var i = 0; i < children.length; i++) {
+      children[i] = children[i].compressTrivialPaths();
+    }
+    if ((type == "path") && (children.length == 1)) {
+      return children[0];
+    }
+    return this;
+  }
+
+  int computeRetainedSize() {
+    var s = shallowSize!;
+    for (var child in children) {
+      s += child.computeRetainedSize();
+    }
+    retainedSize = s;
+    return s;
+  }
+
+  writeJson(StringBuffer out) {
+    out.write("{");
+    out.write('"name": "$name",');
+    out.write('"shallowSize": $shallowSize,');
+    out.write('"retainedSize": $retainedSize,');
+    out.write('"type": "$type",');
+    out.write('"children": [');
+    bool first = true;
+    for (var child in children) {
+      if (first) {
+        first = false;
+      } else {
+        out.write(",");
+      }
+      child.writeJson(out);
+    }
+    out.write("]}");
+  }
+}
+
+const filteredPathComponents = <String>[
+  "",
+  ".",
+  "..",
+  "out",
+  "src",
+  "source",
+  "third_party",
+  "DebugX64",
+  "ReleaseX64",
+  "ProductX64",
+];
+
+String prettyPath(String path) {
+  return path
+      .split("/")
+      .where((component) => !filteredPathComponents.contains(component))
+      .join("/");
+}
+
+main(List<String> args) {
+  if (args.isEmpty) {
+    print("Usage: binary_size <binaries>");
+    exit(1);
+  }
+
+  for (var arg in args) {
+    analyze(arg);
+  }
+}
+
+analyze(String binaryPath) {
+  var nmExec = "nm";
+  var nmArgs = ["--demangle", "--line-numbers", "--print-size", binaryPath];
+  var nmResult = Process.runSync(nmExec, nmArgs);
+  if (nmResult.exitCode != 0) {
+    print("+ ${nmExec} ${nmArgs.join(' ')}");
+    print(nmResult.exitCode);
+    print(nmResult.stdout);
+    print(nmResult.stderr);
+    exit(1);
+  }
+
+  var root = new Symbol();
+  root.name = binaryPath;
+  root.type = "path";
+  root.shallowSize = 0;
+  var paths = new Map<String, Symbol>();
+  paths[""] = root;
+  addToPath(Symbol s, String path) {
+    Symbol? p = paths[path];
+    if (p == null) {
+      p = new Symbol();
+      p.name = path;
+      p.type = "path";
+      p.shallowSize = 0;
+      paths[path] = p;
+
+      var i = path.lastIndexOf("/");
+      if (i != -1) {
+        p.name = path.substring(i + 1);
+        addToPath(p, path.substring(0, i));
+      } else {
+        root.children.add(p);
+      }
+    }
+    p.children.add(s);
+  }
+
+  var lines = nmResult.stdout.split("\n");
+  var regex = new RegExp("([0-9a-f]+) ([0-9a-f]+) ([a-zA-z]) (.*)");
+  for (var line in lines) {
+    var match = regex.firstMatch(line);
+    if (match == null) {
+      continue;
+    }
+
+    var address = int.parse(match[1]!, radix: 16);
+    var size = int.parse(match[2]!, radix: 16);
+    var type = match[3];
+    if (type == "b" || type == "B") {
+      // Uninitialized data does not contribute to file size.
+      continue;
+    }
+
+    var nameAndPath = match[4]!.split("\t");
+    var name = nameAndPath[0].trim();
+    var path = nameAndPath.length == 1
+        ? ""
+        : prettyPath(nameAndPath[1].trim().split(":")[0]);
+
+    var s = new Symbol();
+    s.name = name;
+    s.type = type;
+    s.shallowSize = size;
+    addToPath(s, path);
+  }
+
+  root.compressTrivialPaths();
+  root.computeRetainedSize();
+
+  var json = new StringBuffer();
+  root.writeJson(json);
+
+  var html = viewer.replaceAll("__DATA__", json.toString());
+  new File("${binaryPath}.html").writeAsStringSync(html);
+
+  // This written as a URL instead of path because some terminals will
+  // automatically recognize it and make it a link.
+  var url = Directory.current.uri.resolve("${binaryPath}.html");
+  print("Wrote $url");
+}
+
+var viewer = """
+<html>
+<head>
+<style>
+.treemapTile {
+    position: absolute;
+    box-sizing: border-box;
+    border: solid 1px;
+    font-size: 10;
+    text-align: center;
+    overflow: hidden;
+    white-space: nowrap;
+    cursor: default;
+}
+</style>
+</head>
+<body>
+<script>
+var root = __DATA__;
+
+function hash(string) {
+  // Jenkin's one_at_a_time.
+  let h = string.length;
+  for (let i = 0; i < string.length; i++) {
+    h += string.charCodeAt(i);
+    h += h << 10;
+    h ^= h >> 6;
+  }
+  h += h << 3;
+  h ^= h >> 11;
+  h += h << 15;
+  return h;
+}
+
+function color(string) {
+  let hue = hash(string) % 360;
+  return "hsl(" + hue + ",60%,60%)";
+}
+
+function prettySize(size) {
+  if (size < 1024) return size + "B";
+  size /= 1024;
+  if (size < 1024) return size.toFixed(1) + "KiB";
+  size /= 1024;
+  if (size < 1024) return size.toFixed(1) + "MiB";
+  size /= 1024;
+  return size.toFixed(1) + "GiB";
+}
+
+function createTreemapTile(v, width, height, depth) {
+  let div = document.createElement("div");
+  div.className = "treemapTile";
+  div.style["background-color"] = color(v.type);
+  div.ondblclick = function(event) {
+    event.stopPropagation();
+    if (depth == 0) {
+      let parent = v.parent;
+      if (parent === undefined) {
+        // Already at root.
+      } else {
+        showDominatorTree(parent);  // Zoom out.
+      }
+    } else {
+      showDominatorTree(v);  // Zoom in.
+    }
+  };
+
+  let left = 0;
+  let top = 0;
+
+  const kPadding = 5;
+  const kBorder = 1;
+  left += kPadding - kBorder;
+  top += kPadding - kBorder;
+  width -= 2 * kPadding;
+  height -= 2 * kPadding;
+
+  div.title =
+    v.name +
+    " \\ntype: " + v.type +
+    " \\nretained: " + v.retainedSize +
+    " \\nshallow: " + v.shallowSize;
+
+  if (width < 10 || height < 10) {
+    // Too small: don't render label or children.
+    return div;
+  }
+
+  let label = v.name + " [" + prettySize(v.retainedSize) + "]";
+  div.appendChild(document.createTextNode(label));
+  const kLabelHeight = 9;
+  top += kLabelHeight;
+  height -= kLabelHeight;
+
+  if (depth > 2) {
+    // Too deep: don't render children.
+    return div;
+  }
+  if (width < 4 || height < 4) {
+    // Too small: don't render children.
+    return div;
+  }
+
+  let children = new Array();
+  v.children.forEach(function(c) {
+    // Size 0 children seem to confuse the layout algorithm (accumulating
+    // rounding errors?).
+    if (c.retainedSize > 0) {
+      children.push(c);
+    }
+  });
+  children.sort(function (a, b) {
+    return b.retainedSize - a.retainedSize;
+  });
+
+  const scale = width * height / v.retainedSize;
+
+  // Bruls M., Huizing K., van Wijk J.J. (2000) Squarified Treemaps. In: de
+  // Leeuw W.C., van Liere R. (eds) Data Visualization 2000. Eurographics.
+  // Springer, Vienna.
+  for (let rowStart = 0;  // Index of first child in the next row.
+       rowStart < children.length;) {
+    // Prefer wider rectangles, the better to fit text labels.
+    const GOLDEN_RATIO = 1.61803398875;
+    let verticalSplit = (width / height) > GOLDEN_RATIO;
+
+    let space;
+    if (verticalSplit) {
+      space = height;
+    } else {
+      space = width;
+    }
+
+    let rowMin = children[rowStart].retainedSize * scale;
+    let rowMax = rowMin;
+    let rowSum = 0;
+    let lastRatio = 0;
+
+    let rowEnd;  // One after index of last child in the next row.
+    for (rowEnd = rowStart; rowEnd < children.length; rowEnd++) {
+      let size = children[rowEnd].retainedSize * scale;
+      if (size < rowMin) rowMin = size;
+      if (size > rowMax) rowMax = size;
+      rowSum += size;
+
+      let ratio = Math.max((space * space * rowMax) / (rowSum * rowSum),
+                           (rowSum * rowSum) / (space * space * rowMin));
+      if ((lastRatio != 0) && (ratio > lastRatio)) {
+        // Adding the next child makes the aspect ratios worse: remove it and
+        // add the row.
+        rowSum -= size;
+        break;
+      }
+      lastRatio = ratio;
+    }
+
+    let rowLeft = left;
+    let rowTop = top;
+    let rowSpace = rowSum / space;
+
+    for (let i = rowStart; i < rowEnd; i++) {
+      let child = children[i];
+      let size = child.retainedSize * scale;
+
+      let childWidth;
+      let childHeight;
+      if (verticalSplit) {
+        childWidth = rowSpace;
+        childHeight = size / childWidth;
+      } else {
+        childHeight = rowSpace;
+        childWidth = size / childHeight;
+      }
+
+      let childDiv = createTreemapTile(child, childWidth, childHeight, depth + 1);
+      childDiv.style.left = rowLeft + "px";
+      childDiv.style.top = rowTop + "px";
+      // Oversize the final div by kBorder to make the borders overlap.
+      childDiv.style.width = (childWidth + kBorder) + "px";
+      childDiv.style.height = (childHeight + kBorder) + "px";
+      div.appendChild(childDiv);
+
+      if (verticalSplit)
+        rowTop += childHeight;
+      else
+        rowLeft += childWidth;
+    }
+
+    if (verticalSplit) {
+      left += rowSpace;
+      width -= rowSpace;
+    } else {
+      top += rowSpace;
+      height -= rowSpace;
+    }
+
+    rowStart = rowEnd;
+  }
+
+  return div;
+}
+
+function showDominatorTree(v) {
+  // Add the content div to the document first so the browser will calculate
+  // the available width and height.
+  let w = document.body.offsetWidth;
+  let h = document.body.offsetHeight;
+
+  let topTile = createTreemapTile(v, w, h, 0);
+  topTile.style.width = w;
+  topTile.style.height = h;
+  setBody(topTile);
+}
+
+function setBody(div) {
+  let body = document.body;
+  while (body.firstChild) {
+    body.removeChild(body.firstChild);
+  }
+  body.appendChild(div);
+}
+
+function setParents(v) {
+  v.children.forEach(function (child) {
+    child.parent = v;
+    setParents(child);
+  });
+}
+
+setParents(root);
+showDominatorTree(root);
+
+</script>
+</body>
+</html>
+""";
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index 77cb516..822cb23 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -302,10 +302,10 @@
   // R4 = n ~/ _DIGIT_BITS
   __ Asr(R4, R3, Operand(5));
   // R8 = &x_digits[0]
-  __ add(R8, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R8, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   // R6 = &r_digits[1]
   __ add(R6, R2,
-         Operand(target::TypedData::data_offset() - kHeapObjectTag +
+         Operand(target::TypedData::payload_offset() - kHeapObjectTag +
                  kBytesPerBigIntDigit));
   // R2 = &x_digits[x_used]
   __ add(R2, R8, Operand(R0, LSL, 1));
@@ -342,9 +342,9 @@
   // R4 = n ~/ _DIGIT_BITS
   __ Asr(R4, R3, Operand(5));
   // R6 = &r_digits[0]
-  __ add(R6, R2, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R6, R2, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   // R2 = &x_digits[n ~/ _DIGIT_BITS]
-  __ add(R2, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R2, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   __ add(R2, R2, Operand(R4, LSL, 2));
   // R8 = &r_digits[x_used - n ~/ _DIGIT_BITS - 1]
   __ add(R4, R4, Operand(1));
@@ -382,17 +382,17 @@
   // R0 = used, R1 = digits
   __ ldrd(R0, R1, SP, 3 * target::kWordSize);
   // R1 = &digits[0]
-  __ add(R1, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R1, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R2 = a_used, R3 = a_digits
   __ ldrd(R2, R3, SP, 1 * target::kWordSize);
   // R3 = &a_digits[0]
-  __ add(R3, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R3, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R8 = r_digits
   __ ldr(R8, Address(SP, 0 * target::kWordSize));
   // R8 = &r_digits[0]
-  __ add(R8, R8, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R8, R8, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R2 = &digits[a_used >> 1], a_used is Smi.
   __ add(R2, R1, Operand(R2, LSL, 1));
@@ -442,17 +442,17 @@
   // R0 = used, R1 = digits
   __ ldrd(R0, R1, SP, 3 * target::kWordSize);
   // R1 = &digits[0]
-  __ add(R1, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R1, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R2 = a_used, R3 = a_digits
   __ ldrd(R2, R3, SP, 1 * target::kWordSize);
   // R3 = &a_digits[0]
-  __ add(R3, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R3, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R8 = r_digits
   __ ldr(R8, Address(SP, 0 * target::kWordSize));
   // R8 = &r_digits[0]
-  __ add(R8, R8, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R8, R8, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R2 = &digits[a_used >> 1], a_used is Smi.
   __ add(R2, R1, Operand(R2, LSL, 1));
@@ -522,7 +522,7 @@
   // R3 = x, no_op if x == 0
   __ ldrd(R0, R1, SP, 5 * target::kWordSize);  // R0 = xi as Smi, R1 = x_digits.
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ ldr(R3, FieldAddress(R1, target::TypedData::data_offset()));
+  __ ldr(R3, FieldAddress(R1, target::TypedData::payload_offset()));
   __ tst(R3, Operand(R3));
   __ b(&done, EQ);
 
@@ -534,12 +534,12 @@
   // R4 = mip = &m_digits[i >> 1]
   __ ldrd(R0, R1, SP, 3 * target::kWordSize);  // R0 = i as Smi, R1 = m_digits.
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ add(R4, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R4, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R9 = ajp = &a_digits[j >> 1]
   __ ldrd(R0, R1, SP, 1 * target::kWordSize);  // R0 = j as Smi, R1 = a_digits.
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ add(R9, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R9, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R1 = c = 0
   __ mov(R1, Operand(0));
@@ -624,7 +624,7 @@
   // R4 = xip = &x_digits[i >> 1]
   __ ldrd(R2, R3, SP, 2 * target::kWordSize);  // R2 = i as Smi, R3 = x_digits
   __ add(R3, R3, Operand(R2, LSL, 1));
-  __ add(R4, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R4, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R3 = x = *xip++, return if x == 0
   Label x_zero;
@@ -635,7 +635,7 @@
   // R6 = ajp = &a_digits[i]
   __ ldr(R1, Address(SP, 1 * target::kWordSize));  // a_digits
   __ add(R1, R1, Operand(R2, LSL, 2));             // j == 2*i, i is Smi.
-  __ add(R6, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R6, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R8:R0 = t = x*x + *ajp
   __ ldr(R0, Address(R6, 0));
@@ -727,19 +727,19 @@
   __ ldr(R4, Address(SP, 2 * target::kWordSize));  // args
 
   // R3 = rho = args[2]
-  __ ldr(R3, FieldAddress(R4, target::TypedData::data_offset() +
+  __ ldr(R3, FieldAddress(R4, target::TypedData::payload_offset() +
                                   2 * kBytesPerBigIntDigit));
 
   // R2 = digits[i >> 1]
   __ ldrd(R0, R1, SP, 0 * target::kWordSize);  // R0 = i as Smi, R1 = digits
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ ldr(R2, FieldAddress(R1, target::TypedData::data_offset()));
+  __ ldr(R2, FieldAddress(R1, target::TypedData::payload_offset()));
 
   // R1:R0 = t = rho*d
   __ umull(R0, R1, R2, R3);
 
   // args[4] = t mod DIGIT_BASE = low32(t)
-  __ str(R0, FieldAddress(R4, target::TypedData::data_offset() +
+  __ str(R0, FieldAddress(R4, target::TypedData::payload_offset() +
                                   4 * kBytesPerBigIntDigit));
 
   __ mov(R0, Operand(target::ToRawSmi(1)));  // One digit processed.
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index 600e28c..fac75ab 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -226,12 +226,12 @@
   // R0 = n ~/ (2*_DIGIT_BITS)
   __ AsrImmediate(R0, R5, 6);
   // R6 = &x_digits[0]
-  __ add(R6, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R6, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   // R7 = &x_digits[2*R2]
   __ add(R7, R6, Operand(R2, LSL, 3));
   // R8 = &r_digits[2*1]
   __ add(R8, R4,
-         Operand(target::TypedData::data_offset() - kHeapObjectTag +
+         Operand(target::TypedData::payload_offset() - kHeapObjectTag +
                  2 * kBytesPerBigIntDigit));
   // R8 = &r_digits[2*(R2 + n ~/ (2*_DIGIT_BITS) + 1)]
   __ add(R0, R0, Operand(R2));
@@ -276,9 +276,9 @@
   // R0 = n ~/ (2*_DIGIT_BITS)
   __ AsrImmediate(R0, R5, 6);
   // R8 = &r_digits[0]
-  __ add(R8, R4, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R8, R4, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   // R7 = &x_digits[2*(n ~/ (2*_DIGIT_BITS))]
-  __ add(R7, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R7, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
   __ add(R7, R7, Operand(R0, LSL, 3));
   // R6 = &r_digits[2*(R2 - n ~/ (2*_DIGIT_BITS) - 1)]
   __ add(R0, R0, Operand(1));
@@ -323,7 +323,7 @@
   __ add(R2, R2, Operand(2));  // used > 0, Smi. R2 = used + 1, round up.
   __ add(R2, ZR, Operand(R2, ASR, 2));  // R2 = num of digit pairs to process.
   // R3 = &digits[0]
-  __ add(R3, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R3, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R4 = a_used, R5 = a_digits
   __ ldp(R4, R5, Address(SP, 1 * target::kWordSize, Address::PairOffset));
@@ -333,12 +333,12 @@
   __ add(R4, R4, Operand(2));  // a_used > 0, Smi. R4 = a_used + 1, round up.
   __ add(R4, ZR, Operand(R4, ASR, 2));  // R4 = num of digit pairs to process.
   // R5 = &a_digits[0]
-  __ add(R5, R5, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R5, R5, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R6 = r_digits
   __ ldr(R6, Address(SP, 0 * target::kWordSize));
   // R6 = &r_digits[0]
-  __ add(R6, R6, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R6, R6, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R7 = &digits[a_used rounded up to even number].
   __ add(R7, R3, Operand(R4, LSL, 3));
@@ -395,7 +395,7 @@
   __ add(R2, R2, Operand(2));  // used > 0, Smi. R2 = used + 1, round up.
   __ add(R2, ZR, Operand(R2, ASR, 2));  // R2 = num of digit pairs to process.
   // R3 = &digits[0]
-  __ add(R3, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R3, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R4 = a_used, R5 = a_digits
   __ ldp(R4, R5, Address(SP, 1 * target::kWordSize, Address::PairOffset));
@@ -405,12 +405,12 @@
   __ add(R4, R4, Operand(2));  // a_used > 0, Smi. R4 = a_used + 1, round up.
   __ add(R4, ZR, Operand(R4, ASR, 2));  // R4 = num of digit pairs to process.
   // R5 = &a_digits[0]
-  __ add(R5, R5, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R5, R5, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R6 = r_digits
   __ ldr(R6, Address(SP, 0 * target::kWordSize));
   // R6 = &r_digits[0]
-  __ add(R6, R6, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R6, R6, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R7 = &digits[a_used rounded up to even number].
   __ add(R7, R3, Operand(R4, LSL, 3));
@@ -485,7 +485,7 @@
   __ sxtw(R0, R0);
 #endif
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ ldr(R3, FieldAddress(R1, target::TypedData::data_offset()));
+  __ ldr(R3, FieldAddress(R1, target::TypedData::payload_offset()));
   __ tst(R3, Operand(R3));
   __ b(&done, EQ);
 
@@ -505,7 +505,7 @@
   __ sxtw(R0, R0);
 #endif
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ add(R4, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R4, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R5 = ajp = &a_digits[j >> 1]
   // R0 = j as Smi, R1 = a_digits.
@@ -514,7 +514,7 @@
   __ sxtw(R0, R0);
 #endif
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ add(R5, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R5, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R1 = c = 0
   __ mov(R1, ZR);
@@ -605,7 +605,7 @@
   __ sxtw(R2, R2);
 #endif
   __ add(R3, R3, Operand(R2, LSL, 1));
-  __ add(R4, R3, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R4, R3, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R3 = x = *xip++, return if x == 0
   Label x_zero;
@@ -616,7 +616,7 @@
   // R5 = ajp = &a_digits[i]
   __ ldr(R1, Address(SP, 1 * target::kWordSize));  // a_digits
   __ add(R1, R1, Operand(R2, LSL, 2));             // j == 2*i, i is Smi.
-  __ add(R5, R1, Operand(target::TypedData::data_offset() - kHeapObjectTag));
+  __ add(R5, R1, Operand(target::TypedData::payload_offset() - kHeapObjectTag));
 
   // R6:R1 = t = x*x + *ajp
   __ ldr(R0, Address(R5, 0));
@@ -741,7 +741,7 @@
   __ ldr(R4, Address(SP, 2 * target::kWordSize));  // args
 
   // R3 = yt = args[0..1]
-  __ ldr(R3, FieldAddress(R4, target::TypedData::data_offset()));
+  __ ldr(R3, FieldAddress(R4, target::TypedData::payload_offset()));
 
   // R2 = dh = digits[(i >> 1) - 1 .. i >> 1]
   // R0 = i as Smi, R1 = digits
@@ -750,8 +750,8 @@
   __ sxtw(R0, R0);
 #endif
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ ldr(R2, FieldAddress(
-                 R1, target::TypedData::data_offset() - kBytesPerBigIntDigit));
+  __ ldr(R2, FieldAddress(R1, target::TypedData::payload_offset() -
+                                  kBytesPerBigIntDigit));
 
   // R0 = qd = (DIGIT_MASK << 32) | DIGIT_MASK = -1
   __ movn(R0, Immediate(0), 0);
@@ -762,7 +762,7 @@
   __ b(&return_qd, EQ);
 
   // R1 = dl = digits[(i >> 1) - 3 .. (i >> 1) - 2]
-  __ ldr(R1, FieldAddress(R1, target::TypedData::data_offset() -
+  __ ldr(R1, FieldAddress(R1, target::TypedData::payload_offset() -
                                   3 * kBytesPerBigIntDigit));
 
   // R5 = yth = yt >> 32
@@ -867,7 +867,7 @@
 
   __ Bind(&return_qd);
   // args[2..3] = qd
-  __ str(R0, FieldAddress(R4, target::TypedData::data_offset() +
+  __ str(R0, FieldAddress(R4, target::TypedData::payload_offset() +
                                   2 * kBytesPerBigIntDigit));
 
   __ LoadImmediate(R0, target::ToRawSmi(2));  // Two digits processed.
@@ -889,7 +889,7 @@
   __ ldr(R4, Address(SP, 2 * target::kWordSize));  // args
 
   // R3 = rho = args[2..3]
-  __ ldr(R3, FieldAddress(R4, target::TypedData::data_offset() +
+  __ ldr(R3, FieldAddress(R4, target::TypedData::payload_offset() +
                                   2 * kBytesPerBigIntDigit));
 
   // R2 = digits[i >> 1 .. (i >> 1) + 1]
@@ -899,13 +899,13 @@
   __ sxtw(R0, R0);
 #endif
   __ add(R1, R1, Operand(R0, LSL, 1));
-  __ ldr(R2, FieldAddress(R1, target::TypedData::data_offset()));
+  __ ldr(R2, FieldAddress(R1, target::TypedData::payload_offset()));
 
   // R0 = rho*d mod DIGIT_BASE
   __ mul(R0, R2, R3);  // R0 = low64(R2*R3).
 
   // args[4 .. 5] = R0
-  __ str(R0, FieldAddress(R4, target::TypedData::data_offset() +
+  __ str(R0, FieldAddress(R4, target::TypedData::payload_offset() +
                                   4 * kBytesPerBigIntDigit));
 
   __ LoadImmediate(R0, target::ToRawSmi(2));  // Two digits processed.
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index 341c285..b744428 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -317,13 +317,13 @@
   __ movl(ESI, ECX);
   __ sarl(ESI, Immediate(5));  // ESI = n ~/ _DIGIT_BITS.
   __ leal(EBX,
-          FieldAddress(EBX, ESI, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EBX, ESI, TIMES_4, target::TypedData::payload_offset()));
   __ movl(ESI, Address(ESP, 4 * target::kWordSize));  // x_used > 0, Smi.
   __ SmiUntag(ESI);
   __ decl(ESI);
   __ xorl(EAX, EAX);  // EAX = 0.
   __ movl(EDX,
-          FieldAddress(EDI, ESI, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, ESI, TIMES_4, target::TypedData::payload_offset()));
   __ shldl(EAX, EDX, ECX);
   __ movl(Address(EBX, ESI, TIMES_4, kBytesPerBigIntDigit), EAX);
   Label last;
@@ -334,7 +334,7 @@
   __ movl(EAX, EDX);
   __ movl(EDX, FieldAddress(
                    EDI, ESI, TIMES_4,
-                   target::TypedData::data_offset() - kBytesPerBigIntDigit));
+                   target::TypedData::payload_offset() - kBytesPerBigIntDigit));
   __ shldl(EAX, EDX, ECX);
   __ movl(Address(EBX, ESI, TIMES_4, 0), EAX);
   __ decl(ESI);
@@ -368,11 +368,11 @@
   __ decl(ESI);
   // EDI = &x_digits[x_used - 1].
   __ leal(EDI,
-          FieldAddress(EDI, ESI, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, ESI, TIMES_4, target::TypedData::payload_offset()));
   __ subl(ESI, EDX);
   // EBX = &r_digits[x_used - 1 - (n ~/ 32)].
   __ leal(EBX,
-          FieldAddress(EBX, ESI, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EBX, ESI, TIMES_4, target::TypedData::payload_offset()));
   __ negl(ESI);
   __ movl(EDX, Address(EDI, ESI, TIMES_4, 0));
   Label last;
@@ -424,10 +424,10 @@
   __ Bind(&add_loop);
   // Loop a_used times, ECX = a_used, ECX > 0.
   __ movl(EAX,
-          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::payload_offset()));
   __ adcl(EAX,
-          FieldAddress(ESI, EDX, TIMES_4, target::TypedData::data_offset()));
-  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::data_offset()),
+          FieldAddress(ESI, EDX, TIMES_4, target::TypedData::payload_offset()));
+  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::payload_offset()),
           EAX);
   __ incl(EDX);  // Does not affect carry flag.
   __ decl(ECX);  // Does not affect carry flag.
@@ -442,9 +442,9 @@
   __ Bind(&carry_loop);
   // Loop used - a_used times, ECX = used - a_used, ECX > 0.
   __ movl(EAX,
-          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::payload_offset()));
   __ adcl(EAX, Immediate(0));
-  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::data_offset()),
+  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::payload_offset()),
           EAX);
   __ incl(EDX);  // Does not affect carry flag.
   __ decl(ECX);  // Does not affect carry flag.
@@ -453,7 +453,7 @@
   __ Bind(&last_carry);
   __ movl(EAX, Immediate(0));
   __ adcl(EAX, Immediate(0));
-  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::data_offset()),
+  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::payload_offset()),
           EAX);
 
   // Restore THR and return.
@@ -490,10 +490,10 @@
   __ Bind(&sub_loop);
   // Loop a_used times, ECX = a_used, ECX > 0.
   __ movl(EAX,
-          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::payload_offset()));
   __ sbbl(EAX,
-          FieldAddress(ESI, EDX, TIMES_4, target::TypedData::data_offset()));
-  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::data_offset()),
+          FieldAddress(ESI, EDX, TIMES_4, target::TypedData::payload_offset()));
+  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::payload_offset()),
           EAX);
   __ incl(EDX);  // Does not affect carry flag.
   __ decl(ECX);  // Does not affect carry flag.
@@ -508,9 +508,9 @@
   __ Bind(&carry_loop);
   // Loop used - a_used times, ECX = used - a_used, ECX > 0.
   __ movl(EAX,
-          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(EDI, EDX, TIMES_4, target::TypedData::payload_offset()));
   __ sbbl(EAX, Immediate(0));
-  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::data_offset()),
+  __ movl(FieldAddress(EBX, EDX, TIMES_4, target::TypedData::payload_offset()),
           EAX);
   __ incl(EDX);  // Does not affect carry flag.
   __ decl(ECX);  // Does not affect carry flag.
@@ -557,7 +557,7 @@
   __ movl(ECX, Address(ESP, 7 * target::kWordSize));  // x_digits
   __ movl(EAX, Address(ESP, 6 * target::kWordSize));  // xi is Smi
   __ movl(EBX,
-          FieldAddress(ECX, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(ECX, EAX, TIMES_2, target::TypedData::payload_offset()));
   __ testl(EBX, EBX);
   __ j(ZERO, &no_op, Assembler::kNearJump);
 
@@ -574,13 +574,13 @@
   __ movl(EDI, Address(ESP, 6 * target::kWordSize));  // m_digits
   __ movl(EAX, Address(ESP, 5 * target::kWordSize));  // i is Smi
   __ leal(EDI,
-          FieldAddress(EDI, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(EDI, EAX, TIMES_2, target::TypedData::payload_offset()));
 
   // ESI = ajp = &a_digits[j >> 1]
   __ movl(ESI, Address(ESP, 4 * target::kWordSize));  // a_digits
   __ movl(EAX, Address(ESP, 3 * target::kWordSize));  // j is Smi
   __ leal(ESI,
-          FieldAddress(ESI, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(ESI, EAX, TIMES_2, target::TypedData::payload_offset()));
 
   // Save n
   __ pushl(EDX);
@@ -678,7 +678,7 @@
   __ movl(EDI, Address(ESP, 4 * target::kWordSize));  // x_digits
   __ movl(EAX, Address(ESP, 3 * target::kWordSize));  // i is Smi
   __ leal(EDI,
-          FieldAddress(EDI, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(EDI, EAX, TIMES_2, target::TypedData::payload_offset()));
 
   // EBX = x = *xip++, return if x == 0
   Label x_zero;
@@ -694,7 +694,7 @@
   // ESI = ajp = &a_digits[i]
   __ movl(ESI, Address(ESP, 3 * target::kWordSize));  // a_digits
   __ leal(ESI,
-          FieldAddress(ESI, EAX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(ESI, EAX, TIMES_4, target::TypedData::payload_offset()));
 
   // EDX:EAX = t = x*x + *ajp
   __ movl(EAX, EBX);
@@ -803,14 +803,14 @@
   __ movl(EDI, Address(ESP, 3 * target::kWordSize));  // args
 
   // ECX = yt = args[1]
-  __ movl(ECX, FieldAddress(EDI, target::TypedData::data_offset() +
+  __ movl(ECX, FieldAddress(EDI, target::TypedData::payload_offset() +
                                      kBytesPerBigIntDigit));
 
   // EBX = dp = &digits[i >> 1]
   __ movl(EBX, Address(ESP, 2 * target::kWordSize));  // digits
   __ movl(EAX, Address(ESP, 1 * target::kWordSize));  // i is Smi
   __ leal(EBX,
-          FieldAddress(EBX, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(EBX, EAX, TIMES_2, target::TypedData::payload_offset()));
 
   // EDX = dh = dp[0]
   __ movl(EDX, Address(EBX, 0));
@@ -831,8 +831,8 @@
 
   __ Bind(&return_qd);
   // args[2] = qd
-  __ movl(FieldAddress(
-              EDI, target::TypedData::data_offset() + 2 * kBytesPerBigIntDigit),
+  __ movl(FieldAddress(EDI, target::TypedData::payload_offset() +
+                                2 * kBytesPerBigIntDigit),
           EAX);
 
   __ movl(EAX, Immediate(target::ToRawSmi(1)));  // One digit processed.
@@ -854,21 +854,21 @@
   __ movl(EDI, Address(ESP, 3 * target::kWordSize));  // args
 
   // ECX = rho = args[2]
-  __ movl(ECX, FieldAddress(EDI, target::TypedData::data_offset() +
+  __ movl(ECX, FieldAddress(EDI, target::TypedData::payload_offset() +
                                      2 * kBytesPerBigIntDigit));
 
   // EAX = digits[i >> 1]
   __ movl(EBX, Address(ESP, 2 * target::kWordSize));  // digits
   __ movl(EAX, Address(ESP, 1 * target::kWordSize));  // i is Smi
   __ movl(EAX,
-          FieldAddress(EBX, EAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(EBX, EAX, TIMES_2, target::TypedData::payload_offset()));
 
   // EDX:EAX = t = rho*d
   __ mull(ECX);
 
   // args[4] = t mod DIGIT_BASE = low32(t)
-  __ movl(FieldAddress(
-              EDI, target::TypedData::data_offset() + 4 * kBytesPerBigIntDigit),
+  __ movl(FieldAddress(EDI, target::TypedData::payload_offset() +
+                                4 * kBytesPerBigIntDigit),
           EAX);
 
   __ movl(EAX, Immediate(target::ToRawSmi(1)));  // One digit processed.
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index 656bce9..2720da8 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -238,10 +238,10 @@
   __ movq(RSI, RCX);
   __ sarq(RSI, Immediate(6));  // RSI = n ~/ (2*_DIGIT_BITS).
   __ leaq(RBX,
-          FieldAddress(RBX, RSI, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RBX, RSI, TIMES_8, target::TypedData::payload_offset()));
   __ xorq(RAX, RAX);  // RAX = 0.
   __ movq(RDX,
-          FieldAddress(RDI, R8, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, R8, TIMES_8, target::TypedData::payload_offset()));
   __ shldq(RAX, RDX, RCX);
   __ movq(Address(RBX, R8, TIMES_8, 2 * kBytesPerBigIntDigit), RAX);
   Label last;
@@ -251,7 +251,7 @@
   __ Bind(&loop);
   __ movq(RAX, RDX);
   __ movq(RDX, FieldAddress(RDI, R8, TIMES_8,
-                            target::TypedData::data_offset() -
+                            target::TypedData::payload_offset() -
                                 2 * kBytesPerBigIntDigit));
   __ shldq(RAX, RDX, RCX);
   __ movq(Address(RBX, R8, TIMES_8, 0), RAX);
@@ -284,10 +284,10 @@
   __ subq(RSI, Immediate(2));  // x_used > 0, Smi. RSI = x_used - 1, round up.
   __ sarq(RSI, Immediate(2));
   __ leaq(RDI,
-          FieldAddress(RDI, RSI, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, RSI, TIMES_8, target::TypedData::payload_offset()));
   __ subq(RSI, RDX);  // RSI + 1 = number of digit pairs to read.
   __ leaq(RBX,
-          FieldAddress(RBX, RSI, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RBX, RSI, TIMES_8, target::TypedData::payload_offset()));
   __ negq(RSI);
   __ movq(RDX, Address(RDI, RSI, TIMES_8, 0));
   Label last;
@@ -339,10 +339,10 @@
   __ Bind(&add_loop);
   // Loop (a_used+1)/2 times, RCX > 0.
   __ movq(RAX,
-          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::payload_offset()));
   __ adcq(RAX,
-          FieldAddress(RSI, RDX, TIMES_8, target::TypedData::data_offset()));
-  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::data_offset()),
+          FieldAddress(RSI, RDX, TIMES_8, target::TypedData::payload_offset()));
+  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::payload_offset()),
           RAX);
   __ incq(RDX);  // Does not affect carry flag.
   __ decq(RCX);  // Does not affect carry flag.
@@ -356,9 +356,9 @@
   __ Bind(&carry_loop);
   // Loop (used+1)/2 - (a_used+1)/2 times, R8 > 0.
   __ movq(RAX,
-          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::payload_offset()));
   __ adcq(RAX, Immediate(0));
-  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::data_offset()),
+  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::payload_offset()),
           RAX);
   __ incq(RDX);  // Does not affect carry flag.
   __ decq(R8);   // Does not affect carry flag.
@@ -367,7 +367,7 @@
   __ Bind(&last_carry);
   Label done;
   __ j(NOT_CARRY, &done);
-  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::data_offset()),
+  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::payload_offset()),
           Immediate(1));
 
   __ Bind(&done);
@@ -406,10 +406,10 @@
   __ Bind(&sub_loop);
   // Loop (a_used+1)/2 times, RCX > 0.
   __ movq(RAX,
-          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::payload_offset()));
   __ sbbq(RAX,
-          FieldAddress(RSI, RDX, TIMES_8, target::TypedData::data_offset()));
-  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::data_offset()),
+          FieldAddress(RSI, RDX, TIMES_8, target::TypedData::payload_offset()));
+  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::payload_offset()),
           RAX);
   __ incq(RDX);  // Does not affect carry flag.
   __ decq(RCX);  // Does not affect carry flag.
@@ -423,9 +423,9 @@
   __ Bind(&carry_loop);
   // Loop (used+1)/2 - (a_used+1)/2 times, R8 > 0.
   __ movq(RAX,
-          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::data_offset()));
+          FieldAddress(RDI, RDX, TIMES_8, target::TypedData::payload_offset()));
   __ sbbq(RAX, Immediate(0));
-  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::data_offset()),
+  __ movq(FieldAddress(RBX, RDX, TIMES_8, target::TypedData::payload_offset()),
           RAX);
   __ incq(RDX);  // Does not affect carry flag.
   __ decq(R8);   // Does not affect carry flag.
@@ -474,7 +474,7 @@
   __ movsxd(RAX, RAX);
 #endif
   __ movq(RBX,
-          FieldAddress(RCX, RAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(RCX, RAX, TIMES_2, target::TypedData::payload_offset()));
   __ testq(RBX, RBX);
   __ j(ZERO, &done, Assembler::kNearJump);
 
@@ -494,7 +494,7 @@
   __ movsxd(RAX, RAX);
 #endif
   __ leaq(RDI,
-          FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(RDI, RAX, TIMES_2, target::TypedData::payload_offset()));
 
   // RSI = ajp = &a_digits[j >> 1]
   __ movq(RSI, Address(RSP, 3 * target::kWordSize));  // a_digits
@@ -503,7 +503,7 @@
   __ movsxd(RAX, RAX);
 #endif
   __ leaq(RSI,
-          FieldAddress(RSI, RAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(RSI, RAX, TIMES_2, target::TypedData::payload_offset()));
 
   // RCX = c = 0
   __ xorq(RCX, RCX);
@@ -594,7 +594,7 @@
   __ movsxd(RAX, RAX);
 #endif
   __ leaq(RDI,
-          FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(RDI, RAX, TIMES_2, target::TypedData::payload_offset()));
 
   // RBX = x = *xip++, return if x == 0
   Label x_zero;
@@ -606,7 +606,7 @@
   // RSI = ajp = &a_digits[i]
   __ movq(RSI, Address(RSP, 2 * target::kWordSize));  // a_digits
   __ leaq(RSI,
-          FieldAddress(RSI, RAX, TIMES_4, target::TypedData::data_offset()));
+          FieldAddress(RSI, RAX, TIMES_4, target::TypedData::payload_offset()));
 
   // RDX:RAX = t = x*x + *ajp
   __ movq(RAX, RBX);
@@ -706,7 +706,7 @@
   __ movq(RDI, Address(RSP, 3 * target::kWordSize));  // args
 
   // RCX = yt = args[0..1]
-  __ movq(RCX, FieldAddress(RDI, target::TypedData::data_offset()));
+  __ movq(RCX, FieldAddress(RDI, target::TypedData::payload_offset()));
 
   // RBX = dp = &digits[(i >> 1) - 1]
   __ movq(RBX, Address(RSP, 2 * target::kWordSize));  // digits
@@ -716,7 +716,7 @@
 #endif
   __ leaq(RBX, FieldAddress(
                    RBX, RAX, TIMES_2,
-                   target::TypedData::data_offset() - kBytesPerBigIntDigit));
+                   target::TypedData::payload_offset() - kBytesPerBigIntDigit));
 
   // RDX = dh = dp[0]
   __ movq(RDX, Address(RBX, 0));
@@ -737,8 +737,8 @@
 
   __ Bind(&return_qd);
   // args[2..3] = qd
-  __ movq(FieldAddress(
-              RDI, target::TypedData::data_offset() + 2 * kBytesPerBigIntDigit),
+  __ movq(FieldAddress(RDI, target::TypedData::payload_offset() +
+                                2 * kBytesPerBigIntDigit),
           RAX);
 
   __ movq(RAX, Immediate(target::ToRawSmi(2)));  // Two digits processed.
@@ -760,7 +760,7 @@
   __ movq(RDI, Address(RSP, 3 * target::kWordSize));  // args
 
   // RCX = rho = args[2 .. 3]
-  __ movq(RCX, FieldAddress(RDI, target::TypedData::data_offset() +
+  __ movq(RCX, FieldAddress(RDI, target::TypedData::payload_offset() +
                                      2 * kBytesPerBigIntDigit));
 
   // RAX = digits[i >> 1 .. (i >> 1) + 1]
@@ -770,14 +770,14 @@
   __ movsxd(RAX, RAX);
 #endif
   __ movq(RAX,
-          FieldAddress(RBX, RAX, TIMES_2, target::TypedData::data_offset()));
+          FieldAddress(RBX, RAX, TIMES_2, target::TypedData::payload_offset()));
 
   // RDX:RAX = t = rho*d
   __ mulq(RCX);
 
   // args[4 .. 5] = t mod DIGIT_BASE^2 = low64(t)
-  __ movq(FieldAddress(
-              RDI, target::TypedData::data_offset() + 4 * kBytesPerBigIntDigit),
+  __ movq(FieldAddress(RDI, target::TypedData::payload_offset() +
+                                4 * kBytesPerBigIntDigit),
           RAX);
 
   __ movq(RAX, Immediate(target::ToRawSmi(2)));  // Two digits processed.
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 0a52e22..8991d8d 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2753,7 +2753,7 @@
         }
       }
     }
-  } else if (slot().kind() == Slot::Kind::kTypedDataView_data) {
+  } else if (slot().kind() == Slot::Kind::kTypedDataView_typed_data) {
     // This case cover the first explicit argument to typed data view
     // factories, the data (buffer).
     ASSERT(!calls_initializer());
@@ -6529,10 +6529,9 @@
           zone_, pointer_loc.payload_type(), pointer_loc.container_type(),
           temp);
       compiler->EmitNativeMove(dst, pointer_loc, &temp_alloc);
-      __ LoadField(
-          temp,
-          compiler::FieldAddress(
-              temp, compiler::target::TypedDataBase::data_field_offset()));
+      __ LoadField(temp,
+                   compiler::FieldAddress(
+                       temp, compiler::target::PointerBase::data_offset()));
 
       // Copy chuncks.
       const intptr_t sp_offset =
@@ -6594,10 +6593,9 @@
       __ LoadMemoryValue(temp0, FPREG, 0);
       __ LoadMemoryValue(temp0, temp0, typed_data_loc.ToStackSlotOffset());
     }
-    __ LoadField(
-        temp0,
-        compiler::FieldAddress(
-            temp0, compiler::target::TypedDataBase::data_field_offset()));
+    __ LoadField(temp0,
+                 compiler::FieldAddress(
+                     temp0, compiler::target::PointerBase::data_offset()));
 
     if (returnLocation.IsPointerToMemory()) {
       // Copy blocks from the stack location to TypedData.
@@ -6774,10 +6772,10 @@
   if (dst1.IsMultiple()) {
     Register typed_data_reg = locs()->in(0).reg();
     // Load the data pointer out of the TypedData/Pointer.
-    __ LoadField(typed_data_reg,
-                 compiler::FieldAddress(
-                     typed_data_reg,
-                     compiler::target::TypedDataBase::data_field_offset()));
+    __ LoadField(
+        typed_data_reg,
+        compiler::FieldAddress(typed_data_reg,
+                               compiler::target::PointerBase::data_offset()));
 
     const auto& multiple = dst1.AsMultiple();
     int offset_in_bytes = 0;
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index d15b079..2d14822 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -232,10 +232,9 @@
                                               Register array_reg,
                                               Register start_reg) {
   if (IsTypedDataBaseClassId(array_cid)) {
-    __ ldr(
-        array_reg,
-        compiler::FieldAddress(
-            array_reg, compiler::target::TypedDataBase::data_field_offset()));
+    __ ldr(array_reg,
+           compiler::FieldAddress(
+               array_reg, compiler::target::PointerBase::data_offset()));
   } else {
     switch (array_cid) {
       case kOneByteStringCid:
@@ -1780,7 +1779,7 @@
 
   // Address of input bytes.
   __ LoadFieldFromOffset(bytes_reg, bytes_reg,
-                         compiler::target::TypedDataBase::data_field_offset());
+                         compiler::target::PointerBase::data_offset());
 
   // Table.
   __ AddImmediate(
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 979c8ba..33b02c1 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -232,10 +232,9 @@
                                               Register array_reg,
                                               Register start_reg) {
   if (IsTypedDataBaseClassId(array_cid)) {
-    __ ldr(
-        array_reg,
-        compiler::FieldAddress(
-            array_reg, compiler::target::TypedDataBase::data_field_offset()));
+    __ ldr(array_reg,
+           compiler::FieldAddress(
+               array_reg, compiler::target::PointerBase::data_offset()));
   } else {
     switch (array_cid) {
       case kOneByteStringCid:
@@ -1627,7 +1626,7 @@
 
   // Address of input bytes.
   __ LoadFieldFromOffset(bytes_reg, bytes_reg,
-                         compiler::target::TypedDataBase::data_field_offset());
+                         compiler::target::PointerBase::data_offset());
 
   // Table.
   __ AddImmediate(
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 60dd46e..99b20f7 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -131,10 +131,9 @@
                                               Register start_reg) {
   intptr_t offset;
   if (IsTypedDataBaseClassId(array_cid)) {
-    __ movl(
-        array_reg,
-        compiler::FieldAddress(
-            array_reg, compiler::target::TypedDataBase::data_field_offset()));
+    __ movl(array_reg,
+            compiler::FieldAddress(
+                array_reg, compiler::target::PointerBase::data_offset()));
     offset = 0;
   } else {
     switch (array_cid) {
@@ -1328,8 +1327,8 @@
 
   // Address of input bytes.
   __ movl(bytes_reg,
-          compiler::FieldAddress(
-              bytes_reg, compiler::target::TypedDataBase::data_field_offset()));
+          compiler::FieldAddress(bytes_reg,
+                                 compiler::target::PointerBase::data_offset()));
 
   // Pointers to start, end and end-16.
   __ leal(bytes_ptr_reg, compiler::Address(bytes_reg, start_reg, TIMES_1, 0));
diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc
index 244a95e..882a6db 100644
--- a/runtime/vm/compiler/backend/il_riscv.cc
+++ b/runtime/vm/compiler/backend/il_riscv.cc
@@ -274,8 +274,8 @@
                                               Register start_reg) {
   if (IsTypedDataBaseClassId(array_cid)) {
     __ lx(array_reg,
-          compiler::FieldAddress(
-              array_reg, compiler::target::TypedDataBase::data_field_offset()));
+          compiler::FieldAddress(array_reg,
+                                 compiler::target::PointerBase::data_offset()));
   } else {
     switch (array_cid) {
       case kOneByteStringCid:
@@ -1771,7 +1771,7 @@
 
   // Address of input bytes.
   __ LoadFieldFromOffset(bytes_reg, bytes_reg,
-                         compiler::target::TypedDataBase::data_field_offset());
+                         compiler::target::PointerBase::data_offset());
 
   // Table.
   __ AddImmediate(
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index c966f53..de70052 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -196,10 +196,9 @@
                                               Register start_reg) {
   intptr_t offset;
   if (IsTypedDataBaseClassId(array_cid)) {
-    __ movq(
-        array_reg,
-        compiler::FieldAddress(
-            array_reg, compiler::target::TypedDataBase::data_field_offset()));
+    __ movq(array_reg,
+            compiler::FieldAddress(
+                array_reg, compiler::target::PointerBase::data_offset()));
     offset = 0;
   } else {
     switch (array_cid) {
@@ -1534,8 +1533,8 @@
 
   // Address of input bytes.
   __ movq(bytes_reg,
-          compiler::FieldAddress(
-              bytes_reg, compiler::target::TypedDataBase::data_field_offset()));
+          compiler::FieldAddress(bytes_reg,
+                                 compiler::target::PointerBase::data_offset()));
 
   // Pointers to start, end and end-16.
   __ leaq(bytes_ptr_reg, compiler::Address(bytes_reg, start_reg, TIMES_1, 0));
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index dd1e62c..3adbb0c 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -2601,9 +2601,8 @@
     *array = elements;
     array_cid = kArrayCid;
   } else if (IsExternalTypedDataClassId(array_cid)) {
-    LoadUntaggedInstr* elements = new (Z)
-        LoadUntaggedInstr(new (Z) Value(*array),
-                          compiler::target::TypedDataBase::data_field_offset());
+    LoadUntaggedInstr* elements = new (Z) LoadUntaggedInstr(
+        new (Z) Value(*array), compiler::target::PointerBase::data_offset());
     *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     *array = elements;
   }
@@ -2998,9 +2997,8 @@
                                          Instruction** cursor) {
   if (array_cid == kDynamicCid || IsExternalTypedDataClassId(array_cid)) {
     // Internal or External typed data: load untagged.
-    auto elements = new (Z)
-        LoadUntaggedInstr(new (Z) Value(*array),
-                          compiler::target::TypedDataBase::data_field_offset());
+    auto elements = new (Z) LoadUntaggedInstr(
+        new (Z) Value(*array), compiler::target::PointerBase::data_offset());
     *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     *array = elements;
   } else {
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index d2824a2..0d25a71 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2803,8 +2803,7 @@
     case Slot::Kind::kFunctionType_parameter_types:
     case Slot::Kind::kFunctionType_type_parameters:
     case Slot::Kind::kInstance_native_fields_array:
-    case Slot::Kind::kPointerBase_data_field:
-    case Slot::Kind::kTypedDataView_data:
+    case Slot::Kind::kTypedDataView_typed_data:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
     case Slot::Kind::kTypeParameters_names:
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 75afb9a..db64e39 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -215,7 +215,7 @@
     case Slot::Kind::kInstance_native_fields_array:
     case Slot::Kind::kTypeArguments:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
-    case Slot::Kind::kTypedDataView_data:
+    case Slot::Kind::kTypedDataView_typed_data:
     case Slot::Kind::kGrowableObjectArray_data:
     case Slot::Kind::kArray_type_arguments:
     case Slot::Kind::kContext_parent:
@@ -232,7 +232,6 @@
     case Slot::Kind::kFunctionType_named_parameter_names:
     case Slot::Kind::kFunctionType_parameter_types:
     case Slot::Kind::kFunctionType_type_parameters:
-    case Slot::Kind::kPointerBase_data_field:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
     case Slot::Kind::kTypeParameters_names:
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 88c1dd8..09b1186 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -96,7 +96,7 @@
   V(GrowableObjectArray, UntaggedGrowableObjectArray, data, Array, VAR)        \
   V(TypedDataBase, UntaggedTypedDataBase, length, Smi, FINAL)                  \
   V(TypedDataView, UntaggedTypedDataView, offset_in_bytes, Smi, FINAL)         \
-  V(TypedDataView, UntaggedTypedDataView, data, Dynamic, FINAL)                \
+  V(TypedDataView, UntaggedTypedDataView, typed_data, Dynamic, FINAL)          \
   V(String, UntaggedString, length, Smi, FINAL)                                \
   V(LinkedHashBase, UntaggedLinkedHashBase, index, TypedDataUint32Array, VAR)  \
   V(LinkedHashBase, UntaggedLinkedHashBase, data, Array, VAR)                  \
@@ -109,7 +109,6 @@
   V(ArgumentsDescriptor, UntaggedArray, positional_count, Smi, FINAL)          \
   V(ArgumentsDescriptor, UntaggedArray, count, Smi, FINAL)                     \
   V(ArgumentsDescriptor, UntaggedArray, size, Smi, FINAL)                      \
-  V(PointerBase, UntaggedPointerBase, data_field, Dynamic, FINAL)              \
   V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL)                  \
   V(TypeParameters, UntaggedTypeParameters, names, Array, FINAL)               \
   V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL)               \
@@ -154,8 +153,7 @@
     FINAL)                                                                     \
   V(FunctionType, UntaggedFunctionType, packed_type_parameter_counts, Uint16,  \
     FINAL)                                                                     \
-  V(Pointer, UntaggedPointer, data_field, FfiIntPtr, FINAL)                    \
-  V(TypedDataBase, UntaggedTypedDataBase, data_field, IntPtr, VAR)             \
+  V(PointerBase, UntaggedPointerBase, data, IntPtr, VAR)                       \
   V(TypeParameter, UntaggedTypeParameter, flags, Uint8, FINAL)
 
 // For uses that do not need the exact_type (boxed) or representation (unboxed)
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index c6325a5..ae363e2 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1676,9 +1676,8 @@
   const intptr_t element_size = TypedDataBase::ElementSizeFor(cid);
   const intptr_t index_scale = element_size;
 
-  auto data = new (Z)
-      LoadUntaggedInstr(new (Z) Value(array),
-                        compiler::target::TypedDataBase::data_field_offset());
+  auto data = new (Z) LoadUntaggedInstr(
+      new (Z) Value(array), compiler::target::PointerBase::data_offset());
   flow_graph_->InsertBefore(call, data, call->env(), FlowGraph::kValue);
 
   Definition* load = new (Z) LoadIndexedInstr(
@@ -1754,9 +1753,8 @@
       break;
   }
 
-  auto data = new (Z)
-      LoadUntaggedInstr(new (Z) Value(array),
-                        compiler::target::TypedDataBase::data_field_offset());
+  auto data = new (Z) LoadUntaggedInstr(
+      new (Z) Value(array), compiler::target::PointerBase::data_offset());
   flow_graph_->InsertBefore(call, data, call->env(), FlowGraph::kValue);
 
   auto store = new (Z) StoreIndexedInstr(
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 5147fdc..9fd1243 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1115,7 +1115,7 @@
     case MethodRecognizer::kTypedDataViewTypedData:
       ASSERT_EQUAL(function.NumParameters(), 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      body += LoadNativeField(Slot::TypedDataView_data());
+      body += LoadNativeField(Slot::TypedDataView_typed_data());
       break;
     case MethodRecognizer::kClassIDgetID:
       ASSERT_EQUAL(function.NumParameters(), 1);
@@ -1374,7 +1374,7 @@
       body += LoadLocal(arg_pointer);
       body += CheckNullOptimized(String::ZoneHandle(Z, function.name()));
       // No GC from here til LoadIndexed.
-      body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
+      body += LoadUntagged(compiler::target::PointerBase::data_offset());
       body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
       body += LoadIndexed(typed_data_cid, /*index_scale=*/1,
@@ -1415,8 +1415,8 @@
         LocalVariable* pointer = MakeTemporary();
         body += LoadLocal(pointer);
         body += LoadLocal(address);
-        body += UnboxTruncate(kUnboxedFfiIntPtr);
-        body += StoreNativeField(Slot::Pointer_data_field());
+        body += UnboxTruncate(kUnboxedIntPtr);
+        body += StoreNativeField(Slot::PointerBase_data());
         body += DropTempsPreserveTop(1);  // Drop [address] keep [pointer].
       }
       body += DropTempsPreserveTop(1);  // Drop [arg_offset].
@@ -1487,13 +1487,13 @@
       body += LoadLocal(arg_pointer);  // Pointer.
       body += CheckNullOptimized(String::ZoneHandle(Z, function.name()));
       // No GC from here til StoreIndexed.
-      body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
+      body += LoadUntagged(compiler::target::PointerBase::data_offset());
       body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
       body += LoadLocal(arg_value_not_null);
       if (kind == MethodRecognizer::kFfiStorePointer) {
         // This can only be Pointer, so it is always safe to LoadUntagged.
-        body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+        body += LoadUntagged(compiler::target::PointerBase::data_offset());
         body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
       } else {
         // Avoid any unnecessary (and potentially deoptimizing) int
@@ -1524,15 +1524,15 @@
       body += LoadLocal(MakeTemporary());  // Duplicate Pointer.
       body += LoadLocal(parsed_function_->RawParameterVariable(0));  // Address.
       body += CheckNullOptimized(String::ZoneHandle(Z, function.name()));
-      body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body += StoreNativeField(Slot::Pointer_data_field());
+      body += UnboxTruncate(kUnboxedIntPtr);
+      body += StoreNativeField(Slot::PointerBase_data());
     } break;
     case MethodRecognizer::kFfiGetAddress: {
       ASSERT_EQUAL(function.NumParameters(), 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));  // Pointer.
       body += CheckNullOptimized(String::ZoneHandle(Z, function.name()));
       // This can only be Pointer, so it is always safe to LoadUntagged.
-      body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+      body += LoadUntagged(compiler::target::PointerBase::data_offset());
       body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
       body += Box(kUnboxedFfiIntPtr);
     } break;
@@ -1582,9 +1582,9 @@
       // Initialize the result's data pointer field.
       body += LoadLocal(typed_data_object);
       body += LoadLocal(arg_pointer);
-      body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+      body += LoadUntagged(compiler::target::PointerBase::data_offset());
       body += ConvertUntaggedToUnboxed(kUnboxedIntPtr);
-      body += StoreNativeField(Slot::TypedDataBase_data_field(),
+      body += StoreNativeField(Slot::PointerBase_data(),
                                StoreInstanceFieldInstr::Kind::kInitializing,
                                kNoStoreBarrier);
     } break;
@@ -1673,7 +1673,7 @@
 
   body += LoadLocal(view_object);
   body += LoadLocal(typed_data);
-  body += StoreNativeField(token_pos, Slot::TypedDataView_data(),
+  body += StoreNativeField(token_pos, Slot::TypedDataView_typed_data(),
                            StoreInstanceFieldInstr::Kind::kInitializing);
 
   body += LoadLocal(view_object);
@@ -1694,12 +1694,12 @@
   // instructions!
   body += LoadLocal(view_object);
   body += LoadLocal(typed_data);
-  body += LoadUntagged(compiler::target::TypedDataBase::data_field_offset());
+  body += LoadUntagged(compiler::target::PointerBase::data_offset());
   body += ConvertUntaggedToUnboxed(kUnboxedIntPtr);
   body += LoadLocal(offset_in_bytes);
   body += UnboxSmiToIntptr();
   body += AddIntptrIntegers();
-  body += StoreNativeField(Slot::TypedDataBase_data_field());
+  body += StoreNativeField(Slot::PointerBase_data());
 
   return body;
 }
@@ -4082,8 +4082,8 @@
   LocalVariable* pointer = MakeTemporary();
   code += LoadLocal(pointer);
   code += LoadLocal(address);
-  code += UnboxTruncate(kUnboxedFfiIntPtr);
-  code += StoreNativeField(Slot::Pointer_data_field());
+  code += UnboxTruncate(kUnboxedIntPtr);
+  code += StoreNativeField(Slot::PointerBase_data());
   code += StoreLocal(TokenPosition::kNoSource, result);
   code += Drop();  // StoreLocal^
   code += Drop();  // address
@@ -4145,7 +4145,7 @@
   for (intptr_t i = 0; i < num_defs; i++) {
     body += LoadLocal(variable);
     body += LoadTypedDataBaseFromCompound();
-    body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+    body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += IntConstant(offset_in_bytes);
     const Representation representation = representations[i];
     offset_in_bytes += RepresentationUtils::ValueSize(representation);
@@ -4167,7 +4167,7 @@
   for (intptr_t i = 0; i < num_defs; i++) {
     const Representation representation = representations[i];
     body += LoadLocal(uint8_list);
-    body += LoadUntagged(compiler::target::TypedDataBase::data_field_offset());
+    body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += IntConstant(offset_in_bytes);
     body += LoadLocal(definitions->At(i));
     body += StoreIndexedTypedDataUnboxed(representation, /*index_scale=*/1,
@@ -4221,7 +4221,7 @@
     const classid_t typed_data_cidd = typed_data_cid(chunk_sizee);
 
     body += LoadLocal(typed_data_base);
-    body += LoadUntagged(compiler::target::TypedDataBase::data_field_offset());
+    body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += IntConstant(offset_in_bytes);
     body += LoadIndexed(typed_data_cidd, /*index_scale=*/1,
                         /*index_unboxed=*/false);
@@ -4266,7 +4266,7 @@
     LocalVariable* chunk_value = MakeTemporary("chunk_value");
 
     body += LoadLocal(typed_data_base);
-    body += LoadUntagged(compiler::target::TypedDataBase::data_field_offset());
+    body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += IntConstant(offset_in_bytes);
     body += LoadLocal(chunk_value);
     body += StoreIndexedTypedData(typed_data_cidd, /*index_scale=*/1,
@@ -4425,7 +4425,7 @@
   Fragment body;
   if (marshaller.IsPointer(arg_index)) {
     // This can only be Pointer, so it is always safe to LoadUntagged.
-    body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+    body += LoadUntagged(compiler::target::PointerBase::data_offset());
     body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
   } else if (marshaller.IsHandle(arg_index)) {
     body += WrapHandle(api_local_scope);
@@ -4557,7 +4557,7 @@
                     ->context_variables()[0]));
 
   // This can only be Pointer, so it is always safe to LoadUntagged.
-  body += LoadUntagged(compiler::target::Pointer::data_field_offset());
+  body += LoadUntagged(compiler::target::PointerBase::data_offset());
   body += ConvertUntaggedToUnboxed(kUnboxedFfiIntPtr);
 
   if (marshaller.PassTypedData()) {
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 18abb34..5f6ec71 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -236,7 +236,7 @@
 
   if (IsExternalTypedDataClassId(array_cid)) {
     array = builder.AddDefinition(new LoadUntaggedInstr(
-        new Value(array), target::TypedDataBase::data_field_offset()));
+        new Value(array), target::PointerBase::data_offset()));
   }
 
   Definition* result = builder.AddDefinition(new LoadIndexedInstr(
@@ -420,7 +420,7 @@
 
   if (IsExternalTypedDataClassId(array_cid)) {
     array = builder.AddDefinition(new LoadUntaggedInstr(
-        new Value(array), target::TypedDataBase::data_field_offset()));
+        new Value(array), target::PointerBase::data_offset()));
   }
   // No store barrier.
   ASSERT(IsExternalTypedDataClassId(array_cid) ||
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 8f78177d5..51062e6 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -509,7 +509,7 @@
     return 0;
   }
   if (dart::IsTypedDataClassId(cid)) {
-    return TypedData::data_offset();
+    return TypedData::payload_offset();
   }
   switch (cid) {
     case kArrayCid:
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 6a51005..a23de21 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -615,10 +615,10 @@
 
 class PointerBase : public AllStatic {
  public:
-  static word data_field_offset();
+  static word data_offset();
 };
 
-class TypedDataBase : public PointerBase {
+class TypedDataBase : public AllStatic {
  public:
   static word length_offset();
   static word InstanceSize();
@@ -627,7 +627,7 @@
 
 class TypedData : public AllStatic {
  public:
-  static word data_offset();
+  static word payload_offset();
   static word HeaderSize();
   static word InstanceSize();
   static word InstanceSize(word lengthInBytes);
@@ -636,7 +636,6 @@
 
 class ExternalTypedData : public AllStatic {
  public:
-  static word data_offset();
   static word InstanceSize();
   FINAL_CLASS();
 };
@@ -644,7 +643,7 @@
 class TypedDataView : public AllStatic {
  public:
   static word offset_in_bytes_offset();
-  static word data_offset();
+  static word typed_data_offset();
   static word InstanceSize();
   FINAL_CLASS();
 };
@@ -700,7 +699,7 @@
   static word ptr_offset();
 };
 
-class Pointer : public PointerBase {
+class Pointer : public AllStatic {
  public:
   static word type_arguments_offset();
   static word InstanceSize();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index adeab04..5b0ad83 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -226,7 +226,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -469,10 +469,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -792,7 +793,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -1041,10 +1042,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -1363,7 +1365,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -1606,10 +1608,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -1926,7 +1929,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -2175,10 +2178,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -2498,7 +2502,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -2747,10 +2751,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 36;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 20;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -3069,7 +3074,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -3318,10 +3323,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 36;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 20;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -3641,7 +3647,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -3884,10 +3890,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -4209,7 +4216,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -4458,10 +4465,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -4777,7 +4785,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -5020,10 +5028,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -5337,7 +5346,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -5586,10 +5595,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -5902,7 +5912,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -6145,10 +6155,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -6459,7 +6470,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -6708,10 +6719,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -7025,7 +7037,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -7274,10 +7286,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 36;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 20;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -7590,7 +7603,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -7839,10 +7852,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 36;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 20;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -8156,7 +8170,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     104;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 12;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
     SingleTargetCache_entry_point_offset = 8;
@@ -8399,10 +8413,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    12;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -8718,7 +8733,7 @@
 static constexpr dart::compiler::target::word ObjectStore_type_type_offset =
     208;
 static constexpr dart::compiler::target::word OneByteString_data_offset = 16;
-static constexpr dart::compiler::target::word PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word Pointer_type_arguments_offset =
     16;
 static constexpr dart::compiler::target::word
@@ -8967,10 +8982,11 @@
 static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
 static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
-static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
+static constexpr dart::compiler::target::word TypedDataView_typed_data_offset =
+    24;
 static constexpr dart::compiler::target::word
     TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -9318,8 +9334,7 @@
     104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
@@ -9589,11 +9604,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -9950,8 +9965,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -10222,11 +10236,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -10588,8 +10602,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -10860,11 +10873,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -11223,8 +11236,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -11495,11 +11507,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     20;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -11857,8 +11869,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -12129,11 +12140,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     20;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -12492,8 +12503,7 @@
     104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
@@ -12763,11 +12773,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -13126,8 +13136,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -13398,11 +13407,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -13756,8 +13765,7 @@
     104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
@@ -14027,11 +14035,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -14381,8 +14389,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -14653,11 +14660,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -15012,8 +15019,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -15284,11 +15290,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -15640,8 +15646,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -15912,11 +15917,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     20;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -16267,8 +16272,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -16539,11 +16543,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     20;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 28;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 static constexpr dart::compiler::target::word
@@ -16895,8 +16899,7 @@
     104;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     12;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 4;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 4;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 8;
 static constexpr dart::compiler::target::word
@@ -17166,11 +17169,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     8;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    12;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 16;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 12;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 12;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 4;
 static constexpr dart::compiler::target::word
@@ -17522,8 +17525,7 @@
     208;
 static constexpr dart::compiler::target::word AOT_OneByteString_data_offset =
     16;
-static constexpr dart::compiler::target::word
-    AOT_PointerBase_data_field_offset = 8;
+static constexpr dart::compiler::target::word AOT_PointerBase_data_offset = 8;
 static constexpr dart::compiler::target::word
     AOT_Pointer_type_arguments_offset = 16;
 static constexpr dart::compiler::target::word
@@ -17794,11 +17796,11 @@
 static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
 static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
     16;
-static constexpr dart::compiler::target::word AOT_TypedDataView_data_offset =
-    24;
+static constexpr dart::compiler::target::word
+    AOT_TypedDataView_typed_data_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_TypedDataView_offset_in_bytes_offset = 32;
-static constexpr dart::compiler::target::word AOT_TypedData_data_offset = 24;
+static constexpr dart::compiler::target::word AOT_TypedData_payload_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_UnhandledException_exception_offset = 8;
 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 bff550b..0d36d9b 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -177,7 +177,7 @@
   FIELD(ObjectStore, string_type_offset)                                       \
   FIELD(ObjectStore, type_type_offset)                                         \
   FIELD(OneByteString, data_offset)                                            \
-  FIELD(PointerBase, data_field_offset)                                        \
+  FIELD(PointerBase, data_offset)                                              \
   FIELD(Pointer, type_arguments_offset)                                        \
   FIELD(SingleTargetCache, entry_point_offset)                                 \
   FIELD(SingleTargetCache, lower_limit_offset)                                 \
@@ -322,9 +322,9 @@
   FIELD(TypeParameter, flags_offset)                                           \
   FIELD(TypeRef, type_offset)                                                  \
   FIELD(TypedDataBase, length_offset)                                          \
-  FIELD(TypedDataView, data_offset)                                            \
+  FIELD(TypedDataView, typed_data_offset)                                      \
   FIELD(TypedDataView, offset_in_bytes_offset)                                 \
-  FIELD(TypedData, data_offset)                                                \
+  FIELD(TypedData, payload_offset)                                             \
   FIELD(UnhandledException, exception_offset)                                  \
   FIELD(UnhandledException, stacktrace_offset)                                 \
   FIELD(UserTag, tag_offset)                                                   \
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 602dfb2..5174ca8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -3515,7 +3515,7 @@
     __ mov(R9, Operand(R8));
     __ AddImmediate(R3, R0, target::TypedData::HeaderSize() - 1);
     __ StoreInternalPointer(
-        R0, FieldAddress(R0, target::TypedDataBase::data_field_offset()), R3);
+        R0, FieldAddress(R0, target::PointerBase::data_offset()), R3);
     Label init_loop;
     __ Bind(&init_loop);
     __ AddImmediate(R3, 2 * target::kWordSize);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 4d22204..e5fe61f 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -3726,7 +3726,7 @@
     /* data area to be initialized. */
     __ AddImmediate(R2, R0, target::TypedData::HeaderSize() - 1);
     __ StoreInternalPointer(
-        R0, FieldAddress(R0, target::TypedDataBase::data_field_offset()), R2);
+        R0, FieldAddress(R0, target::PointerBase::data_offset()), R2);
     Label init_loop, done;
     __ Bind(&init_loop);
     __ cmp(R2, Operand(R1));
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index e75588c..68b3b4c 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -3059,8 +3059,7 @@
     __ xorl(ECX, ECX); /* Zero. */
     __ leal(EDI, FieldAddress(EAX, target::TypedData::HeaderSize()));
     __ StoreInternalPointer(
-        EAX, FieldAddress(EAX, target::TypedDataBase::data_field_offset()),
-        EDI);
+        EAX, FieldAddress(EAX, target::PointerBase::data_offset()), EDI);
     Label done, init_loop;
     __ Bind(&init_loop);
     __ cmpl(EDI, EBX);
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index ec19d60..c9f604b 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -3619,7 +3619,7 @@
     /* data area to be initialized. */
     __ AddImmediate(T3, A0, target::TypedData::HeaderSize() - 1);
     __ StoreInternalPointer(
-        A0, FieldAddress(A0, target::TypedDataBase::data_field_offset()), T3);
+        A0, FieldAddress(A0, target::PointerBase::data_offset()), T3);
     Label init_loop, done;
     __ Bind(&init_loop);
     __ bgeu(T3, T4, &done);
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index fb870b5..5e3ba12 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -3782,8 +3782,7 @@
     __ xorq(RBX, RBX); /* Zero. */
     __ leaq(RDI, FieldAddress(RAX, target::TypedData::HeaderSize()));
     __ StoreInternalPointer(
-        RAX, FieldAddress(RAX, target::TypedDataBase::data_field_offset()),
-        RDI);
+        RAX, FieldAddress(RAX, target::PointerBase::data_offset()), RDI);
     Label done, init_loop;
     __ Bind(&init_loop);
     __ cmpq(RDI, RCX);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d3cb9c6..0a98a83 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -19685,7 +19685,7 @@
     return 0;
   }
   if (IsTypedDataClassId(cid)) {
-    return TypedData::data_offset();
+    return TypedData::payload_offset();
   }
   switch (cid) {
     case kArrayCid:
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index b830f12..6b5cb1b 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -10686,7 +10686,7 @@
 
 class PointerBase : public Instance {
  public:
-  static intptr_t data_field_offset() {
+  static intptr_t data_offset() {
     return OFFSET_OF(UntaggedPointerBase, data_);
   }
 };
@@ -10830,7 +10830,9 @@
 
 #undef TYPED_GETTER_SETTER
 
-  static intptr_t data_offset() { return UntaggedTypedData::payload_offset(); }
+  static intptr_t payload_offset() {
+    return UntaggedTypedData::payload_offset();
+  }
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(UntaggedTypedData) ==
@@ -10940,10 +10942,6 @@
                                             Dart_HandleFinalizer callback,
                                             intptr_t external_size) const;
 
-  static intptr_t data_offset() {
-    return OFFSET_OF(UntaggedExternalTypedData, data_);
-  }
-
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(UntaggedExternalTypedData));
   }
@@ -11016,7 +11014,7 @@
     return IsExternalTypedDataClassId(cid);
   }
 
-  static intptr_t data_offset() {
+  static intptr_t typed_data_offset() {
     return OFFSET_OF(UntaggedTypedDataView, typed_data_);
   }
 
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 33e2611..0c9b5d0 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -13389,10 +13389,14 @@
     } else if (alignment == ScrollAlignment.BOTTOM) {
       this._scrollIntoView(false);
     } else if (hasScrollIntoViewIfNeeded) {
+      // TODO(srujzs): This method shouldn't be calling out to
+      // `scrollIntoViewIfNeeded`. Remove this and make `scrollIntoView` match
+      // the browser definition. If you intend to use `scrollIntoViewIfNeeded`,
+      // use the `Element.scrollIntoViewIfNeeded` method.
       if (alignment == ScrollAlignment.CENTER) {
-        this._scrollIntoViewIfNeeded(true);
+        this.scrollIntoViewIfNeeded(true);
       } else {
-        this._scrollIntoViewIfNeeded();
+        this.scrollIntoViewIfNeeded();
       }
     } else {
       this._scrollIntoView();
@@ -14896,8 +14900,18 @@
   @JSName('scrollIntoView')
   void _scrollIntoView([Object? arg]) native;
 
-  @JSName('scrollIntoViewIfNeeded')
-  void _scrollIntoViewIfNeeded([bool? centerIfNeeded]) native;
+  /**
+   * Nonstandard version of `scrollIntoView` that scrolls the current element
+   * into the visible area of the browser window if it's not already within the
+   * visible area of the browser window. If the element is already within the
+   * visible area of the browser window, then no scrolling takes place.
+   *
+   * ## Other resources
+   *
+   * * [Element.scrollIntoViewIfNeeded](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded)
+   *   from MDN.
+   */
+  void scrollIntoViewIfNeeded([bool? centerIfNeeded]) native;
 
   void scrollTo([options_OR_x, num? y]) {
     if (options_OR_x == null && y == null) {
diff --git a/tools/VERSION b/tools/VERSION
index afae815..551b152 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 79
+PRERELEASE 80
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/docs.json b/tools/dom/docs.json
index e1a453b..2dfd29c 100644
--- a/tools/dom/docs.json
+++ b/tools/dom/docs.json
@@ -1270,6 +1270,19 @@
           "   * See [EventStreamProvider] for usage information.",
           "   */"
         ],
+        "scrollIntoViewIfNeeded": [
+          "/**",
+          "   * Nonstandard version of `scrollIntoView` that scrolls the current element",
+          "   * into the visible area of the browser window if it's not already within the",
+          "   * visible area of the browser window. If the element is already within the",
+          "   * visible area of the browser window, then no scrolling takes place.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.scrollIntoViewIfNeeded](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded)",
+          "   *   from MDN.",
+          "   */"
+        ],
         "searchEvent": [
           "/**",
           "   * Static factory designed to expose `search` events to event",
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 30fa1af..13f18fb 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -403,7 +403,6 @@
         'Element.getElementsByTagName',
         'Element.insertAdjacentHTML',
         'Element.scrollIntoView',
-        'Element.scrollIntoViewIfNeeded',
         'Element.getAttribute',
         'Element.getAttributeNS',
         'Element.hasAttribute',
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index a0ce567..3ff4bcc 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1007,10 +1007,14 @@
     } else if (alignment == ScrollAlignment.BOTTOM) {
       this._scrollIntoView(false);
     } else if (hasScrollIntoViewIfNeeded) {
+      // TODO(srujzs): This method shouldn't be calling out to
+      // `scrollIntoViewIfNeeded`. Remove this and make `scrollIntoView` match
+      // the browser definition. If you intend to use `scrollIntoViewIfNeeded`,
+      // use the `Element.scrollIntoViewIfNeeded` method.
       if (alignment == ScrollAlignment.CENTER) {
-        this._scrollIntoViewIfNeeded(true);
+        this.scrollIntoViewIfNeeded(true);
       } else {
-        this._scrollIntoViewIfNeeded();
+        this.scrollIntoViewIfNeeded();
       }
     } else {
       this._scrollIntoView();