diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index a1ecf39..768691b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -2009,9 +2009,14 @@
 
     var fileContentMap = <String, String>{};
     var libraryFile = _fsState.getFileForPath(path);
-    for (var file in libraryFile.libraryFiles) {
-      var path = file.path;
-      fileContentMap[path] = file.content;
+    try {
+      for (var file in libraryFile.libraryFiles) {
+        var path = file.path;
+        fileContentMap[path] = file.content;
+      }
+    } catch (_) {
+      // We might get an exception while parsing to access parts.
+      // Ignore, continue with the exception that we are reporting now.
     }
 
     _exceptionController.add(
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 8a9e850..5f2b5b9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -22,7 +22,6 @@
 import 'package:analyzer/src/dart/analysis/referenced_names.dart';
 import 'package:analyzer/src/dart/analysis/unlinked_api_signature.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -403,15 +402,9 @@
   }
 
   /// Return a new parsed unresolved [CompilationUnit].
-  ///
-  /// If an exception happens during parsing, an empty unit is returned.
   CompilationUnitImpl parse([AnalysisErrorListener? errorListener]) {
     errorListener ??= AnalysisErrorListener.NULL_LISTENER;
-    try {
-      return _parse(errorListener);
-    } catch (_) {
-      return _createEmptyCompilationUnit();
-    }
+    return _parse(errorListener);
   }
 
   /// Read the file content and ensure that all of the file properties are
@@ -525,24 +518,6 @@
     return '[id: $id][rid: $refreshId]$uri = $path';
   }
 
-  CompilationUnitImpl _createEmptyCompilationUnit() {
-    var token = Token.eof(0);
-    var unit = astFactory.compilationUnit(
-      beginToken: token,
-      endToken: token,
-      featureSet: _contextFeatureSet,
-    );
-
-    unit.lineInfo = LineInfo(const <int>[0]);
-
-    unit.languageVersion = LibraryLanguageVersion(
-      package: packageLanguageVersion,
-      override: null,
-    );
-
-    return unit;
-  }
-
   /// Return the [FileState] for the given [relativeUri], or `null` if the
   /// URI cannot be parsed, cannot correspond any file, etc.
   Either2<FileState?, ExternalLibrary> _fileForRelativeUri(
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index cfbe557..61af881 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3741,43 +3741,15 @@
 /// A concrete implementation of an [ExportElement].
 class ExportElementImpl extends UriReferencedElementImpl
     implements ExportElement {
-  /// The library that is exported from this library by this export directive.
-  LibraryElement? _exportedLibrary;
+  @override
+  LibraryElement? exportedLibrary;
 
-  /// The combinators that were specified as part of the export directive in the
-  /// order in which they were specified.
-  List<NamespaceCombinator> _combinators = _Sentinel.namespaceCombinator;
+  @override
+  List<NamespaceCombinator> combinators = const [];
 
   /// Initialize a newly created export element at the given [offset].
   ExportElementImpl(int offset) : super(null, offset);
 
-  ExportElementImpl.forLinkedNode(
-      LibraryElementImpl enclosing, ExportDirectiveImpl linkedNode)
-      : super.forLinkedNode(enclosing, null, linkedNode) {
-    linkedNode.element = this;
-  }
-
-  @override
-  List<NamespaceCombinator> get combinators {
-    if (!identical(_combinators, _Sentinel.namespaceCombinator)) {
-      return _combinators;
-    }
-
-    if (linkedNode != null) {
-      var node = linkedNode as ExportDirective;
-      return _combinators = ImportElementImpl._buildCombinators2(
-        enclosingUnit.linkedContext!,
-        node.combinators,
-      );
-    }
-
-    return _combinators;
-  }
-
-  set combinators(List<NamespaceCombinator> combinators) {
-    _combinators = combinators;
-  }
-
   @override
   CompilationUnitElementImpl get enclosingUnit {
     var enclosingLibrary = enclosingElement as LibraryElementImpl;
@@ -3785,40 +3757,12 @@
   }
 
   @override
-  LibraryElement? get exportedLibrary {
-    return _exportedLibrary;
-  }
-
-  set exportedLibrary(LibraryElement? exportedLibrary) {
-    _exportedLibrary = exportedLibrary;
-  }
-
-  @override
   String get identifier => exportedLibrary!.name ?? 'unknown';
 
   @override
   ElementKind get kind => ElementKind.EXPORT;
 
   @override
-  int get nameOffset {
-    if (linkedNode != null) {
-      return linkedContext!.getDirectiveOffset(linkedNode as Directive);
-    }
-
-    return super.nameOffset;
-  }
-
-  @override
-  String? get uri {
-    if (linkedNode != null) {
-      var node = linkedNode as ExportDirective;
-      return node.uri.stringValue;
-    }
-
-    return super.uri;
-  }
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitExportElement(this);
 
   @override
@@ -4599,35 +4543,8 @@
 
 /// A concrete implementation of a [HideElementCombinator].
 class HideElementCombinatorImpl implements HideElementCombinator {
-  final LinkedUnitContext? linkedContext;
-  final HideCombinator? linkedNode;
-
-  /// The names that are not to be made visible in the importing library even if
-  /// they are defined in the imported library.
-  List<String> _hiddenNames = _Sentinel.string;
-
-  HideElementCombinatorImpl()
-      : linkedContext = null,
-        linkedNode = null;
-
-  HideElementCombinatorImpl.forLinkedNode(this.linkedContext, this.linkedNode);
-
   @override
-  List<String> get hiddenNames {
-    if (!identical(_hiddenNames, _Sentinel.string)) {
-      return _hiddenNames;
-    }
-
-    if (linkedNode != null) {
-      return _hiddenNames = linkedNode!.hiddenNames.map((i) => i.name).toList();
-    }
-
-    return _hiddenNames;
-  }
-
-  set hiddenNames(List<String> hiddenNames) {
-    _hiddenNames = hiddenNames;
-  }
+  List<String> hiddenNames = const [];
 
   @override
   String toString() {
@@ -4647,20 +4564,17 @@
 /// A concrete implementation of an [ImportElement].
 class ImportElementImpl extends UriReferencedElementImpl
     implements ImportElement {
-  /// The offset of the prefix of this import in the file that contains the this
-  /// import directive, or `-1` if this import is synthetic.
-  int _prefixOffset = 0;
+  @override
+  LibraryElement? importedLibrary;
 
-  /// The library that is imported into this library by this import directive.
-  LibraryElement? _importedLibrary;
+  @override
+  PrefixElement? prefix;
 
-  /// The combinators that were specified as part of the import directive in the
-  /// order in which they were specified.
-  List<NamespaceCombinator> _combinators = _Sentinel.namespaceCombinator;
+  @override
+  int prefixOffset = -1;
 
-  /// The prefix that was specified as part of the import directive, or `null
-  ///` if there was no prefix specified.
-  PrefixElement? _prefix;
+  @override
+  List<NamespaceCombinator> combinators = const [];
 
   /// The cached value of [namespace].
   Namespace? _namespace;
@@ -4669,33 +4583,6 @@
   /// The offset may be `-1` if the import is synthetic.
   ImportElementImpl(int offset) : super(null, offset);
 
-  ImportElementImpl.forLinkedNode(
-      LibraryElementImpl enclosing, ImportDirectiveImpl linkedNode)
-      : super.forLinkedNode(enclosing, null, linkedNode) {
-    linkedNode.element = this;
-  }
-
-  @override
-  List<NamespaceCombinator> get combinators {
-    if (!identical(_combinators, _Sentinel.namespaceCombinator)) {
-      return _combinators;
-    }
-
-    if (linkedNode != null) {
-      var node = linkedNode as ImportDirective;
-      return _combinators = ImportElementImpl._buildCombinators2(
-        enclosingUnit.linkedContext!,
-        node.combinators,
-      );
-    }
-
-    return _combinators;
-  }
-
-  set combinators(List<NamespaceCombinator> combinators) {
-    _combinators = combinators;
-  }
-
   @override
   CompilationUnitElementImpl get enclosingUnit {
     var enclosingLibrary = enclosingElement as LibraryElementImpl;
@@ -4706,20 +4593,7 @@
   String get identifier => "${importedLibrary?.identifier}@$nameOffset";
 
   @override
-  LibraryElement? get importedLibrary {
-    return _importedLibrary;
-  }
-
-  set importedLibrary(LibraryElement? importedLibrary) {
-    _importedLibrary = importedLibrary;
-  }
-
-  @override
   bool get isDeferred {
-    if (linkedNode != null) {
-      final linkedNode = this.linkedNode as ImportDirective;
-      return linkedNode.deferredKeyword != null;
-    }
     return hasModifier(Modifier.DEFERRED);
   }
 
@@ -4732,69 +4606,12 @@
   ElementKind get kind => ElementKind.IMPORT;
 
   @override
-  int get nameOffset {
-    if (linkedNode != null) {
-      return linkedContext!.getDirectiveOffset(linkedNode as Directive);
-    }
-
-    return super.nameOffset;
-  }
-
-  @override
   Namespace get namespace {
     return _namespace ??=
         NamespaceBuilder().createImportNamespaceForDirective(this);
   }
 
   @override
-  PrefixElement? get prefix {
-    if (_prefix != null) return _prefix;
-
-    if (linkedNode != null) {
-      final linkedNode = this.linkedNode as ImportDirective;
-      var prefix = linkedNode.prefix;
-      if (prefix != null) {
-        var name = prefix.name;
-        var library = enclosingElement as LibraryElementImpl;
-        _prefix = PrefixElementImpl.forLinkedNode(
-          library,
-          library.reference!.getChild('@prefix').getChild(name),
-          prefix,
-        );
-      }
-    }
-
-    return _prefix;
-  }
-
-  set prefix(PrefixElement? prefix) {
-    _prefix = prefix;
-  }
-
-  @override
-  int get prefixOffset {
-    if (linkedNode != null) {
-      var node = linkedNode as ImportDirective;
-      return node.prefix?.offset ?? -1;
-    }
-    return _prefixOffset;
-  }
-
-  set prefixOffset(int prefixOffset) {
-    _prefixOffset = prefixOffset;
-  }
-
-  @override
-  String? get uri {
-    if (linkedNode != null) {
-      var node = linkedNode as ImportDirective;
-      return node.uri.stringValue;
-    }
-
-    return super.uri;
-  }
-
-  @override
   T? accept<T>(ElementVisitor<T> visitor) => visitor.visitImportElement(this);
 
   @override
@@ -4807,19 +4624,6 @@
     super.visitChildren(visitor);
     prefix?.accept(visitor);
   }
-
-  static List<NamespaceCombinator> _buildCombinators2(
-      LinkedUnitContext context, List<Combinator> combinators) {
-    return combinators.map((node) {
-      if (node is HideCombinator) {
-        return HideElementCombinatorImpl.forLinkedNode(context, node);
-      }
-      if (node is ShowCombinator) {
-        return ShowElementCombinatorImpl.forLinkedNode(context, node);
-      }
-      throw UnimplementedError('${node.runtimeType}');
-    }).toList();
-  }
 }
 
 /// A concrete implementation of a [LabelElement].
@@ -6899,66 +6703,14 @@
 
 /// A concrete implementation of a [ShowElementCombinator].
 class ShowElementCombinatorImpl implements ShowElementCombinator {
-  final LinkedUnitContext? linkedContext;
-  final ShowCombinator? linkedNode;
-
-  /// The names that are to be made visible in the importing library if they are
-  /// defined in the imported library.
-  List<String> _shownNames = _Sentinel.string;
-
-  /// The offset of the character immediately following the last character of
-  /// this node.
-  int _end = -1;
-
-  /// The offset of the 'show' keyword of this element.
-  int _offset = 0;
-
-  ShowElementCombinatorImpl()
-      : linkedContext = null,
-        linkedNode = null;
-
-  ShowElementCombinatorImpl.forLinkedNode(this.linkedContext, this.linkedNode);
+  @override
+  List<String> shownNames = const [];
 
   @override
-  int get end {
-    if (linkedNode != null) {
-      return linkedNode!.end;
-    }
-    return _end;
-  }
-
-  set end(int end) {
-    _end = end;
-  }
+  int offset = 0;
 
   @override
-  int get offset {
-    if (linkedNode != null) {
-      return linkedNode!.keyword.offset;
-    }
-    return _offset;
-  }
-
-  set offset(int offset) {
-    _offset = offset;
-  }
-
-  @override
-  List<String> get shownNames {
-    if (!identical(_shownNames, _Sentinel.string)) {
-      return _shownNames;
-    }
-
-    if (linkedNode != null) {
-      return _shownNames = linkedNode!.shownNames.map((i) => i.name).toList();
-    }
-
-    return _shownNames;
-  }
-
-  set shownNames(List<String> shownNames) {
-    _shownNames = shownNames;
-  }
+  int end = -1;
 
   @override
   String toString() {
@@ -7699,12 +7451,9 @@
   static final List<ImportElement> importElement = List.unmodifiable([]);
   static final List<InterfaceType> interfaceType = List.unmodifiable([]);
   static final List<MethodElement> methodElement = List.unmodifiable([]);
-  static final List<NamespaceCombinator> namespaceCombinator =
-      List.unmodifiable([]);
   static final List<ParameterElement> parameterElement = List.unmodifiable([]);
   static final List<PropertyAccessorElement> propertyAccessorElement =
       List.unmodifiable([]);
-  static final List<String> string = List.unmodifiable([]);
   static final List<TopLevelVariableElement> topLevelVariables =
       List.unmodifiable([]);
   static final List<TypeAliasElement> typeAliasElement = List.unmodifiable([]);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index d874003..c6cb319 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart' as ast;
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/ast.dart' as ast;
 import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
@@ -45,42 +46,36 @@
   LibraryBuilder._(this.linker, this.uri, this.reference);
 
   void addExporters() {
-    var unitContext = context.definingUnit;
-    for (var directive in unitContext.unit.directives) {
-      if (directive is ast.ExportDirective) {
-        Uri? uri;
-        try {
-          uri = _selectAbsoluteUri(directive);
-          if (uri == null) continue;
-        } on FormatException {
-          continue;
-        }
+    for (var element in element.exports) {
+      var exportedLibrary = element.exportedLibrary;
+      if (exportedLibrary == null) {
+        continue;
+      }
 
-        var combinators = directive.combinators.map((node) {
-          if (node is ast.ShowCombinator) {
-            var nameList = node.shownNames.map((i) => i.name).toList();
-            return Combinator.show(nameList);
-          } else if (node is ast.HideCombinator) {
-            var nameList = node.hiddenNames.map((i) => i.name).toList();
-            return Combinator.hide(nameList);
-          } else {
-            throw UnimplementedError();
-          }
-        }).toList();
-
-        var exported = linker.builders[uri];
-        var export = Export(this, exported, combinators);
-        if (exported != null) {
-          exported.exporters.add(export);
+      var combinators = element.combinators.map((combinator) {
+        if (combinator is ShowElementCombinator) {
+          return Combinator.show(combinator.shownNames);
+        } else if (combinator is HideElementCombinator) {
+          return Combinator.hide(combinator.hiddenNames);
         } else {
-          var references = linker.elementFactory.exportsOfLibrary('$uri');
-          for (var reference in references) {
-            var name = reference.name;
-            if (reference.isSetter) {
-              export.addToExportScope('$name=', reference);
-            } else {
-              export.addToExportScope(name, reference);
-            }
+          throw UnimplementedError();
+        }
+      }).toList();
+
+      var exportedUri = exportedLibrary.source.uri;
+      var exportedBuilder = linker.builders[exportedUri];
+
+      var export = Export(this, exportedBuilder, combinators);
+      if (exportedBuilder != null) {
+        exportedBuilder.exporters.add(export);
+      } else {
+        var references = linker.elementFactory.exportsOfLibrary('$exportedUri');
+        for (var reference in references) {
+          var name = reference.name;
+          if (reference.isSetter) {
+            export.addToExportScope('$name=', reference);
+          } else {
+            export.addToExportScope(name, reference);
           }
         }
       }
@@ -259,49 +254,13 @@
   }
 
   void buildDirectives() {
-    var exports = <ExportElement>[];
-    var imports = <ImportElement>[];
-    var hasCoreImport = false;
-
-    // Build elements directives in all units.
-    // Store elements only for the defining unit of the library.
-    var isDefiningUnit = true;
-    for (var unitContext in context.units) {
-      for (var node in unitContext.unit.directives) {
-        if (node is ast.ExportDirectiveImpl) {
-          var exportElement = ExportElementImpl.forLinkedNode(element, node);
-          if (isDefiningUnit) {
-            exports.add(exportElement);
-          }
-        } else if (node is ast.ImportDirectiveImpl) {
-          var importElement = ImportElementImpl.forLinkedNode(element, node);
-          if (isDefiningUnit) {
-            imports.add(importElement);
-            if (!hasCoreImport) {
-              if (node.uri.stringValue == 'dart:core') {
-                hasCoreImport = true;
-              }
-            }
-          }
-        } else if (isDefiningUnit && node is ast.PartOfDirective) {
-          element.hasPartOfDirective = true;
-        }
-      }
-      isDefiningUnit = false;
-    }
-
-    element.exports = exports;
-
-    if (!hasCoreImport) {
-      var dartCore = linker.elementFactory.libraryOfUri2('dart:core');
-      imports.add(
-        ImportElementImpl(-1)
-          ..importedLibrary = dartCore
-          ..isSynthetic = true
-          ..uri = 'dart:core',
-      );
-    }
-    element.imports = imports;
+    var definingUnit = context.definingUnit;
+    var elementBuilder = _ElementBuilder(
+      libraryBuilder: this,
+      unitElement: definingUnit.element,
+    );
+    definingUnit.unit.directives.accept(elementBuilder);
+    elementBuilder.setExportsImports();
   }
 
   void buildElement() {
@@ -369,29 +328,6 @@
     }
   }
 
-  void resolveUriDirectives() {
-    var unitContext = context.units[0];
-    for (var directive in unitContext.unit.directives) {
-      if (directive is ast.NamespaceDirective) {
-        try {
-          var uri = _selectAbsoluteUri(directive);
-          if (uri != null) {
-            var library = linker.elementFactory.libraryOfUri('$uri');
-            if (directive is ast.ExportDirective) {
-              var exportElement = directive.element as ExportElementImpl;
-              exportElement.exportedLibrary = library;
-            } else if (directive is ast.ImportDirective) {
-              var importElement = directive.element as ImportElementImpl;
-              importElement.importedLibrary = library;
-            }
-          }
-        } on FormatException {
-          // ignored
-        }
-      }
-    }
-  }
-
   void storeExportScope() {
     exports = exportScope.map.values.toList();
     linker.elementFactory.linkingExports['$uri'] = exports;
@@ -403,32 +339,6 @@
     // }
   }
 
-  Uri? _selectAbsoluteUri(ast.NamespaceDirective directive) {
-    var relativeUriStr = _selectRelativeUri(
-      directive.configurations,
-      directive.uri.stringValue,
-    );
-    if (relativeUriStr == null) {
-      return null;
-    }
-    var relativeUri = Uri.parse(relativeUriStr);
-    return resolveRelativeUri(uri, relativeUri);
-  }
-
-  String? _selectRelativeUri(
-    List<ast.Configuration> configurations,
-    String? defaultUri,
-  ) {
-    for (var configuration in configurations) {
-      var name = configuration.name.components.join('.');
-      var value = configuration.value?.stringValue ?? 'true';
-      if (linker.declaredVariables.get(name) == value) {
-        return configuration.uri.stringValue;
-      }
-    }
-    return defaultUri;
-  }
-
   static void build(Linker linker, LinkInputLibrary inputLibrary) {
     var uriStr = inputLibrary.uriStr;
     var reference = linker.rootReference.getChild(uriStr);
@@ -459,3 +369,171 @@
     builder.context = context;
   }
 }
+
+class _ElementBuilder extends ThrowingAstVisitor<void> {
+  final LibraryBuilder _libraryBuilder;
+  final CompilationUnitElementImpl _unitElement;
+
+  final _exports = <ExportElement>[];
+  final _imports = <ImportElement>[];
+  var _hasCoreImport = false;
+
+  _ElementBuilder({
+    required LibraryBuilder libraryBuilder,
+    required CompilationUnitElementImpl unitElement,
+  })  : _libraryBuilder = libraryBuilder,
+        _unitElement = unitElement;
+
+  LibraryElementImpl get _libraryElement => _libraryBuilder.element;
+
+  Linker get _linker => _libraryBuilder.linker;
+
+  /// This method should be invoked after visiting directive nodes, it
+  /// will set created exports and imports into [_libraryElement].
+  void setExportsImports() {
+    _libraryElement.exports = _exports;
+
+    if (!_hasCoreImport) {
+      var dartCore = _linker.elementFactory.libraryOfUri2('dart:core');
+      _imports.add(
+        ImportElementImpl(-1)
+          ..importedLibrary = dartCore
+          ..isSynthetic = true
+          ..uri = 'dart:core',
+      );
+    }
+    _libraryElement.imports = _imports;
+  }
+
+  @override
+  void visitExportDirective(ast.ExportDirective node) {
+    node as ast.ExportDirectiveImpl;
+
+    var element = ExportElementImpl(node.keyword.offset);
+    element.combinators = _buildCombinators(node.combinators);
+    element.exportedLibrary = _selectLibrary(node);
+    element.metadata = _buildAnnotations(node.metadata);
+    element.uri = node.uri.stringValue;
+
+    node.element = element;
+    _exports.add(element);
+  }
+
+  @override
+  void visitImportDirective(ast.ImportDirective node) {
+    node as ast.ImportDirectiveImpl;
+
+    var element = ImportElementImpl(node.keyword.offset);
+    element.combinators = _buildCombinators(node.combinators);
+    element.importedLibrary = _selectLibrary(node);
+    element.isDeferred = node.deferredKeyword != null;
+    element.metadata = _buildAnnotations(node.metadata);
+    element.uri = node.uri.stringValue;
+
+    var prefixNode = node.prefix;
+    if (prefixNode != null) {
+      element.prefix = PrefixElementImpl(
+        prefixNode.name,
+        prefixNode.offset,
+        reference: _libraryBuilder.reference
+            .getChild('@prefix')
+            .getChild(prefixNode.name),
+      );
+    }
+
+    node.element = element;
+
+    _imports.add(element);
+    if (!_hasCoreImport) {
+      if (node.uri.stringValue == 'dart:core') {
+        _hasCoreImport = true;
+      }
+    }
+  }
+
+  @override
+  void visitLibraryDirective(ast.LibraryDirective node) {}
+
+  @override
+  void visitPartDirective(ast.PartDirective node) {}
+
+  @override
+  void visitPartOfDirective(ast.PartOfDirective node) {
+    _libraryElement.hasPartOfDirective = true;
+  }
+
+  List<ElementAnnotation> _buildAnnotations(
+    List<ast.Annotation> nodeList,
+  ) {
+    var length = nodeList.length;
+    if (length == 0) {
+      return const <ElementAnnotation>[];
+    }
+
+    var annotations = <ElementAnnotation>[];
+    for (int i = 0; i < length; i++) {
+      var ast = nodeList[i];
+      annotations.add(ElementAnnotationImpl(_unitElement)
+        ..annotationAst = ast
+        ..element = ast.element);
+    }
+    return annotations;
+  }
+
+  Uri? _selectAbsoluteUri(ast.NamespaceDirective directive) {
+    var relativeUriStr = _selectRelativeUri(
+      directive.configurations,
+      directive.uri.stringValue,
+    );
+    if (relativeUriStr == null) {
+      return null;
+    }
+    var relativeUri = Uri.parse(relativeUriStr);
+    return resolveRelativeUri(_libraryBuilder.uri, relativeUri);
+  }
+
+  LibraryElement? _selectLibrary(ast.NamespaceDirective node) {
+    try {
+      var uri = _selectAbsoluteUri(node);
+      return _linker.elementFactory.libraryOfUri('$uri');
+    } on FormatException {
+      return null;
+    }
+  }
+
+  String? _selectRelativeUri(
+    List<ast.Configuration> configurations,
+    String? defaultUri,
+  ) {
+    for (var configuration in configurations) {
+      var name = configuration.name.components.join('.');
+      var value = configuration.value?.stringValue ?? 'true';
+      if (_linker.declaredVariables.get(name) == value) {
+        return configuration.uri.stringValue;
+      }
+    }
+    return defaultUri;
+  }
+
+  static List<NamespaceCombinator> _buildCombinators(
+    List<ast.Combinator> combinators,
+  ) {
+    return combinators.map((node) {
+      if (node is ast.HideCombinator) {
+        return HideElementCombinatorImpl()
+          ..hiddenNames = node.hiddenNames.nameList;
+      }
+      if (node is ast.ShowCombinator) {
+        return ShowElementCombinatorImpl()
+          ..shownNames = node.shownNames.nameList;
+      }
+      throw UnimplementedError('${node.runtimeType}');
+    }).toList();
+  }
+}
+
+extension on Iterable<ast.SimpleIdentifier> {
+  List<String> get nameList {
+    return map((e) => e.name).toList();
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index e47b901..51c7ff0 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -107,10 +107,6 @@
     }
 
     for (var library in builders.values) {
-      library.resolveUriDirectives();
-    }
-
-    for (var library in builders.values) {
       library.buildInitialExportScope();
     }
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 62fbaa6..7842aa3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -532,7 +532,7 @@
     null_ = static_cast<InstancePtr>(address + kHeapObjectTag);
     // The call below is using 'null_' to initialize itself.
     InitializeObject(address, kNullCid, Instance::InstanceSize(),
-                     /*compressed*/ false);
+                     Instance::ContainsCompressedPointers());
     null_->untag()->SetCanonical();
   }
 
@@ -544,7 +544,7 @@
     // Allocate a dummy bool object to give true the desired alignment.
     uword address = heap->Allocate(Bool::InstanceSize(), Heap::kOld);
     InitializeObject(address, kBoolCid, Bool::InstanceSize(),
-                     /*compressed*/ false);
+                     Bool::ContainsCompressedPointers());
     static_cast<BoolPtr>(address + kHeapObjectTag)->untag()->value_ = false;
   }
   {
@@ -552,7 +552,7 @@
     uword address = heap->Allocate(Bool::InstanceSize(), Heap::kOld);
     true_ = static_cast<BoolPtr>(address + kHeapObjectTag);
     InitializeObject(address, kBoolCid, Bool::InstanceSize(),
-                     /*compressed*/ false);
+                     Bool::ContainsCompressedPointers());
     true_->untag()->value_ = true;
     true_->untag()->SetCanonical();
   }
@@ -561,7 +561,7 @@
     uword address = heap->Allocate(Bool::InstanceSize(), Heap::kOld);
     false_ = static_cast<BoolPtr>(address + kHeapObjectTag);
     InitializeObject(address, kBoolCid, Bool::InstanceSize(),
-                     /*compressed*/ false);
+                     Bool::ContainsCompressedPointers());
     false_->untag()->value_ = false;
     false_->untag()->SetCanonical();
   }
@@ -710,7 +710,8 @@
     intptr_t size = Class::InstanceSize();
     uword address = heap->Allocate(size, Heap::kOld);
     class_class_ = static_cast<ClassPtr>(address + kHeapObjectTag);
-    InitializeObject(address, Class::kClassId, size, /*compressed*/ true);
+    InitializeObject(address, Class::kClassId, size,
+                     Class::ContainsCompressedPointers());
 
     Class fake;
     // Initialization from Class::New<Class>.
@@ -770,19 +771,23 @@
 
   // Allocate and initialize the sentinel values.
   {
-    *sentinel_ ^= Object::Allocate(kNeverCid, Instance::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ false);
+    *sentinel_ ^=
+        Object::Allocate(kNeverCid, Instance::InstanceSize(), Heap::kOld,
+                         Instance::ContainsCompressedPointers());
 
-    *transition_sentinel_ ^= Object::Allocate(
-        kNeverCid, Instance::InstanceSize(), Heap::kOld, /*compressed*/ false);
+    *transition_sentinel_ ^=
+        Object::Allocate(kNeverCid, Instance::InstanceSize(), Heap::kOld,
+                         Instance::ContainsCompressedPointers());
   }
 
   // Allocate and initialize optimizing compiler constants.
   {
-    *unknown_constant_ ^= Object::Allocate(kNeverCid, Instance::InstanceSize(),
-                                           Heap::kOld, /*compressed*/ false);
-    *non_constant_ ^= Object::Allocate(kNeverCid, Instance::InstanceSize(),
-                                       Heap::kOld, /*compressed*/ false);
+    *unknown_constant_ ^=
+        Object::Allocate(kNeverCid, Instance::InstanceSize(), Heap::kOld,
+                         Instance::ContainsCompressedPointers());
+    *non_constant_ ^=
+        Object::Allocate(kNeverCid, Instance::InstanceSize(), Heap::kOld,
+                         Instance::ContainsCompressedPointers());
   }
 
   // Allocate the remaining VM internal classes.
@@ -945,7 +950,7 @@
   {
     uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(0),
-                     /*compressed*/ false);
+                     Array::ContainsCompressedPointers());
     Array::initializeHandle(empty_array_,
                             static_cast<ArrayPtr>(address + kHeapObjectTag));
     empty_array_->untag()->set_length(Smi::New(0));
@@ -957,7 +962,7 @@
   {
     uword address = heap->Allocate(Array::InstanceSize(1), Heap::kOld);
     InitializeObject(address, kImmutableArrayCid, Array::InstanceSize(1),
-                     /*compressed*/ false);
+                     Array::ContainsCompressedPointers());
     Array::initializeHandle(zero_array_,
                             static_cast<ArrayPtr>(address + kHeapObjectTag));
     zero_array_->untag()->set_length(Smi::New(1));
@@ -970,7 +975,7 @@
   {
     uword address = heap->Allocate(ContextScope::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kContextScopeCid, ContextScope::InstanceSize(0),
-                     /*compressed*/ true);
+                     ContextScope::ContainsCompressedPointers());
     ContextScope::initializeHandle(
         empty_context_scope_,
         static_cast<ContextScopePtr>(address + kHeapObjectTag));
@@ -985,7 +990,7 @@
   {
     uword address = heap->Allocate(ObjectPool::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kObjectPoolCid, ObjectPool::InstanceSize(0),
-                     /*compressed*/ false);
+                     ObjectPool::ContainsCompressedPointers());
     ObjectPool::initializeHandle(
         empty_object_pool_,
         static_cast<ObjectPoolPtr>(address + kHeapObjectTag));
@@ -999,7 +1004,7 @@
     const intptr_t instance_size = CompressedStackMaps::InstanceSize(0);
     uword address = heap->Allocate(instance_size, Heap::kOld);
     InitializeObject(address, kCompressedStackMapsCid, instance_size,
-                     /*compressed*/ true);
+                     CompressedStackMaps::ContainsCompressedPointers());
     CompressedStackMaps::initializeHandle(
         empty_compressed_stackmaps_,
         static_cast<CompressedStackMapsPtr>(address + kHeapObjectTag));
@@ -1012,7 +1017,7 @@
   {
     uword address = heap->Allocate(PcDescriptors::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kPcDescriptorsCid, PcDescriptors::InstanceSize(0),
-                     /*compressed*/ true);
+                     PcDescriptors::ContainsCompressedPointers());
     PcDescriptors::initializeHandle(
         empty_descriptors_,
         static_cast<PcDescriptorsPtr>(address + kHeapObjectTag));
@@ -1026,7 +1031,8 @@
     uword address =
         heap->Allocate(LocalVarDescriptors::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kLocalVarDescriptorsCid,
-                     LocalVarDescriptors::InstanceSize(0), /*compressed*/ true);
+                     LocalVarDescriptors::InstanceSize(0),
+                     LocalVarDescriptors::ContainsCompressedPointers());
     LocalVarDescriptors::initializeHandle(
         empty_var_descriptors_,
         static_cast<LocalVarDescriptorsPtr>(address + kHeapObjectTag));
@@ -1042,7 +1048,8 @@
     uword address =
         heap->Allocate(ExceptionHandlers::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kExceptionHandlersCid,
-                     ExceptionHandlers::InstanceSize(0), /*compressed*/ true);
+                     ExceptionHandlers::InstanceSize(0),
+                     ExceptionHandlers::ContainsCompressedPointers());
     ExceptionHandlers::initializeHandle(
         empty_exception_handlers_,
         static_cast<ExceptionHandlersPtr>(address + kHeapObjectTag));
@@ -1055,7 +1062,7 @@
   {
     uword address = heap->Allocate(TypeArguments::InstanceSize(0), Heap::kOld);
     InitializeObject(address, kTypeArgumentsCid, TypeArguments::InstanceSize(0),
-                     /*compressed*/ true);
+                     TypeArguments::ContainsCompressedPointers());
     TypeArguments::initializeHandle(
         empty_type_arguments_,
         static_cast<TypeArgumentsPtr>(address + kHeapObjectTag));
@@ -2736,7 +2743,7 @@
   const Class& cls = Class::Handle(orig.clazz());
   intptr_t size = orig.ptr()->untag()->HeapSize();
   ObjectPtr raw_clone =
-      Object::Allocate(cls.id(), size, space, /*compressed*/ false);
+      Object::Allocate(cls.id(), size, space, cls.HasCompressedPointers());
   NoSafepointScope no_safepoint;
   // Copy the body of the original into the clone.
   uword orig_addr = UntaggedObject::ToAddr(orig.ptr());
@@ -2756,6 +2763,42 @@
   return raw_clone;
 }
 
+bool Class::HasCompressedPointers() const {
+  const intptr_t cid = id();
+  switch (cid) {
+    // Only a couple of FFI cids correspond to actual Dart classes. so they're
+    // explicitly listed here.
+    case kFfiPointerCid:
+      return Pointer::ContainsCompressedPointers();
+    case kFfiDynamicLibraryCid:
+      return DynamicLibrary::ContainsCompressedPointers();
+    case kByteBufferCid:
+      return ByteBuffer::ContainsCompressedPointers();
+#define HANDLE_CASE(clazz)                                                     \
+  case k##clazz##Cid:                                                          \
+    return dart::clazz::ContainsCompressedPointers();
+      CLASS_LIST(HANDLE_CASE)
+#undef HANDLE_CASE
+#define HANDLE_CASE(clazz)                                                     \
+  case kTypedData##clazz##Cid:                                                 \
+    return dart::TypedData::ContainsCompressedPointers();                      \
+  case kTypedData##clazz##ViewCid:                                             \
+    return dart::TypedDataView::ContainsCompressedPointers();                  \
+  case kExternalTypedData##clazz##Cid:                                         \
+    return dart::ExternalTypedData::ContainsCompressedPointers();
+      CLASS_LIST_TYPED_DATA(HANDLE_CASE)
+#undef HANDLE_CASE
+    default:
+      if (cid >= kNumPredefinedCids) {
+        return dart::Instance::ContainsCompressedPointers();
+      }
+  }
+  FATAL("Unsupported class for compressed pointers translation: %s (id=%" Pd
+        ", kNumPredefinedCids=%" Pd ")\n",
+        ToCString(), cid, kNumPredefinedCids);
+  return false;
+}
+
 StringPtr Class::Name() const {
   return untag()->name();
 }
@@ -2834,8 +2877,9 @@
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Class::kClassId, Class::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld,
+                         Class::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -4534,8 +4578,9 @@
   ASSERT(Object::class_class() != Class::null());
   Class& result = Class::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Class::kClassId, Class::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(Class::kClassId, Class::InstanceSize(), Heap::kOld,
+                         Class::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -6176,9 +6221,9 @@
 
 TypeParametersPtr TypeParameters::New(Heap::Space space) {
   ASSERT(Object::type_parameters_class() != Class::null());
-  ObjectPtr ptr = Object::Allocate(TypeParameters::kClassId,
-                                   TypeParameters::InstanceSize(), space,
-                                   /*compressed*/ false);
+  ObjectPtr ptr =
+      Object::Allocate(TypeParameters::kClassId, TypeParameters::InstanceSize(),
+                       space, TypeParameters::ContainsCompressedPointers());
   return static_cast<TypeParametersPtr>(ptr);
 }
 
@@ -6873,9 +6918,9 @@
   }
   TypeArguments& result = TypeArguments::Handle();
   {
-    ObjectPtr raw = Object::Allocate(TypeArguments::kClassId,
-                                     TypeArguments::InstanceSize(len), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        TypeArguments::kClassId, TypeArguments::InstanceSize(len), space,
+        TypeArguments::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     // Length must be set before we start storing into the array.
@@ -7021,7 +7066,7 @@
   ASSERT(Object::patch_class_class() != Class::null());
   ObjectPtr raw =
       Object::Allocate(PatchClass::kClassId, PatchClass::InstanceSize(),
-                       Heap::kOld, /*compressed*/ true);
+                       Heap::kOld, PatchClass::ContainsCompressedPointers());
   return static_cast<PatchClassPtr>(raw);
 }
 
@@ -8890,8 +8935,9 @@
 
 FunctionPtr Function::New(Heap::Space space) {
   ASSERT(Object::function_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(Function::kClassId, Function::InstanceSize(),
-                                   space, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(Function::kClassId, Function::InstanceSize(), space,
+                       Function::ContainsCompressedPointers());
   return static_cast<FunctionPtr>(raw);
 }
 
@@ -10079,7 +10125,7 @@
   ASSERT(Object::closure_data_class() != Class::null());
   ObjectPtr raw =
       Object::Allocate(ClosureData::kClassId, ClosureData::InstanceSize(),
-                       Heap::kOld, /*compressed*/ true);
+                       Heap::kOld, ClosureData::ContainsCompressedPointers());
   return static_cast<ClosureDataPtr>(raw);
 }
 
@@ -10156,7 +10202,7 @@
 FunctionTypePtr FunctionType::New(Heap::Space space) {
   ObjectPtr raw =
       Object::Allocate(FunctionType::kClassId, FunctionType::InstanceSize(),
-                       space, /*compressed*/ true);
+                       space, FunctionType::ContainsCompressedPointers());
   return static_cast<FunctionTypePtr>(raw);
 }
 
@@ -10252,9 +10298,9 @@
 
 FfiTrampolineDataPtr FfiTrampolineData::New() {
   ASSERT(Object::ffi_trampoline_data_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(FfiTrampolineData::kClassId,
-                                   FfiTrampolineData::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw = Object::Allocate(
+      FfiTrampolineData::kClassId, FfiTrampolineData::InstanceSize(),
+      Heap::kOld, FfiTrampolineData::ContainsCompressedPointers());
   FfiTrampolineDataPtr data = static_cast<FfiTrampolineDataPtr>(raw);
   data->untag()->callback_id_ = 0;
   return data;
@@ -10515,8 +10561,9 @@
 
 FieldPtr Field::New() {
   ASSERT(Object::field_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(Field::kClassId, Field::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(Field::kClassId, Field::InstanceSize(), Heap::kOld,
+                       Field::ContainsCompressedPointers());
   return static_cast<FieldPtr>(raw);
 }
 
@@ -11943,8 +11990,9 @@
 
 ScriptPtr Script::New() {
   ASSERT(Object::script_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(Script::kClassId, Script::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(Script::kClassId, Script::InstanceSize(), Heap::kOld,
+                       Script::ContainsCompressedPointers());
   return static_cast<ScriptPtr>(raw);
 }
 
@@ -13003,8 +13051,9 @@
 
 LibraryPtr Library::New() {
   ASSERT(Object::library_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(Library::kClassId, Library::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(Library::kClassId, Library::InstanceSize(), Heap::kOld,
+                       Library ::ContainsCompressedPointers());
   return static_cast<LibraryPtr>(raw);
 }
 
@@ -13711,7 +13760,7 @@
 LibraryPrefixPtr LibraryPrefix::New() {
   ObjectPtr raw =
       Object::Allocate(LibraryPrefix::kClassId, LibraryPrefix::InstanceSize(),
-                       Heap::kOld, /*compressed*/ false);
+                       Heap::kOld, LibraryPrefix::ContainsCompressedPointers());
   return static_cast<LibraryPrefixPtr>(raw);
 }
 
@@ -13867,7 +13916,7 @@
   ASSERT(Object::namespace_class() != Class::null());
   ObjectPtr raw =
       Object::Allocate(Namespace::kClassId, Namespace::InstanceSize(),
-                       Heap::kOld, /*compressed*/ true);
+                       Heap::kOld, Namespace::ContainsCompressedPointers());
   return static_cast<NamespacePtr>(raw);
 }
 
@@ -13886,9 +13935,9 @@
 }
 
 KernelProgramInfoPtr KernelProgramInfo::New() {
-  ObjectPtr raw = Object::Allocate(KernelProgramInfo::kClassId,
-                                   KernelProgramInfo::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw = Object::Allocate(
+      KernelProgramInfo::kClassId, KernelProgramInfo::InstanceSize(),
+      Heap::kOld, KernelProgramInfo::ContainsCompressedPointers());
   return static_cast<KernelProgramInfoPtr>(raw);
 }
 
@@ -14289,8 +14338,9 @@
   Instructions& result = Instructions::Handle();
   {
     uword aligned_size = Instructions::InstanceSize(size);
-    ObjectPtr raw = Object::Allocate(Instructions::kClassId, aligned_size,
-                                     Heap::kCode, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(Instructions::kClassId, aligned_size, Heap::kCode,
+                         Instructions::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetSize(size);
@@ -14350,8 +14400,9 @@
   InstructionsTable& result = InstructionsTable::Handle(thread->zone());
   {
     uword size = InstructionsTable::InstanceSize(length);
-    ObjectPtr raw = Object::Allocate(InstructionsTable::kClassId, size,
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(InstructionsTable::kClassId, size, Heap::kOld,
+                         InstructionsTable::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_length(length);
@@ -14452,7 +14503,7 @@
   {
     uword size = ObjectPool::InstanceSize(len);
     ObjectPtr raw = Object::Allocate(ObjectPool::kClassId, size, Heap::kOld,
-                                     /*compressed*/ false);
+                                     ObjectPool::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -14567,9 +14618,9 @@
   Thread* thread = Thread::Current();
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
-    ObjectPtr raw = Object::Allocate(PcDescriptors::kClassId,
-                                     PcDescriptors::InstanceSize(size),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        PcDescriptors::kClassId, PcDescriptors::InstanceSize(size), Heap::kOld,
+        PcDescriptors::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(size);
@@ -14584,8 +14635,9 @@
   PcDescriptors& result = PcDescriptors::Handle(thread->zone());
   {
     uword size = PcDescriptors::InstanceSize(length);
-    ObjectPtr raw = Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld,
-                                     /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(PcDescriptors::kClassId, size, Heap::kOld,
+                         PcDescriptors::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -14717,8 +14769,9 @@
   CodeSourceMap& result = CodeSourceMap::Handle(thread->zone());
   {
     uword size = CodeSourceMap::InstanceSize(length);
-    ObjectPtr raw = Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld,
-                                     /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(CodeSourceMap::kClassId, size, Heap::kOld,
+                         CodeSourceMap::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(length);
@@ -14907,9 +14960,9 @@
   {
     // CompressedStackMaps data objects are associated with a code object,
     // allocate them in old generation.
-    ObjectPtr raw = Object::Allocate(CompressedStackMaps::kClassId,
-                                     CompressedStackMaps::InstanceSize(size),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        CompressedStackMaps::kClassId, CompressedStackMaps::InstanceSize(size),
+        Heap::kOld, CompressedStackMaps::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(
@@ -15057,8 +15110,9 @@
   LocalVarDescriptors& result = LocalVarDescriptors::Handle();
   {
     uword size = LocalVarDescriptors::InstanceSize(num_variables);
-    ObjectPtr raw = Object::Allocate(LocalVarDescriptors::kClassId, size,
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(LocalVarDescriptors::kClassId, size, Heap::kOld,
+                         LocalVarDescriptors::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.untag()->num_entries_, num_variables);
@@ -15158,8 +15212,9 @@
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    ObjectPtr raw = Object::Allocate(ExceptionHandlers::kClassId, size,
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld,
+                         ExceptionHandlers::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.untag()->num_entries_, num_handlers);
@@ -15183,8 +15238,9 @@
   ExceptionHandlers& result = ExceptionHandlers::Handle();
   {
     uword size = ExceptionHandlers::InstanceSize(num_handlers);
-    ObjectPtr raw = Object::Allocate(ExceptionHandlers::kClassId, size,
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(ExceptionHandlers::kClassId, size, Heap::kOld,
+                         ExceptionHandlers::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.untag()->num_entries_, num_handlers);
@@ -15257,9 +15313,9 @@
   SingleTargetCache& result = SingleTargetCache::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    ObjectPtr raw = Object::Allocate(SingleTargetCache::kClassId,
-                                     SingleTargetCache::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        SingleTargetCache::kClassId, SingleTargetCache::InstanceSize(),
+        Heap::kOld, SingleTargetCache::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -15292,7 +15348,7 @@
   UnlinkedCall& result = UnlinkedCall::Handle();
   result ^=
       Object::Allocate(UnlinkedCall::kClassId, UnlinkedCall::InstanceSize(),
-                       Heap::kOld, /*compressed*/ false);
+                       Heap::kOld, UnlinkedCall::ContainsCompressedPointers());
   result.set_can_patch_to_monomorphic(!FLAG_precompiled_mode);
   return result.ptr();
 }
@@ -15300,9 +15356,9 @@
 MonomorphicSmiableCallPtr MonomorphicSmiableCall::New(classid_t expected_cid,
                                                       const Code& target) {
   auto& result = MonomorphicSmiableCall::Handle();
-  result ^= Object::Allocate(MonomorphicSmiableCall::kClassId,
-                             MonomorphicSmiableCall::InstanceSize(), Heap::kOld,
-                             /*compressed*/ false);
+  result ^= Object::Allocate(
+      MonomorphicSmiableCall::kClassId, MonomorphicSmiableCall::InstanceSize(),
+      Heap::kOld, MonomorphicSmiableCall::ContainsCompressedPointers());
   result.untag()->set_target(target.ptr());
   result.StoreNonPointer(&result.untag()->expected_cid_, expected_cid);
   result.StoreNonPointer(&result.untag()->entrypoint_, target.EntryPoint());
@@ -16257,8 +16313,9 @@
   ICData& result = ICData::Handle(zone);
   {
     // IC data objects are long living objects, allocate them in old generation.
-    ObjectPtr raw = Object::Allocate(ICData::kClassId, ICData::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld,
+                         ICData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -16281,8 +16338,9 @@
   ICData& result = ICData::Handle();
   {
     // IC data objects are long living objects, allocate them in old generation.
-    ObjectPtr raw = Object::Allocate(ICData::kClassId, ICData::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(ICData::kClassId, ICData::InstanceSize(), Heap::kOld,
+                         ICData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -16437,9 +16495,10 @@
   ASSERT(Object::weak_serialization_reference_class() != Class::null());
   WeakSerializationReference& result = WeakSerializationReference::Handle();
   {
-    ObjectPtr raw = Object::Allocate(WeakSerializationReference::kClassId,
-                                     WeakSerializationReference::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        WeakSerializationReference::kClassId,
+        WeakSerializationReference::InstanceSize(), Heap::kOld,
+        WeakSerializationReference::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
 
     result ^= raw;
@@ -16874,7 +16933,7 @@
   {
     uword size = Code::InstanceSize(pointer_offsets_length);
     ObjectPtr raw = Object::Allocate(Code::kClassId, size, Heap::kOld,
-                                     /*compressed*/ false);
+                                     Code::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_pointer_offsets_length(pointer_offsets_length);
@@ -17413,9 +17472,9 @@
   }
   Context& result = Context::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Context::kClassId,
-                                     Context::InstanceSize(num_variables),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        Context::kClassId, Context::InstanceSize(num_variables), space,
+        Context::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_num_variables(num_variables);
@@ -17484,8 +17543,9 @@
   intptr_t size = ContextScope::InstanceSize(num_variables);
   ContextScope& result = ContextScope::Handle();
   {
-    ObjectPtr raw = Object::Allocate(ContextScope::kClassId, size, Heap::kOld,
-                                     /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(ContextScope::kClassId, size, Heap::kOld,
+                         ContextScope::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_num_variables(num_variables);
@@ -17663,9 +17723,9 @@
 MegamorphicCachePtr MegamorphicCache::New() {
   MegamorphicCache& result = MegamorphicCache::Handle();
   {
-    ObjectPtr raw = Object::Allocate(MegamorphicCache::kClassId,
-                                     MegamorphicCache::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        MegamorphicCache::kClassId, MegamorphicCache::InstanceSize(),
+        Heap::kOld, MegamorphicCache::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17677,9 +17737,9 @@
                                           const Array& arguments_descriptor) {
   MegamorphicCache& result = MegamorphicCache::Handle();
   {
-    ObjectPtr raw = Object::Allocate(MegamorphicCache::kClassId,
-                                     MegamorphicCache::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        MegamorphicCache::kClassId, MegamorphicCache::InstanceSize(),
+        Heap::kOld, MegamorphicCache::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -17863,9 +17923,9 @@
   {
     // SubtypeTestCache objects are long living objects, allocate them in the
     // old generation.
-    ObjectPtr raw = Object::Allocate(SubtypeTestCache::kClassId,
-                                     SubtypeTestCache::InstanceSize(),
-                                     Heap::kOld, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        SubtypeTestCache::kClassId, SubtypeTestCache::InstanceSize(),
+        Heap::kOld, SubtypeTestCache::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18146,7 +18206,7 @@
     // old generation.
     ObjectPtr raw =
         Object::Allocate(LoadingUnit::kClassId, LoadingUnit::InstanceSize(),
-                         Heap::kOld, /*compressed*/ true);
+                         Heap::kOld, LoadingUnit::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18218,8 +18278,9 @@
 
 ApiErrorPtr ApiError::New() {
   ASSERT(Object::api_error_class() != Class::null());
-  ObjectPtr raw = Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(), Heap::kOld,
+                       ApiError::ContainsCompressedPointers());
   return static_cast<ApiErrorPtr>(raw);
 }
 
@@ -18236,7 +18297,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(ApiError::kClassId, ApiError::InstanceSize(), space,
-                         /*compressed*/ true);
+                         ApiError::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18261,7 +18322,7 @@
   ASSERT(Object::language_error_class() != Class::null());
   ObjectPtr raw =
       Object::Allocate(LanguageError::kClassId, LanguageError::InstanceSize(),
-                       Heap::kOld, /*compressed*/ true);
+                       Heap::kOld, LanguageError::ContainsCompressedPointers());
   return static_cast<LanguageErrorPtr>(raw);
 }
 
@@ -18278,7 +18339,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(LanguageError::kClassId, LanguageError::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, LanguageError::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18318,7 +18379,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(LanguageError::kClassId, LanguageError::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, LanguageError::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18388,9 +18449,9 @@
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    ObjectPtr raw = Object::Allocate(UnhandledException::kClassId,
-                                     UnhandledException::InstanceSize(), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        UnhandledException::kClassId, UnhandledException::InstanceSize(), space,
+        UnhandledException::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18403,9 +18464,9 @@
   ASSERT(Object::unhandled_exception_class() != Class::null());
   UnhandledException& result = UnhandledException::Handle();
   {
-    ObjectPtr raw = Object::Allocate(UnhandledException::kClassId,
-                                     UnhandledException::InstanceSize(), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        UnhandledException::kClassId, UnhandledException::InstanceSize(), space,
+        UnhandledException::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -18463,7 +18524,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(UnwindError::kClassId, UnwindError::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, UnwindError::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -19325,8 +19386,8 @@
   }
   intptr_t instance_size = cls.host_instance_size();
   ASSERT(instance_size > 0);
-  ObjectPtr raw =
-      Object::Allocate(cls.id(), instance_size, space, /*compressed*/ false);
+  ObjectPtr raw = Object::Allocate(cls.id(), instance_size, space,
+                                   Instance::ContainsCompressedPointers());
   return static_cast<InstancePtr>(raw);
 }
 
@@ -19335,8 +19396,8 @@
                                         Heap::Space heap) {
   const intptr_t instance_size = shared_class_table->SizeAt(cid);
   ASSERT(instance_size > 0);
-  ObjectPtr raw =
-      Object::Allocate(cid, instance_size, heap, /*compressed*/ false);
+  ObjectPtr raw = Object::Allocate(cid, instance_size, heap,
+                                   Instance::ContainsCompressedPointers());
   return static_cast<InstancePtr>(raw);
 }
 
@@ -20900,7 +20961,7 @@
 
 TypePtr Type::New(Heap::Space space) {
   ObjectPtr raw = Object::Allocate(Type::kClassId, Type::InstanceSize(), space,
-                                   /*compressed*/ true);
+                                   Type::ContainsCompressedPointers());
   return static_cast<TypePtr>(raw);
 }
 
@@ -21308,8 +21369,9 @@
 }
 
 TypeRefPtr TypeRef::New() {
-  ObjectPtr raw = Object::Allocate(TypeRef::kClassId, TypeRef::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ true);
+  ObjectPtr raw =
+      Object::Allocate(TypeRef::kClassId, TypeRef::InstanceSize(), Heap::kOld,
+                       TypeRef::ContainsCompressedPointers());
   return static_cast<TypeRefPtr>(raw);
 }
 
@@ -21719,7 +21781,7 @@
 TypeParameterPtr TypeParameter::New() {
   ObjectPtr raw =
       Object::Allocate(TypeParameter::kClassId, TypeParameter::InstanceSize(),
-                       Heap::kOld, /*compressed*/ true);
+                       Heap::kOld, TypeParameter::ContainsCompressedPointers());
   return static_cast<TypeParameterPtr>(raw);
 }
 
@@ -22156,7 +22218,7 @@
   Mint& result = Mint::Handle();
   {
     ObjectPtr raw = Object::Allocate(Mint::kClassId, Mint::InstanceSize(),
-                                     space, /*compressed*/ false);
+                                     space, Mint::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -22277,8 +22339,9 @@
          Class::null());
   Double& result = Double::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Double::kClassId, Double::InstanceSize(),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(Double::kClassId, Double::InstanceSize(), space,
+                         Double::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -23399,9 +23462,9 @@
     FATAL1("Fatal error in OneByteString::New: invalid len %" Pd "\n", len);
   }
   {
-    ObjectPtr raw = Object::Allocate(OneByteString::kClassId,
-                                     OneByteString::InstanceSize(len), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        OneByteString::kClassId, OneByteString::InstanceSize(len), space,
+        OneByteString::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     OneByteStringPtr result = static_cast<OneByteStringPtr>(raw);
     result->untag()->set_length(Smi::New(len));
@@ -23607,9 +23670,9 @@
   }
   String& result = String::Handle();
   {
-    ObjectPtr raw = Object::Allocate(TwoByteString::kClassId,
-                                     TwoByteString::InstanceSize(len), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        TwoByteString::kClassId, TwoByteString::InstanceSize(len), space,
+        TwoByteString::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -23764,9 +23827,9 @@
   }
   String& result = String::Handle();
   {
-    ObjectPtr raw = Object::Allocate(ExternalOneByteString::kClassId,
-                                     ExternalOneByteString::InstanceSize(),
-                                     space, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        ExternalOneByteString::kClassId, ExternalOneByteString::InstanceSize(),
+        space, ExternalOneByteString::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -23794,9 +23857,9 @@
   }
   String& result = String::Handle();
   {
-    ObjectPtr raw = Object::Allocate(ExternalTwoByteString::kClassId,
-                                     ExternalTwoByteString::InstanceSize(),
-                                     space, /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        ExternalTwoByteString::kClassId, ExternalTwoByteString::InstanceSize(),
+        space, ExternalTwoByteString::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -23901,8 +23964,9 @@
     FATAL1("Fatal error in Array::New: invalid len %" Pd "\n", len);
   }
   {
-    ArrayPtr raw = static_cast<ArrayPtr>(Object::Allocate(
-        class_id, Array::InstanceSize(len), space, /*compressed*/ false));
+    ArrayPtr raw = static_cast<ArrayPtr>(
+        Object::Allocate(class_id, Array::InstanceSize(len), space,
+                         Array::ContainsCompressedPointers()));
     NoSafepointScope no_safepoint;
     raw->untag()->set_length(Smi::New(len));
     return raw;
@@ -24109,9 +24173,9 @@
       Class::null());
   GrowableObjectArray& result = GrowableObjectArray::Handle();
   {
-    ObjectPtr raw = Object::Allocate(GrowableObjectArray::kClassId,
-                                     GrowableObjectArray::InstanceSize(), space,
-                                     /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        GrowableObjectArray::kClassId, GrowableObjectArray::InstanceSize(),
+        space, GrowableObjectArray::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(0);
@@ -24199,7 +24263,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(LinkedHashMap::kClassId, LinkedHashMap::InstanceSize(),
-                         space, /*compressed*/ false);
+                         space, LinkedHashMap::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24227,7 +24291,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space,
-                         /*compressed*/ false);
+                         Float32x4::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24245,7 +24309,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(Float32x4::kClassId, Float32x4::InstanceSize(), space,
-                         /*compressed*/ false);
+                         Float32x4::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24313,8 +24377,9 @@
          Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space,
+                         Int32x4::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24330,8 +24395,9 @@
          Class::null());
   Int32x4& result = Int32x4::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(Int32x4::kClassId, Int32x4::InstanceSize(), space,
+                         Int32x4::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24397,7 +24463,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space,
-                         /*compressed*/ false);
+                         Float64x2::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24413,7 +24479,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(Float64x2::kClassId, Float64x2::InstanceSize(), space,
-                         /*compressed*/ false);
+                         Float64x2::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -24517,7 +24583,7 @@
     const intptr_t length_in_bytes = len * ElementSizeInBytes(class_id);
     ObjectPtr raw =
         Object::Allocate(class_id, TypedData::InstanceSize(length_in_bytes),
-                         space, /*compressed*/ true);
+                         space, TypedData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -24564,7 +24630,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(class_id, ExternalTypedData::InstanceSize(), space,
-                         /*compressed*/ true);
+                         ExternalTypedData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.SetLength(len);
@@ -24585,8 +24651,9 @@
 TypedDataViewPtr TypedDataView::New(intptr_t class_id, Heap::Space space) {
   auto& result = TypedDataView::Handle();
   {
-    ObjectPtr raw = Object::Allocate(class_id, TypedDataView::InstanceSize(),
-                                     space, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(class_id, TypedDataView::InstanceSize(), space,
+                         TypedDataView::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.Clear();
@@ -24636,7 +24703,7 @@
 
   Pointer& result = Pointer::Handle(zone);
   result ^= Object::Allocate(kFfiPointerCid, Pointer::InstanceSize(), space,
-                             /*compressed*/ false);
+                             Pointer::ContainsCompressedPointers());
   result.SetTypeArguments(type_args);
   result.SetNativeAddress(native_address);
 
@@ -24654,7 +24721,7 @@
   DynamicLibrary& result = DynamicLibrary::Handle();
   result ^=
       Object::Allocate(kFfiDynamicLibraryCid, DynamicLibrary::InstanceSize(),
-                       space, /*compressed*/ false);
+                       space, DynamicLibrary::ContainsCompressedPointers());
   NoSafepointScope no_safepoint;
   result.SetHandle(handle);
   return result.ptr();
@@ -24678,7 +24745,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(Capability::kClassId, Capability::InstanceSize(),
-                         space, /*compressed*/ false);
+                         space, Capability::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.untag()->id_, id);
@@ -24708,7 +24775,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(ReceivePort::kClassId, ReceivePort::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, ReceivePort::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.untag()->set_send_port(send_port.ptr());
@@ -24741,7 +24808,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(SendPort::kClassId, SendPort::InstanceSize(), space,
-                         /*compressed*/ false);
+                         SendPort::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(&result.untag()->id_, id);
@@ -24767,9 +24834,9 @@
   Thread* thread = Thread::Current();
   TransferableTypedData& result = TransferableTypedData::Handle();
   {
-    ObjectPtr raw = Object::Allocate(TransferableTypedData::kClassId,
-                                     TransferableTypedData::InstanceSize(),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw = Object::Allocate(
+        TransferableTypedData::kClassId, TransferableTypedData::InstanceSize(),
+        space, TransferableTypedData::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     thread->heap()->SetPeer(raw, peer);
     result ^= raw;
@@ -24906,8 +24973,9 @@
                         Heap::Space space) {
   Closure& result = Closure::Handle();
   {
-    ObjectPtr raw = Object::Allocate(Closure::kClassId, Closure::InstanceSize(),
-                                     space, /*compressed*/ false);
+    ObjectPtr raw =
+        Object::Allocate(Closure::kClassId, Closure::InstanceSize(), space,
+                         Closure::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.untag()->set_instantiator_type_arguments(
@@ -24921,8 +24989,9 @@
 }
 
 ClosurePtr Closure::New() {
-  ObjectPtr raw = Object::Allocate(Closure::kClassId, Closure::InstanceSize(),
-                                   Heap::kOld, /*compressed*/ false);
+  ObjectPtr raw =
+      Object::Allocate(Closure::kClassId, Closure::InstanceSize(), Heap::kOld,
+                       Closure::ContainsCompressedPointers());
   return static_cast<ClosurePtr>(raw);
 }
 
@@ -25019,7 +25088,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(StackTrace::kClassId, StackTrace::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, StackTrace::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -25039,7 +25108,7 @@
   {
     ObjectPtr raw =
         Object::Allocate(StackTrace::kClassId, StackTrace::InstanceSize(),
-                         space, /*compressed*/ true);
+                         space, StackTrace::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -25399,8 +25468,9 @@
 RegExpPtr RegExp::New(Heap::Space space) {
   RegExp& result = RegExp::Handle();
   {
-    ObjectPtr raw = Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(),
-                                     space, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(RegExp::kClassId, RegExp::InstanceSize(), space,
+                         RegExp::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.set_type(kUninitialized);
@@ -25482,7 +25552,7 @@
          Class::null());
   ObjectPtr raw =
       Object::Allocate(WeakProperty::kClassId, WeakProperty::InstanceSize(),
-                       space, /*compressed*/ false);
+                       space, WeakProperty::ContainsCompressedPointers());
   return static_cast<WeakPropertyPtr>(raw);
 }
 
@@ -25529,9 +25599,9 @@
                                         Heap::Space space) {
   MirrorReference& result = MirrorReference::Handle();
   {
-    ObjectPtr raw = Object::Allocate(MirrorReference::kClassId,
-                                     MirrorReference::InstanceSize(), space,
-                                     /*compressed*/ true);
+    ObjectPtr raw = Object::Allocate(
+        MirrorReference::kClassId, MirrorReference::InstanceSize(), space,
+        MirrorReference::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
@@ -25568,8 +25638,9 @@
   }
   // No tag with label exists, create and register with isolate tag table.
   {
-    ObjectPtr raw = Object::Allocate(UserTag::kClassId, UserTag::InstanceSize(),
-                                     space, /*compressed*/ true);
+    ObjectPtr raw =
+        Object::Allocate(UserTag::kClassId, UserTag::InstanceSize(), space,
+                         UserTag::ContainsCompressedPointers());
     NoSafepointScope no_safepoint;
     result ^= raw;
   }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 29ed4b3..e3189da 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -81,10 +81,32 @@
 #define CHECK_HANDLE()
 #endif
 
+// For AllStatic classes like OneByteString. Checks that
+// ContainsCompressedPointers() returns the same value for AllStatic class and
+// class used for handles.
+#define ALLSTATIC_CONTAINS_COMPRESSED_IMPLEMENTATION(object, handle)           \
+  static_assert(std::is_base_of<dart::handle##Ptr, dart::object##Ptr>::value,  \
+                #object "Ptr must be a subtype of " #handle "Ptr");            \
+  static_assert(dart::handle::ContainsCompressedPointers() ==                  \
+                    dart::Untagged##object::kContainsCompressedPointers,       \
+                "Pointer compression in Untagged" #object                      \
+                " must match pointer compression in Untagged" #handle);        \
+  static constexpr bool ContainsCompressedPointers() {                         \
+    return dart::Untagged##object::kContainsCompressedPointers;                \
+  }
+
 #define BASE_OBJECT_IMPLEMENTATION(object, super)                              \
  public: /* NOLINT */                                                          \
   using UntaggedObjectType = dart::Untagged##object;                           \
   using ObjectPtrType = dart::object##Ptr;                                     \
+  static_assert(!dart::super::ContainsCompressedPointers() ||                  \
+                    UntaggedObjectType::kContainsCompressedPointers,           \
+                "Untagged" #object                                             \
+                " must have compressed pointers, as supertype Untagged" #super \
+                " has compressed pointers");                                   \
+  static constexpr bool ContainsCompressedPointers() {                         \
+    return UntaggedObjectType::kContainsCompressedPointers;                    \
+  }                                                                            \
   object##Ptr ptr() const { return static_cast<object##Ptr>(ptr_); }           \
   bool Is##object() const { return true; }                                     \
   DART_NOINLINE static object& Handle() {                                      \
@@ -287,6 +309,9 @@
 
   virtual ~Object() {}
 
+  static constexpr bool ContainsCompressedPointers() {
+    return UntaggedObject::kContainsCompressedPointers;
+  }
   ObjectPtr ptr() const { return ptr_; }
   void operator=(ObjectPtr value) { initializeHandle(this, value); }
 
@@ -937,6 +962,7 @@
     kInvocationDispatcherEntrySize,
   };
 
+  bool HasCompressedPointers() const;
   intptr_t host_instance_size() const {
     ASSERT(is_finalized() || is_prefinalized());
     return (untag()->host_instance_size_in_words_ * kWordSize);
@@ -9367,6 +9393,8 @@
 
 class OneByteString : public AllStatic {
  public:
+  ALLSTATIC_CONTAINS_COMPRESSED_IMPLEMENTATION(OneByteString, String);
+
   static uint16_t CharAt(const String& str, intptr_t index) {
     ASSERT(str.IsOneByteString());
     NoSafepointScope no_safepoint;
@@ -9512,6 +9540,8 @@
 
 class TwoByteString : public AllStatic {
  public:
+  ALLSTATIC_CONTAINS_COMPRESSED_IMPLEMENTATION(TwoByteString, String);
+
   static uint16_t CharAt(const String& str, intptr_t index) {
     ASSERT(str.IsTwoByteString());
     NoSafepointScope no_safepoint;
@@ -9639,6 +9669,8 @@
 
 class ExternalOneByteString : public AllStatic {
  public:
+  ALLSTATIC_CONTAINS_COMPRESSED_IMPLEMENTATION(ExternalOneByteString, String);
+
   static uint16_t CharAt(const String& str, intptr_t index) {
     ASSERT(str.IsExternalOneByteString());
     NoSafepointScope no_safepoint;
@@ -9737,6 +9769,8 @@
 
 class ExternalTwoByteString : public AllStatic {
  public:
+  ALLSTATIC_CONTAINS_COMPRESSED_IMPLEMENTATION(ExternalTwoByteString, String);
+
   static uint16_t CharAt(const String& str, intptr_t index) {
     ASSERT(str.IsExternalTwoByteString());
     NoSafepointScope no_safepoint;
@@ -10056,6 +10090,10 @@
 
 class ImmutableArray : public AllStatic {
  public:
+  static constexpr bool ContainsCompressedPointers() {
+    return Array::ContainsCompressedPointers();
+  }
+
   static ImmutableArrayPtr New(intptr_t len, Heap::Space space = Heap::kNew);
 
   static ImmutableArrayPtr ReadFrom(SnapshotReader* reader,
@@ -10671,6 +10709,10 @@
 
 class ByteBuffer : public AllStatic {
  public:
+  static constexpr bool ContainsCompressedPointers() {
+    return Instance::ContainsCompressedPointers();
+  }
+
   static InstancePtr Data(const Instance& view_obj) {
     ASSERT(!view_obj.IsNull());
     return *reinterpret_cast<InstancePtr const*>(view_obj.untag() +
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 7c62065..ac28bb9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -45,24 +45,71 @@
 class CodeStatistics;
 class StackFrame;
 
-#define VISIT_FROM(type, first)                                                \
-  type* from() { return reinterpret_cast<type*>(&first##_); }
+#define DEFINE_CONTAINS_COMPRESSED(type)                                       \
+  static constexpr bool kContainsCompressedPointers =                          \
+      is_compressed_ptr<type>::value;
 
-#define VISIT_TO(type, last)                                                   \
-  type* to() { return reinterpret_cast<type*>(&last##_); }
+#define CHECK_CONTAIN_COMPRESSED(type)                                         \
+  static_assert(                                                               \
+      kContainsCompressedPointers || is_uncompressed_ptr<type>::value,         \
+      "From declaration uses ObjectPtr");                                      \
+  static_assert(                                                               \
+      !kContainsCompressedPointers || is_compressed_ptr<type>::value,          \
+      "From declaration uses CompressedObjectPtr");
 
-#define VISIT_TO_LENGTH(type, last)                                            \
-  type* to(intptr_t length) { return reinterpret_cast<type*>(last); }
+#define VISIT_FROM(first)                                                      \
+  DEFINE_CONTAINS_COMPRESSED(decltype(first##_))                               \
+  base_ptr_type<decltype(first##_)>::type* from() {                            \
+    return reinterpret_cast<base_ptr_type<decltype(first##_)>::type*>(         \
+        &first##_);                                                            \
+  }
+
+#define VISIT_FROM_PAYLOAD_START(elem_type)                                    \
+  static_assert(is_uncompressed_ptr<elem_type>::value ||                       \
+                    is_compressed_ptr<elem_type>::value,                       \
+                "Payload elements must be object pointers");                   \
+  DEFINE_CONTAINS_COMPRESSED(elem_type)                                        \
+  base_ptr_type<elem_type>::type* from() {                                     \
+    const uword payload_start = reinterpret_cast<uword>(this) + sizeof(*this); \
+    ASSERT(Utils::IsAligned(payload_start, sizeof(elem_type)));                \
+    return reinterpret_cast<base_ptr_type<elem_type>::type*>(payload_start);   \
+  }
+
+#define VISIT_TO(last)                                                         \
+  CHECK_CONTAIN_COMPRESSED(decltype(last##_));                                 \
+  base_ptr_type<decltype(last##_)>::type* to(intptr_t length = 0) {            \
+    return reinterpret_cast<base_ptr_type<decltype(last##_)>::type*>(          \
+        &last##_);                                                             \
+  }
+
+#define VISIT_TO_PAYLOAD_END(elem_type)                                        \
+  static_assert(is_uncompressed_ptr<elem_type>::value ||                       \
+                    is_compressed_ptr<elem_type>::value,                       \
+                "Payload elements must be object pointers");                   \
+  CHECK_CONTAIN_COMPRESSED(elem_type);                                         \
+  base_ptr_type<elem_type>::type* to(intptr_t length) {                        \
+    const uword payload_start = reinterpret_cast<uword>(this) + sizeof(*this); \
+    ASSERT(Utils::IsAligned(payload_start, sizeof(elem_type)));                \
+    const uword payload_last =                                                 \
+        payload_start + sizeof(elem_type) * (length - 1);                      \
+    return reinterpret_cast<base_ptr_type<elem_type>::type*>(payload_last);    \
+  }
 
 #define VISIT_NOTHING() int NothingToVisit();
 
+#if defined(DART_COMPRESSED_POINTERS)
 #define ASSERT_UNCOMPRESSED(Type)                                              \
-  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Untagged##Type, from) ==          \
-         sizeof(ObjectPtr))
+  static_assert(!Untagged##Type::kContainsCompressedPointers,                  \
+                "Should contain compressed pointers");
 
 #define ASSERT_COMPRESSED(Type)                                                \
-  ASSERT(SIZE_OF_DEREFERENCED_RETURNED_VALUE(Untagged##Type, from) ==          \
-         sizeof(CompressedObjectPtr))
+  static_assert(Untagged##Type::kContainsCompressedPointers,                   \
+                "Should not contain compressed pointers");
+#else
+// Do no checks if there are no compressed pointers.
+#define ASSERT_UNCOMPRESSED(Type)
+#define ASSERT_COMPRESSED(Type)
+#endif
 
 #define ASSERT_NOTHING_TO_VISIT(Type)                                          \
   ASSERT(SIZE_OF_RETURNED_VALUE(Untagged##Type, NothingToVisit) == sizeof(int))
@@ -539,10 +586,13 @@
     tags_.UpdateUnsynchronized<ClassIdTag>(new_cid);
   }
 
+ protected:
+  // Automatically inherited by subclasses unless overridden.
+  static constexpr bool kContainsCompressedPointers = false;
+
   // All writes to heap objects should ultimately pass through one of the
   // methods below or their counterparts in Object, to ensure that the
   // write barrier is correctly applied.
- protected:
   template <typename type, std::memory_order order = std::memory_order_relaxed>
   type LoadPointer(type const* addr) const {
     return reinterpret_cast<std::atomic<type>*>(const_cast<type*>(addr))
@@ -862,7 +912,8 @@
                                                                                \
  protected:                                                                    \
   type* array_name() { OPEN_ARRAY_START(type, type); }                         \
-  type const* array_name() const { OPEN_ARRAY_START(type, type); }
+  type const* array_name() const { OPEN_ARRAY_START(type, type); }             \
+  VISIT_TO_PAYLOAD_END(type)
 
 #define COMPRESSED_VARIABLE_POINTER_FIELDS(type, accessor_name, array_name)    \
  public:                                                                       \
@@ -883,7 +934,8 @@
   }                                                                            \
   Compressed##type const* array_name() const {                                 \
     OPEN_ARRAY_START(Compressed##type, Compressed##type);                      \
-  }
+  }                                                                            \
+  VISIT_TO_PAYLOAD_END(Compressed##type)
 
 #define SMI_FIELD(type, name)                                                  \
  public:                                                                       \
@@ -944,8 +996,8 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Class);
 
-  VISIT_FROM(CompressedObjectPtr, name)
   COMPRESSED_POINTER_FIELD(StringPtr, name)
+  VISIT_FROM(name)
   NOT_IN_PRODUCT(COMPRESSED_POINTER_FIELD(StringPtr, user_name))
   COMPRESSED_POINTER_FIELD(ArrayPtr, functions)
   COMPRESSED_POINTER_FIELD(ArrayPtr, functions_hash_table)
@@ -979,12 +1031,12 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 #if defined(PRODUCT)
-  VISIT_TO(CompressedObjectPtr, invocation_dispatcher_cache)
+  VISIT_TO(invocation_dispatcher_cache)
 #else
-  VISIT_TO(CompressedObjectPtr, direct_subclasses)
+  VISIT_TO(direct_subclasses)
 #endif  // defined(PRODUCT)
 #else
-  VISIT_TO(CompressedObjectPtr, dependent_code)
+  VISIT_TO(dependent_code)
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
@@ -1063,12 +1115,12 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
 
-  VISIT_FROM(CompressedObjectPtr, patched_class)
   COMPRESSED_POINTER_FIELD(ClassPtr, patched_class)
+  VISIT_FROM(patched_class)
   COMPRESSED_POINTER_FIELD(ClassPtr, origin_class)
   COMPRESSED_POINTER_FIELD(ScriptPtr, script)
   COMPRESSED_POINTER_FIELD(ExternalTypedDataPtr, library_kernel_data)
-  VISIT_TO(CompressedObjectPtr, library_kernel_data)
+  VISIT_TO(library_kernel_data)
 
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
@@ -1247,8 +1299,8 @@
   uword entry_point_;            // Accessed from generated code.
   uword unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(CompressedObjectPtr, name)
   COMPRESSED_POINTER_FIELD(StringPtr, name)
+  VISIT_FROM(name)
   // Class or patch class or mixin class where this function is defined.
   COMPRESSED_POINTER_FIELD(ObjectPtr, owner)
   COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_names)
@@ -1278,9 +1330,9 @@
   // Unoptimized code, keep it after optimization.
   NOT_IN_PRECOMPILED(COMPRESSED_POINTER_FIELD(CodePtr, unoptimized_code));
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(CompressedObjectPtr, code);
+  VISIT_TO(code);
 #else
-  VISIT_TO(CompressedObjectPtr, unoptimized_code);
+  VISIT_TO(unoptimized_code);
 #endif
 
   NOT_IN_PRECOMPILED(UnboxedParameterBitmap unboxed_parameters_info_);
@@ -1346,8 +1398,8 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ClosureData);
 
-  VISIT_FROM(CompressedObjectPtr, context_scope)
   COMPRESSED_POINTER_FIELD(ContextScopePtr, context_scope)
+  VISIT_FROM(context_scope)
   // Enclosing function of this local function.
 #if defined(DART_PRECOMPILER)
   // Can be wrapped by a WSR in the precompiler.
@@ -1357,7 +1409,7 @@
 #endif
   // Closure object for static implicit closures.
   COMPRESSED_POINTER_FIELD(InstancePtr, closure)
-  VISIT_TO(CompressedObjectPtr, closure)
+  VISIT_TO(closure)
 
   enum class DefaultTypeArgumentsKind : uint8_t {
     // Only here to make sure it's explicitly set appropriately.
@@ -1388,8 +1440,8 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(FfiTrampolineData);
 
-  VISIT_FROM(CompressedObjectPtr, signature_type)
   COMPRESSED_POINTER_FIELD(TypePtr, signature_type)
+  VISIT_FROM(signature_type)
   COMPRESSED_POINTER_FIELD(FunctionTypePtr, c_signature)
 
   // Target Dart method for callbacks, otherwise null.
@@ -1397,8 +1449,7 @@
 
   // For callbacks, value to return if Dart target throws an exception.
   COMPRESSED_POINTER_FIELD(InstancePtr, callback_exceptional_return)
-
-  VISIT_TO(CompressedObjectPtr, callback_exceptional_return)
+  VISIT_TO(callback_exceptional_return)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Callback id for callbacks.
@@ -1416,8 +1467,8 @@
 class UntaggedField : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Field);
 
-  VISIT_FROM(CompressedObjectPtr, name)
   COMPRESSED_POINTER_FIELD(StringPtr, name)
+  VISIT_FROM(name)
   // Class or patch class or mixin class where this field is defined or original
   // field.
   COMPRESSED_POINTER_FIELD(ObjectPtr, owner)
@@ -1445,11 +1496,11 @@
     return NULL;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(CompressedObjectPtr, dependent_code);
+  VISIT_TO(dependent_code);
 #else
   // For type test in implicit setter.
   COMPRESSED_POINTER_FIELD(SubtypeTestCachePtr, type_test_cache);
-  VISIT_TO(CompressedObjectPtr, type_test_cache);
+  VISIT_TO(type_test_cache);
 #endif
   TokenPosition token_pos_;
   TokenPosition end_token_pos_;
@@ -1487,8 +1538,8 @@
 class alignas(8) UntaggedScript : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Script);
 
-  VISIT_FROM(CompressedObjectPtr, url)
   COMPRESSED_POINTER_FIELD(StringPtr, url)
+  VISIT_FROM(url)
   COMPRESSED_POINTER_FIELD(StringPtr, resolved_url)
   COMPRESSED_POINTER_FIELD(ArrayPtr, compile_time_constants)
   COMPRESSED_POINTER_FIELD(TypedDataPtr, line_starts)
@@ -1498,7 +1549,7 @@
   COMPRESSED_POINTER_FIELD(ArrayPtr, debug_positions)
   COMPRESSED_POINTER_FIELD(KernelProgramInfoPtr, kernel_program_info)
   COMPRESSED_POINTER_FIELD(StringPtr, source)
-  VISIT_TO(CompressedObjectPtr, source)
+  VISIT_TO(source)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1579,8 +1630,8 @@
 
   RAW_HEAP_OBJECT_IMPLEMENTATION(Library);
 
-  VISIT_FROM(CompressedObjectPtr, name)
   COMPRESSED_POINTER_FIELD(StringPtr, name)
+  VISIT_FROM(name)
   COMPRESSED_POINTER_FIELD(StringPtr, url)
   COMPRESSED_POINTER_FIELD(StringPtr, private_key)
   // Top-level names in this library.
@@ -1619,7 +1670,7 @@
   COMPRESSED_POINTER_FIELD(ArrayPtr, exported_names);
   // Array of scripts loaded in this library.
   COMPRESSED_POINTER_FIELD(ArrayPtr, loaded_scripts);
-  VISIT_TO(CompressedObjectPtr, loaded_scripts);
+  VISIT_TO(loaded_scripts);
 
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
@@ -1639,15 +1690,15 @@
 class UntaggedNamespace : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Namespace);
 
-  VISIT_FROM(CompressedObjectPtr, target)
   // library with name dictionary.
   COMPRESSED_POINTER_FIELD(LibraryPtr, target)
+  VISIT_FROM(target)
   // list of names that are exported.
   COMPRESSED_POINTER_FIELD(ArrayPtr, show_names)
   // list of names that are hidden.
   COMPRESSED_POINTER_FIELD(ArrayPtr, hide_names)
   COMPRESSED_POINTER_FIELD(LibraryPtr, owner)
-  VISIT_TO(CompressedObjectPtr, owner)
+  VISIT_TO(owner)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -1669,8 +1720,8 @@
 class UntaggedKernelProgramInfo : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(KernelProgramInfo);
 
-  VISIT_FROM(CompressedObjectPtr, string_offsets)
   COMPRESSED_POINTER_FIELD(TypedDataPtr, string_offsets)
+  VISIT_FROM(string_offsets)
   COMPRESSED_POINTER_FIELD(ExternalTypedDataPtr, string_data)
   COMPRESSED_POINTER_FIELD(TypedDataPtr, canonical_names)
   COMPRESSED_POINTER_FIELD(ExternalTypedDataPtr, metadata_payloads)
@@ -1683,7 +1734,7 @@
   COMPRESSED_POINTER_FIELD(ArrayPtr, libraries_cache)
   COMPRESSED_POINTER_FIELD(ArrayPtr, classes_cache)
   COMPRESSED_POINTER_FIELD(ObjectPtr, retained_kernel_blob)
-  VISIT_TO(CompressedObjectPtr, retained_kernel_blob)
+  VISIT_TO(retained_kernel_blob)
 
   uint32_t kernel_binary_version_;
 
@@ -1695,10 +1746,10 @@
 class UntaggedWeakSerializationReference : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakSerializationReference);
 
-  VISIT_FROM(CompressedObjectPtr, target)
   COMPRESSED_POINTER_FIELD(ObjectPtr, target)
+  VISIT_FROM(target)
   COMPRESSED_POINTER_FIELD(ObjectPtr, replacement)
-  VISIT_TO(CompressedObjectPtr, replacement)
+  VISIT_TO(replacement)
 };
 
 class UntaggedCode : public UntaggedObject {
@@ -1750,8 +1801,8 @@
   uword unchecked_entry_point_;              // Accessed from generated code.
   uword monomorphic_unchecked_entry_point_;  // Accessed from generated code.
 
-  VISIT_FROM(ObjectPtr, object_pool)
   POINTER_FIELD(ObjectPoolPtr, object_pool)  // Accessed from generated code.
+  VISIT_FROM(object_pool)
   POINTER_FIELD(InstructionsPtr,
                 instructions)  // Accessed from generated code.
   // If owner_ is Function::null() the owner is a regular stub.
@@ -1779,11 +1830,11 @@
   NOT_IN_PRODUCT(POINTER_FIELD(ArrayPtr, comments))
 
 #if !defined(PRODUCT)
-  VISIT_TO(ObjectPtr, comments);
+  VISIT_TO(comments);
 #elif defined(DART_PRECOMPILED_RUNTIME)
-  VISIT_TO(ObjectPtr, code_source_map);
+  VISIT_TO(code_source_map);
 #else
-  VISIT_TO(ObjectPtr, static_calls_target_table);
+  VISIT_TO(static_calls_target_table);
 #endif
 
   // Compilation timestamp.
@@ -1830,6 +1881,7 @@
   };
   Entry* data() { OPEN_ARRAY_START(Entry, Entry); }
   Entry const* data() const { OPEN_ARRAY_START(Entry, Entry); }
+  DEFINE_CONTAINS_COMPRESSED(decltype(Entry::raw_obj_));
 
   // The entry bits are located after the last entry. They are encoded versions
   // of `ObjectPool::TypeBits() | ObjectPool::PatchabililtyBit()`.
@@ -1901,9 +1953,9 @@
 class UntaggedInstructionsTable : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(InstructionsTable);
 
-  VISIT_FROM(ObjectPtr, descriptors)
   POINTER_FIELD(ArrayPtr, descriptors)
-  VISIT_TO_LENGTH(ObjectPtr, &descriptors_)
+  VISIT_FROM(descriptors)
+  VISIT_TO(descriptors)
 
   intptr_t length_;
   uword start_pc_;
@@ -2159,21 +2211,13 @@
   // platforms.
   uword num_entries_;
 
-  CompressedObjectPtr* from() {
-    return reinterpret_cast<CompressedObjectPtr*>(&names()[0]);
-  }
-  CompressedStringPtr* names() {
-    // Array of [num_entries_] variable names.
-    OPEN_ARRAY_START(CompressedStringPtr, CompressedStringPtr);
-  }
+  VISIT_FROM_PAYLOAD_START(CompressedStringPtr)
+  COMPRESSED_VARIABLE_POINTER_FIELDS(StringPtr, name, names)
+
   CompressedStringPtr* nameAddrAt(intptr_t i) { return &(names()[i]); }
-  StringPtr name(intptr_t i) {
-    return LoadCompressedPointer<StringPtr>(nameAddrAt(i));
-  }
   void set_name(intptr_t i, StringPtr value) {
     StoreCompressedPointer(nameAddrAt(i), value);
   }
-  VISIT_TO_LENGTH(CompressedObjectPtr, nameAddrAt(length - 1));
 
   // Variable info with [num_entries_] entries.
   VarInfo* data() {
@@ -2192,9 +2236,9 @@
 
   // Array with [num_entries_] entries. Each entry is an array of all handled
   // exception types.
-  VISIT_FROM(CompressedObjectPtr, handled_types_data)
   COMPRESSED_POINTER_FIELD(ArrayPtr, handled_types_data)
-  VISIT_TO_LENGTH(CompressedObjectPtr, &handled_types_data_)
+  VISIT_FROM(handled_types_data)
+  VISIT_TO(handled_types_data)
 
   // Exception handler info of length [num_entries_].
   const ExceptionHandlerInfo* data() const {
@@ -2212,11 +2256,10 @@
 
   int32_t num_variables_;
 
-  VISIT_FROM(ObjectPtr, parent)
   POINTER_FIELD(ContextPtr, parent)
+  VISIT_FROM(parent)
   // Variable length data follows here.
   VARIABLE_POINTER_FIELDS(ObjectPtr, element, data)
-  VISIT_TO_LENGTH(ObjectPtr, &data()[length - 1]);
 
   friend class Object;
   friend class SnapshotReader;
@@ -2247,6 +2290,10 @@
   int32_t num_variables_;
   bool is_implicit_;  // true, if this context scope is for an implicit closure.
 
+  // Just choose one of the fields in VariableDesc, since they should all be
+  // compressed or not compressed.
+  DEFINE_CONTAINS_COMPRESSED(decltype(VariableDesc::name));
+
   CompressedObjectPtr* from() {
     VariableDesc* begin = const_cast<VariableDesc*>(VariableDescAddr(0));
     return reinterpret_cast<CompressedObjectPtr*>(begin);
@@ -2296,9 +2343,9 @@
 
 class UntaggedSingleTargetCache : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
-  VISIT_FROM(ObjectPtr, target)
   POINTER_FIELD(CodePtr, target)
-  VISIT_TO(ObjectPtr, target)
+  VISIT_FROM(target)
+  VISIT_TO(target)
   uword entry_point_;
   ClassIdTagType lower_limit_;
   ClassIdTagType upper_limit_;
@@ -2306,10 +2353,10 @@
 
 class UntaggedMonomorphicSmiableCall : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MonomorphicSmiableCall);
-  VISIT_FROM(ObjectPtr, target)
   POINTER_FIELD(CodePtr,
                 target);  // Entrypoint PC in bare mode, Code in non-bare mode.
-  VISIT_TO(ObjectPtr, target)
+  VISIT_FROM(target)
+  VISIT_TO(target)
   uword expected_cid_;
   uword entrypoint_;
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
@@ -2319,31 +2366,31 @@
 class UntaggedCallSiteData : public UntaggedObject {
  protected:
   POINTER_FIELD(StringPtr, target_name);  // Name of target function.
+  VISIT_FROM(target_name)
   // arg_descriptor in RawICData and in RawMegamorphicCache should be
   // in the same position so that NoSuchMethod can access it.
   POINTER_FIELD(ArrayPtr, args_descriptor);  // Arguments descriptor.
+  VISIT_TO(args_descriptor)
+  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(CallSiteData)
 };
 
 class UntaggedUnlinkedCall : public UntaggedCallSiteData {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnlinkedCall);
-  VISIT_FROM(ObjectPtr, target_name)
-  VISIT_TO(ObjectPtr, args_descriptor)
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   bool can_patch_to_monomorphic_;
 };
 
 class UntaggedICData : public UntaggedCallSiteData {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ICData);
-  VISIT_FROM(ObjectPtr, target_name)
   POINTER_FIELD(ArrayPtr, entries)  // Contains class-ids, target and count.
   // Static type of the receiver, if instance call and available.
   NOT_IN_PRECOMPILED(POINTER_FIELD(AbstractTypePtr, receivers_static_type))
   POINTER_FIELD(ObjectPtr,
                 owner)  // Parent/calling function or original IC of cloned IC.
-  VISIT_TO(ObjectPtr, owner)
+  VISIT_TO(owner)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -2367,10 +2414,9 @@
 class UntaggedMegamorphicCache : public UntaggedCallSiteData {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MegamorphicCache);
 
-  VISIT_FROM(ObjectPtr, target_name)
   POINTER_FIELD(ArrayPtr, buckets)
   SMI_FIELD(SmiPtr, mask)
-  VISIT_TO(ObjectPtr, mask)
+  VISIT_TO(mask)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   int32_t filled_entry_count_;
@@ -2379,18 +2425,18 @@
 class UntaggedSubtypeTestCache : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(SubtypeTestCache);
 
-  VISIT_FROM(ObjectPtr, cache)
   POINTER_FIELD(ArrayPtr, cache)
-  VISIT_TO(ObjectPtr, cache)
+  VISIT_FROM(cache)
+  VISIT_TO(cache)
 };
 
 class UntaggedLoadingUnit : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LoadingUnit);
 
-  VISIT_FROM(CompressedObjectPtr, parent)
   COMPRESSED_POINTER_FIELD(LoadingUnitPtr, parent)
+  VISIT_FROM(parent)
   COMPRESSED_POINTER_FIELD(ArrayPtr, base_objects)
-  VISIT_TO(CompressedObjectPtr, base_objects)
+  VISIT_TO(base_objects)
   int32_t id_;
   bool load_outstanding_;
   bool loaded_;
@@ -2403,21 +2449,21 @@
 class UntaggedApiError : public UntaggedError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ApiError);
 
-  VISIT_FROM(CompressedObjectPtr, message)
   COMPRESSED_POINTER_FIELD(StringPtr, message)
-  VISIT_TO(CompressedObjectPtr, message)
+  VISIT_FROM(message)
+  VISIT_TO(message)
 };
 
 class UntaggedLanguageError : public UntaggedError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LanguageError);
 
-  VISIT_FROM(CompressedObjectPtr, previous_error)
   COMPRESSED_POINTER_FIELD(ErrorPtr, previous_error)  // May be null.
+  VISIT_FROM(previous_error)
   COMPRESSED_POINTER_FIELD(ScriptPtr, script)
   COMPRESSED_POINTER_FIELD(StringPtr, message)
   // Incl. previous error's formatted message.
   COMPRESSED_POINTER_FIELD(StringPtr, formatted_message)
-  VISIT_TO(CompressedObjectPtr, formatted_message)
+  VISIT_TO(formatted_message)
   TokenPosition token_pos_;  // Source position in script_.
   bool report_after_token_;  // Report message at or after the token.
   int8_t kind_;              // Of type Report::Kind.
@@ -2428,37 +2474,39 @@
 class UntaggedUnhandledException : public UntaggedError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnhandledException);
 
-  VISIT_FROM(CompressedObjectPtr, exception)
   COMPRESSED_POINTER_FIELD(InstancePtr, exception)
+  VISIT_FROM(exception)
   COMPRESSED_POINTER_FIELD(InstancePtr, stacktrace)
-  VISIT_TO(CompressedObjectPtr, stacktrace)
+  VISIT_TO(stacktrace)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class UntaggedUnwindError : public UntaggedError {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UnwindError);
 
-  VISIT_FROM(CompressedObjectPtr, message)
   COMPRESSED_POINTER_FIELD(StringPtr, message)
-  VISIT_TO(CompressedObjectPtr, message)
+  VISIT_FROM(message)
+  VISIT_TO(message)
   bool is_user_initiated_;
 };
 
 class UntaggedInstance : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Instance);
+  friend class Object;
+  friend class SnapshotReader;
 };
 
 class UntaggedLibraryPrefix : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LibraryPrefix);
 
-  VISIT_FROM(CompressedObjectPtr, name)
   // Library prefix name.
   COMPRESSED_POINTER_FIELD(StringPtr, name)
+  VISIT_FROM(name)
   // Libraries imported with this prefix.
   COMPRESSED_POINTER_FIELD(ArrayPtr, imports)
   // Library which declares this prefix.
   COMPRESSED_POINTER_FIELD(LibraryPtr, importer)
-  VISIT_TO(CompressedObjectPtr, importer)
+  VISIT_TO(importer)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) {
     switch (kind) {
       case Snapshot::kFullAOT:
@@ -2483,18 +2531,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeArguments);
 
-  VISIT_FROM(CompressedObjectPtr, instantiations)
   // The instantiations_ array remains empty for instantiated type arguments.
   // Of 3-tuple: 2 instantiators, result.
   COMPRESSED_POINTER_FIELD(ArrayPtr, instantiations)
+  VISIT_FROM(instantiations)
   COMPRESSED_SMI_FIELD(SmiPtr, length)
   COMPRESSED_SMI_FIELD(SmiPtr, hash)
   COMPRESSED_SMI_FIELD(SmiPtr, nullability)
   // Variable length data follows here.
   COMPRESSED_VARIABLE_POINTER_FIELDS(AbstractTypePtr, element, types)
-  CompressedObjectPtr* to(intptr_t length) {
-    return reinterpret_cast<CompressedObjectPtr*>(&types()[length - 1]);
-  }
 
   friend class Object;
   friend class SnapshotReader;
@@ -2504,15 +2549,15 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameters);
 
-  VISIT_FROM(CompressedObjectPtr, names)
   // Length of names reflects the number of type parameters.
   COMPRESSED_POINTER_FIELD(ArrayPtr, names)
+  VISIT_FROM(names)
   // flags: isGenericCovariantImpl and (todo) variance.
   COMPRESSED_POINTER_FIELD(ArrayPtr, flags)
   COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, bounds)
   // defaults is the instantiation to bounds (calculated by CFE).
   COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, defaults)
-  VISIT_TO(CompressedObjectPtr, defaults)
+  VISIT_TO(defaults)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Object;
@@ -2534,8 +2579,8 @@
 
   // Accessed from generated code.
   uword type_test_stub_entry_point_;
-  // Must be the last field, since subclasses use it in their VISIT_FROM.
   COMPRESSED_POINTER_FIELD(CodePtr, type_test_stub)
+  VISIT_FROM(type_test_stub)
 
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(AbstractType);
@@ -2548,11 +2593,10 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
 
-  VISIT_FROM(CompressedObjectPtr, type_test_stub)
   COMPRESSED_POINTER_FIELD(SmiPtr, type_class_id)
   COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, arguments)
   COMPRESSED_POINTER_FIELD(SmiPtr, hash)
-  VISIT_TO(CompressedObjectPtr, hash)
+  VISIT_TO(hash)
   uint8_t type_state_;
   uint8_t nullability_;
 
@@ -2566,13 +2610,12 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(FunctionType);
 
-  VISIT_FROM(CompressedObjectPtr, type_test_stub)
   COMPRESSED_POINTER_FIELD(TypeParametersPtr, type_parameters)
   COMPRESSED_POINTER_FIELD(AbstractTypePtr, result_type)
   COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_types)
   COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_names);
   COMPRESSED_POINTER_FIELD(SmiPtr, hash)
-  VISIT_TO(CompressedObjectPtr, hash)
+  VISIT_TO(hash)
   uint32_t packed_fields_;  // Number of parent type args and own parameters.
   uint8_t type_state_;
   uint8_t nullability_;
@@ -2628,9 +2671,8 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeRef);
 
-  VISIT_FROM(CompressedObjectPtr, type_test_stub)
   COMPRESSED_POINTER_FIELD(AbstractTypePtr, type)  // The referenced type.
-  VISIT_TO(CompressedObjectPtr, type)
+  VISIT_TO(type)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
@@ -2638,11 +2680,10 @@
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
 
-  VISIT_FROM(CompressedObjectPtr, type_test_stub)
   COMPRESSED_POINTER_FIELD(SmiPtr, hash)
   // ObjectType if no explicit bound specified.
   COMPRESSED_POINTER_FIELD(AbstractTypePtr, bound)
-  VISIT_TO(CompressedObjectPtr, bound)
+  VISIT_TO(bound)
   ClassIdTagType parameterized_class_id_;  // Or kFunctionCid for function tp.
   uint8_t base_;   // Number of enclosing function type parameters.
   uint8_t index_;  // Keep size in sync with BuildTypeParameterTypeTestStub.
@@ -2670,15 +2711,14 @@
 
   // The following fields are also declared in the Dart source of class
   // _Closure.
-  VISIT_FROM(ObjectPtr, instantiator_type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, instantiator_type_arguments)
+  VISIT_FROM(instantiator_type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, function_type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, delayed_type_arguments)
   POINTER_FIELD(FunctionPtr, function)
   POINTER_FIELD(ContextPtr, context)
   POINTER_FIELD(SmiPtr, hash)
-
-  VISIT_TO(ObjectPtr, hash)
+  VISIT_TO(hash)
 
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
@@ -2747,13 +2787,13 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(String);
 
  protected:
-  VISIT_FROM(CompressedObjectPtr, length)
   COMPRESSED_SMI_FIELD(SmiPtr, length)
-#if !defined(HASH_IN_OBJECT_HEADER)
-  COMPRESSED_SMI_FIELD(SmiPtr, hash)
-  VISIT_TO(CompressedObjectPtr, hash)
+  VISIT_FROM(length)
+#if defined(HASH_IN_OBJECT_HEADER)
+  VISIT_TO(length)
 #else
-  VISIT_TO(CompressedObjectPtr, length)
+  COMPRESSED_SMI_FIELD(SmiPtr, hash)
+  VISIT_TO(hash);
 #endif
 
  private:
@@ -2823,6 +2863,8 @@
   // The length of the view in element sizes (obtainable via
   // [TypedDataBase::ElementSizeInBytes]).
   COMPRESSED_SMI_FIELD(SmiPtr, length);
+  VISIT_FROM(length)
+  VISIT_TO(length)
 
  private:
   friend class UntaggedTypedDataView;
@@ -2841,11 +2883,7 @@
   void RecomputeDataField() { data_ = internal_data(); }
 
  protected:
-  VISIT_FROM(CompressedObjectPtr, length)
-  VISIT_TO_LENGTH(CompressedObjectPtr, &length_)
-
   // Variable length data follows here.
-
   uint8_t* internal_data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
   const uint8_t* internal_data() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
@@ -2916,10 +2954,9 @@
   }
 
  protected:
-  VISIT_FROM(CompressedObjectPtr, length)
   COMPRESSED_POINTER_FIELD(TypedDataBasePtr, typed_data)
   COMPRESSED_SMI_FIELD(SmiPtr, offset_in_bytes)
-  VISIT_TO(CompressedObjectPtr, offset_in_bytes)
+  VISIT_TO(offset_in_bytes)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Api;
@@ -2963,12 +3000,11 @@
 class UntaggedArray : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Array);
 
-  VISIT_FROM(ObjectPtr, type_arguments)
   ARRAY_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_FROM(type_arguments)
   SMI_FIELD(SmiPtr, length)
   // Variable length data follows here.
   VARIABLE_POINTER_FIELDS(ObjectPtr, element, data)
-  VISIT_TO_LENGTH(ObjectPtr, &data()[length - 1])
 
   friend class LinkedHashMapSerializationCluster;
   friend class LinkedHashMapDeserializationCluster;
@@ -2999,11 +3035,11 @@
 class UntaggedGrowableObjectArray : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(GrowableObjectArray);
 
-  VISIT_FROM(ObjectPtr, type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_FROM(type_arguments)
   SMI_FIELD(SmiPtr, length)
   POINTER_FIELD(ArrayPtr, data)
-  VISIT_TO(ObjectPtr, data)
+  VISIT_TO(data)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class SnapshotReader;
@@ -3013,14 +3049,14 @@
 class UntaggedLinkedHashMap : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(LinkedHashMap);
 
-  VISIT_FROM(ObjectPtr, type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, type_arguments)
+  VISIT_FROM(type_arguments)
   POINTER_FIELD(TypedDataPtr, index)
   POINTER_FIELD(SmiPtr, hash_mask)
   POINTER_FIELD(ArrayPtr, data)
   POINTER_FIELD(SmiPtr, used_data)
   POINTER_FIELD(SmiPtr, deleted_keys)
-  VISIT_TO(ObjectPtr, deleted_keys)
+  VISIT_TO(deleted_keys)
 
   friend class SnapshotReader;
 };
@@ -3094,18 +3130,14 @@
 
 class UntaggedExternalTypedData : public UntaggedTypedDataBase {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTypedData);
-
- protected:
-  VISIT_FROM(CompressedObjectPtr, length)
-  VISIT_TO(CompressedObjectPtr, length)
 };
 
 class UntaggedPointer : public UntaggedPointerBase {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Pointer);
 
-  VISIT_FROM(CompressedObjectPtr, type_arguments)
   COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_arguments)
-  VISIT_TO(CompressedObjectPtr, type_arguments)
+  VISIT_FROM(type_arguments)
+  VISIT_TO(type_arguments)
 
   friend class Pointer;
 };
@@ -3137,15 +3169,15 @@
 class UntaggedReceivePort : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ReceivePort);
 
-  VISIT_FROM(CompressedObjectPtr, send_port)
   COMPRESSED_POINTER_FIELD(SendPortPtr, send_port)
+  VISIT_FROM(send_port)
   COMPRESSED_POINTER_FIELD(InstancePtr, handler)
-#if !defined(PRODUCT)
+#if defined(PRODUCT)
+  VISIT_TO(handler)
+#else
   COMPRESSED_POINTER_FIELD(StringPtr, debug_name)
   COMPRESSED_POINTER_FIELD(StackTracePtr, allocation_location)
-  VISIT_TO(CompressedObjectPtr, allocation_location)
-#else
-  VISIT_TO(CompressedObjectPtr, handler)
+  VISIT_TO(allocation_location)
 #endif  // !defined(PRODUCT)
 };
 
@@ -3161,15 +3193,15 @@
 class UntaggedStackTrace : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(StackTrace);
 
-  VISIT_FROM(CompressedObjectPtr, async_link)
   // Link to parent async stack trace.
   COMPRESSED_POINTER_FIELD(StackTracePtr, async_link);
+  VISIT_FROM(async_link)
   // Code object for each frame in the stack trace.
   COMPRESSED_POINTER_FIELD(ArrayPtr, code_array);
   // Offset of PC for each frame.
   COMPRESSED_POINTER_FIELD(TypedDataPtr, pc_offset_array);
 
-  VISIT_TO(CompressedObjectPtr, pc_offset_array)
+  VISIT_TO(pc_offset_array)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // False for pre-allocated stack trace (used in OOM and Stack overflow).
@@ -3184,8 +3216,8 @@
 class UntaggedRegExp : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(RegExp);
 
-  VISIT_FROM(CompressedObjectPtr, capture_name_map)
   COMPRESSED_POINTER_FIELD(ArrayPtr, capture_name_map)
+  VISIT_FROM(capture_name_map)
   // Pattern to be used for matching.
   COMPRESSED_POINTER_FIELD(StringPtr, pattern)
   COMPRESSED_POINTER_FIELD(ObjectPtr, one_byte)  // FunctionPtr or TypedDataPtr
@@ -3196,7 +3228,7 @@
   COMPRESSED_POINTER_FIELD(ObjectPtr, two_byte_sticky)
   COMPRESSED_POINTER_FIELD(ObjectPtr, external_one_byte_sticky)
   COMPRESSED_POINTER_FIELD(ObjectPtr, external_two_byte_sticky)
-  VISIT_TO(CompressedObjectPtr, external_two_byte_sticky)
+  VISIT_TO(external_two_byte_sticky)
   CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   intptr_t num_bracket_expressions_;
@@ -3218,10 +3250,10 @@
 class UntaggedWeakProperty : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(WeakProperty);
 
-  VISIT_FROM(ObjectPtr, key)
   POINTER_FIELD(ObjectPtr, key)
+  VISIT_FROM(key)
   POINTER_FIELD(ObjectPtr, value)
-  VISIT_TO(ObjectPtr, value)
+  VISIT_TO(value)
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Linked list is chaining all pending weak properties. Not visited by
@@ -3241,18 +3273,18 @@
 class UntaggedMirrorReference : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MirrorReference);
 
-  VISIT_FROM(CompressedObjectPtr, referent)
   COMPRESSED_POINTER_FIELD(ObjectPtr, referent)
-  VISIT_TO(CompressedObjectPtr, referent)
+  VISIT_FROM(referent)
+  VISIT_TO(referent)
 };
 
 // UserTag are used by the profiler to track Dart script state.
 class UntaggedUserTag : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(UserTag);
 
-  VISIT_FROM(CompressedObjectPtr, label)
   COMPRESSED_POINTER_FIELD(StringPtr, label)
-  VISIT_TO(CompressedObjectPtr, label)
+  VISIT_FROM(label)
+  VISIT_TO(label)
 
   // Isolate unique tag.
   uword tag_;
@@ -3267,9 +3299,9 @@
 class UntaggedFutureOr : public UntaggedInstance {
   RAW_HEAP_OBJECT_IMPLEMENTATION(FutureOr);
 
-  VISIT_FROM(ObjectPtr, type_arguments)
   POINTER_FIELD(TypeArgumentsPtr, type_arguments)
-  VISIT_TO(ObjectPtr, type_arguments)
+  VISIT_FROM(type_arguments)
+  VISIT_TO(type_arguments)
 
   friend class SnapshotReader;
 };
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 606d930..6617eec 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -745,7 +745,7 @@
   // constant.
   Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
   obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(), Heap::kNew,
-                          /*compressed*/ false);
+                          Instance::ContainsCompressedPointers());
   if (UntaggedObject::IsCanonical(tags)) {
     obj = obj.Canonicalize(reader->thread());
   }
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 582e207..790050c 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -5,6 +5,7 @@
 #ifndef RUNTIME_VM_TAGGED_POINTER_H_
 #define RUNTIME_VM_TAGGED_POINTER_H_
 
+#include <type_traits>
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/class_id.h"
@@ -218,6 +219,22 @@
 }
 #endif
 
+template <typename T, typename Enable = void>
+struct is_uncompressed_ptr : std::false_type {};
+template <typename T>
+struct is_uncompressed_ptr<
+    T,
+    typename std::enable_if<std::is_base_of<ObjectPtr, T>::value, void>::type>
+    : std::true_type {};
+template <typename T, typename Enable = void>
+struct is_compressed_ptr : std::false_type {};
+
+template <typename T, typename Enable = void>
+struct base_ptr_type {
+  using type =
+      typename std::enable_if<is_uncompressed_ptr<T>::value, ObjectPtr>::type;
+};
+
 #if !defined(DART_COMPRESSED_POINTERS)
 typedef ObjectPtr CompressedObjectPtr;
 #define DEFINE_COMPRESSED_POINTER(klass, base)                                 \
@@ -247,6 +264,20 @@
  protected:
   uint32_t compressed_pointer_;
 };
+
+template <typename T>
+struct is_compressed_ptr<
+    T,
+    typename std::enable_if<std::is_base_of<CompressedObjectPtr, T>::value,
+                            void>::type> : std::true_type {};
+template <typename T>
+struct base_ptr_type<
+    T,
+    typename std::enable_if<std::is_base_of<CompressedObjectPtr, T>::value,
+                            void>::type> {
+  using type = CompressedObjectPtr;
+};
+
 #define DEFINE_COMPRESSED_POINTER(klass, base)                                 \
   class Compressed##klass##Ptr : public Compressed##base##Ptr {                \
    public:                                                                     \
diff --git a/tools/VERSION b/tools/VERSION
index 195dc9c..f7875ea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 110
+PRERELEASE 111
 PRERELEASE_PATCH 0
\ No newline at end of file
