Version 2.11.0-236.0.dev

Merge commit 'c003c1a64dbcce0102182d271c3c92ea34a20779' into 'dev'
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 924f983..13a6e34 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 0.40.5-dev
 * Deprecated `GenericTypeAliasElement`. Use `FunctionTypeAliasElement`.
+* Read imports, exports, and parts on demand in `AnalysisDriver`.
+  Specifically, `parseFileSync` will not read any referenced files.
 
 ## 0.40.4
 * Deprecated `IndexExpression.auxiliaryElements` and
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 2524193..00d6c6f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -192,23 +192,54 @@
 
   /// Return the set of all directly referenced files - imported, exported or
   /// parted.
-  Set<FileState> get directReferencedFiles => _directReferencedFiles;
+  Set<FileState> get directReferencedFiles {
+    return _directReferencedFiles ??= <FileState>{
+      ...importedFiles,
+      ...exportedFiles,
+      ...partedFiles,
+    };
+  }
 
   /// Return the set of all directly referenced libraries - imported or
   /// exported.
-  Set<FileState> get directReferencedLibraries => _directReferencedLibraries;
+  Set<FileState> get directReferencedLibraries {
+    return _directReferencedLibraries ??= <FileState>{
+      ...importedFiles,
+      ...exportedFiles,
+    };
+  }
 
   /// Return `true` if the file exists.
   bool get exists => _exists;
 
   /// The list of files this file exports.
-  List<FileState> get exportedFiles => _exportedFiles;
+  List<FileState> get exportedFiles {
+    if (_exportedFiles == null) {
+      _exportedFiles = <FileState>[];
+      for (var directive in _unlinked2.exports) {
+        var uri = _selectRelativeUri(directive);
+        var file = _fileForRelativeUri(uri);
+        _exportedFiles.add(file);
+      }
+    }
+    return _exportedFiles;
+  }
 
   @override
   int get hashCode => uri.hashCode;
 
   /// The list of files this file imports.
-  List<FileState> get importedFiles => _importedFiles;
+  List<FileState> get importedFiles {
+    if (_importedFiles == null) {
+      _importedFiles = <FileState>[];
+      for (var directive in _unlinked2.imports) {
+        var uri = _selectRelativeUri(directive);
+        var file = _fileForRelativeUri(uri);
+        _importedFiles.add(file);
+      }
+    }
+    return _importedFiles;
+  }
 
   LibraryCycle get internal_libraryCycle => _libraryCycle;
 
@@ -237,6 +268,7 @@
   /// of. Return `null` if a library is not known, for example because we have
   /// not processed a library file yet.
   FileState get library {
+    _fsState.readPartsForLibraries();
     List<FileState> libraries = _fsState._partToLibraries[this];
     if (libraries == null || libraries.isEmpty) {
       return null;
@@ -264,13 +296,27 @@
 
   /// The list of files files that this library consists of, i.e. this library
   /// file itself and its [partedFiles].
-  List<FileState> get libraryFiles => _libraryFiles;
+  List<FileState> get libraryFiles {
+    return _libraryFiles ??= [this, ...partedFiles];
+  }
 
   /// Return information about line in the file.
   LineInfo get lineInfo => _lineInfo;
 
   /// The list of files this library file references as parts.
-  List<FileState> get partedFiles => _partedFiles;
+  List<FileState> get partedFiles {
+    if (_partedFiles == null) {
+      _partedFiles = <FileState>[];
+      for (var uri in _unlinked2.parts) {
+        var file = _fileForRelativeUri(uri);
+        _partedFiles.add(file);
+        _fsState._partToLibraries
+            .putIfAbsent(file, () => <FileState>[])
+            .add(this);
+      }
+    }
+    return _partedFiles;
+  }
 
   /// The external names referenced by the file.
   Set<String> get referencedNames {
@@ -287,7 +333,7 @@
 
     void appendReferenced(FileState file) {
       if (transitiveFiles.add(file)) {
-        file._directReferencedFiles?.forEach(appendReferenced);
+        file.directReferencedFiles.forEach(appendReferenced);
       }
     }
 
@@ -436,39 +482,16 @@
       }
     }
 
-    // Build the graph.
-    _importedFiles = <FileState>[];
-    _exportedFiles = <FileState>[];
-    _partedFiles = <FileState>[];
-    for (var directive in _unlinked2.imports) {
-      var uri = _selectRelativeUri(directive);
-      var file = _fileForRelativeUri(uri);
-      _importedFiles.add(file);
-    }
-    for (var directive in _unlinked2.exports) {
-      var uri = _selectRelativeUri(directive);
-      var file = _fileForRelativeUri(uri);
-      _exportedFiles.add(file);
-    }
-    for (var uri in _unlinked2.parts) {
-      var file = _fileForRelativeUri(uri);
-      _partedFiles.add(file);
-      _fsState._partToLibraries
-          .putIfAbsent(file, () => <FileState>[])
-          .add(this);
-    }
-    _libraryFiles = [this, ..._partedFiles];
+    // Read imports/exports on demand.
+    _importedFiles = null;
+    _exportedFiles = null;
+    _directReferencedFiles = null;
+    _directReferencedLibraries = null;
 
-    // Compute referenced files.
-    _directReferencedFiles = <FileState>{
-      ..._importedFiles,
-      ..._exportedFiles,
-      ..._partedFiles,
-    };
-    _directReferencedLibraries = <FileState>{
-      ..._importedFiles,
-      ..._exportedFiles,
-    };
+    // Read parts on demand.
+    _fsState._librariesWithoutPartsRead.add(this);
+    _partedFiles = null;
+    _libraryFiles = null;
 
     // Update mapping from subtyped names to files.
     for (var name in _driverUnlinkedUnit.subtypedNames) {
@@ -748,6 +771,11 @@
   /// Mapping from a path to the corresponding canonical [FileState].
   final Map<String, FileState> _pathToCanonicalFile = {};
 
+  /// We don't read parts until requested, but if we need to know the
+  /// library for a file, we need to read parts of every file to know
+  /// which libraries reference this part.
+  final List<FileState> _librariesWithoutPartsRead = [];
+
   /// Mapping from a part to the libraries it is a part of.
   final Map<FileState, List<FileState>> _partToLibraries = {};
 
@@ -950,6 +978,19 @@
     _fileContentCache.remove(path);
   }
 
+  void readPartsForLibraries() {
+    // Make a copy, because reading new files will update it.
+    var libraryToProcess = _librariesWithoutPartsRead.toList();
+
+    // We will process these files, so clear it now.
+    // It will be filled with new files during the loop below.
+    _librariesWithoutPartsRead.clear();
+
+    for (var library in libraryToProcess) {
+      library.partedFiles;
+    }
+  }
+
   /// Remove the file with the given [path].
   void removeFile(String path) {
     markFileForReading(path);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 7d59c48..16cf839 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2349,6 +2349,49 @@
     }
   }
 
+  test_parseFileSync_doesNotReadImportedFiles() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: '');
+    newFile(b, content: r'''
+import 'a.dart';
+''');
+
+    expect(driver.fsState.knownFilePaths, isEmpty);
+
+    // Don't read `a.dart` when parse.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+    // Still don't read `a.dart` when parse the second time.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+  }
+
+  test_parseFileSync_doesNotReadPartedFiles() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: r'''
+part of my;
+''');
+    newFile(b, content: r'''
+library my;
+part 'a.dart';
+''');
+
+    expect(driver.fsState.knownFilePaths, isEmpty);
+
+    // Don't read `a.dart` when parse.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+
+    // Still don't read `a.dart` when parse the second time.
+    driver.parseFileSync(b);
+    expect(driver.fsState.knownFilePaths, unorderedEquals([b]));
+  }
+
   test_parseFileSync_languageVersion() async {
     var path = convertPath('/test/lib/test.dart');
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 3e86667..1115b86 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/analysis/context_locator.dart' as api;
 import 'package:analyzer/dart/sdk/build_sdk_summary.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
@@ -27,6 +28,8 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/manifest/manifest_validator.dart';
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
@@ -284,6 +287,7 @@
             }
           }
         } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
+          var errors = <AnalysisError>[];
           try {
             var file = resourceProvider.getFile(path);
             var content = file.readAsStringSync();
@@ -291,17 +295,46 @@
             if (node is YamlMap) {
               var validator =
                   PubspecValidator(resourceProvider, file.createSource());
-              var lineInfo = LineInfo.fromContent(content);
-              var errors = validator.validate(node.nodes);
-              formatter.formatErrors([
-                ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                    lineInfo, false, errors)
-              ]);
+              errors.addAll(validator.validate(node.nodes));
+            }
+
+            if (analysisDriver != null && analysisDriver.analysisOptions.lint) {
+              var visitors = <LintRule, PubspecVisitor>{};
+              for (var linter in analysisDriver.analysisOptions.lintRules) {
+                if (linter is LintRule) {
+                  var visitor = linter.getPubspecVisitor();
+                  if (visitor != null) {
+                    visitors[linter] = visitor;
+                  }
+                }
+              }
+              if (visitors.isNotEmpty) {
+                var sourceUri = resourceProvider.pathContext.toUri(path);
+                var pubspecAst = Pubspec.parse(content,
+                    sourceUrl: sourceUri, resourceProvider: resourceProvider);
+                var listener = RecordingErrorListener();
+                var reporter = ErrorReporter(listener,
+                    resourceProvider.getFile(path).createSource(sourceUri),
+                    isNonNullableByDefault: false);
+                for (var entry in visitors.entries) {
+                  entry.key.reporter = reporter;
+                  pubspecAst.accept(entry.value);
+                }
+                errors.addAll(listener.errors);
+              }
+            }
+
+            if (errors.isNotEmpty) {
               for (var error in errors) {
                 var severity = determineProcessedSeverity(
                     error, options, analysisDriver.analysisOptions);
                 allResult = allResult.max(severity);
               }
+              var lineInfo = LineInfo.fromContent(content);
+              formatter.formatErrors([
+                ErrorsResultImpl(analysisDriver.currentSession, path, null,
+                    lineInfo, false, errors)
+              ]);
             }
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
diff --git a/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml b/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
index 6af57a5..50bbbb0 100644
--- a/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
+++ b/pkg/analyzer_cli/test/data/linter_project/analysis_options.yaml
@@ -1,3 +1,4 @@
 linter:
   rules:
     - camel_case_types
+    - sort_pub_dependencies
diff --git a/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml b/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml
new file mode 100644
index 0000000..132fb58
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/linter_project/pubspec.yaml
@@ -0,0 +1,5 @@
+name: linter_project
+
+dependencies:
+  test: any
+  async: any
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index ffd85a2..45d42ab 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -863,9 +863,10 @@
     /// Lints should be enabled.
     expect(analysisOptions.lint, isTrue);
 
-    /// The analysis options file only specifies 'camel_case_types'.
+    /// The analysis options file specifies 'camel_case_types' and 'sort_pub_dependencies'.
     var lintNames = analysisOptions.lintRules.map((r) => r.name);
-    expect(lintNames, orderedEquals(['camel_case_types']));
+    expect(lintNames,
+        orderedEquals(['camel_case_types', 'sort_pub_dependencies']));
   }
 
   Future<void> test_noLints_lintsDisabled() async {
@@ -883,6 +884,12 @@
     expect(analysisOptions.lintRules, isEmpty);
   }
 
+  Future<void> test_pubspec_lintsInOptions_generatedLints() async {
+    await drive('data/linter_project/pubspec.yaml',
+        options: 'data/linter_project/$optionsFileName');
+    expect(bulletToDash(outSink), contains('lint - Sort pub dependencies'));
+  }
+
   YamlMap _parseOptions(String src) =>
       AnalysisOptionsProvider().getOptionsFromString(src);
 
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index 7552c3c..bf0eb6a 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1554,8 +1554,10 @@
 
   __ Bind(&use_declaration_type);
   __ LoadClassById(R2, R1);
-  __ ldr(R3, FieldAddress(R2, target::Class::num_type_arguments_offset()),
-         kHalfword);
+  __ ldr(
+      R3,
+      FieldAddress(R2, target::Class::num_type_arguments_offset(), kHalfword),
+      kHalfword);
   __ CompareImmediate(R3, 0);
   __ b(normal_ir_body, NE);
 
@@ -1594,7 +1596,8 @@
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
   __ ldr(scratch,
-         FieldAddress(scratch, target::Class::num_type_arguments_offset()),
+         FieldAddress(scratch, target::Class::num_type_arguments_offset(),
+                      kHalfword),
          kHalfword);
   __ cbnz(normal_ir_body, scratch);
   __ b(equal);
@@ -1693,9 +1696,9 @@
 
   // Check nullability.
   __ Bind(&equiv_cids);
-  __ ldr(R1, FieldAddress(R1, target::Type::nullability_offset()),
+  __ ldr(R1, FieldAddress(R1, target::Type::nullability_offset(), kByte),
          kUnsignedByte);
-  __ ldr(R2, FieldAddress(R2, target::Type::nullability_offset()),
+  __ ldr(R2, FieldAddress(R2, target::Type::nullability_offset(), kByte),
          kUnsignedByte);
   __ cmp(R1, Operand(R2));
   __ b(&check_legacy, NE);
@@ -1703,7 +1706,7 @@
 
   __ Bind(&equal);
   __ LoadObject(R0, CastHandle<Object>(TrueObject()));
-  __ Ret();
+  __ ret();
 
   // At this point the nullabilities are different, so they can only be
   // syntactically equivalent if they're both either kNonNullable or kLegacy.
@@ -1726,7 +1729,8 @@
 void AsmIntrinsifier::Object_getHash(Assembler* assembler,
                                      Label* normal_ir_body) {
   __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::String::hash_offset()), kUnsignedWord);
+  __ ldr(R0, FieldAddress(R0, target::String::hash_offset(), kWord),
+         kUnsignedWord);
   __ SmiTag(R0);
   __ ret();
 }
@@ -1736,7 +1740,8 @@
   __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Object.
   __ ldr(R1, Address(SP, 0 * target::kWordSize));  // Value.
   __ SmiUntag(R1);
-  __ str(R1, FieldAddress(R0, target::String::hash_offset()), kUnsignedWord);
+  __ str(R1, FieldAddress(R0, target::String::hash_offset(), kWord),
+         kUnsignedWord);
   __ ret();
 }
 
@@ -2096,7 +2101,7 @@
   __ AddImmediate(R6, 1);
   __ sub(R2, R2, Operand(1));
   __ cmp(R2, Operand(0));
-  __ str(R1, FieldAddress(R7, target::OneByteString::data_offset()),
+  __ str(R1, FieldAddress(R7, target::OneByteString::data_offset(), kByte),
          kUnsignedByte);
   __ AddImmediate(R7, 1);
   __ b(&loop, GT);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 4699f5d..9e3c425 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -987,8 +987,10 @@
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
-  ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
+  ldr(TMP2, FieldAddress(value, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   and_(TMP, TMP2,
        Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
@@ -1049,8 +1051,10 @@
   if (can_be_smi == kValueCanBeSmi) {
     BranchIfSmi(value, &done);
   }
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
-  ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
+  ldr(TMP2, FieldAddress(value, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   and_(TMP, TMP2,
        Operand(TMP, LSR, target::ObjectLayout::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
@@ -1077,7 +1081,8 @@
   Label done;
   StoreIntoObjectFilter(object, value, &done, kValueCanBeSmi, kJumpToNoUpdate);
 
-  ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
+  ldr(TMP, FieldAddress(object, target::Object::tags_offset(), kByte),
+      kUnsignedByte);
   tsti(TMP, Immediate(1 << target::ObjectLayout::kOldAndNotRememberedBit));
   b(&done, ZERO);
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index c9bd624..b60f259 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -94,12 +94,14 @@
       : ValueObject(),
         encoding_(other.encoding_),
         type_(other.type_),
-        base_(other.base_) {}
+        base_(other.base_),
+        log2sz_(other.log2sz_) {}
 
   Address& operator=(const Address& other) {
     encoding_ = other.encoding_;
     type_ = other.type_;
     base_ = other.base_;
+    log2sz_ = other.log2sz_;
     return *this;
   }
 
@@ -136,11 +138,15 @@
           OperandSize sz = kDoubleWord) {
     ASSERT((rn != kNoRegister) && (rn != R31) && (rn != ZR));
     ASSERT(CanHoldOffset(offset, at, sz));
+    log2sz_ = -1;
     const int32_t scale = Log2OperandSizeBytes(sz);
     if ((at == Offset) && Utils::IsUint(12 + scale, offset) &&
         (offset == ((offset >> scale) << scale))) {
       encoding_ =
           B24 | ((offset >> scale) << kImm12Shift) | Arm64Encode::Rn(rn);
+      if (offset != 0) {
+        log2sz_ = scale;
+      }
     } else if ((at == Offset) && Utils::IsInt(9, offset)) {
       encoding_ = ((offset & 0x1ff) << kImm9Shift) | Arm64Encode::Rn(rn);
     } else if ((at == PreIndex) || (at == PostIndex)) {
@@ -172,6 +178,9 @@
           idx |
           ((static_cast<uint32_t>(offset >> scale) << kImm7Shift) & kImm7Mask) |
           Arm64Encode::Rn(rn);
+      if (offset != 0) {
+        log2sz_ = scale;
+      }
     }
     type_ = at;
     base_ = ConcreteRegister(rn);
@@ -214,6 +223,7 @@
     addr.encoding_ = (((pc_off >> 2) << kImm19Shift) & kImm19Mask);
     addr.base_ = kNoRegister;
     addr.type_ = PCOffset;
+    addr.log2sz_ = -1;
     return addr;
   }
 
@@ -249,6 +259,7 @@
                 (static_cast<int32_t>(ext) << kExtendTypeShift);
     type_ = Reg;
     base_ = ConcreteRegister(rn);
+    log2sz_ = -1;  // Any.
   }
 
   static OperandSize OperandSizeFor(intptr_t cid) {
@@ -307,6 +318,7 @@
   uint32_t encoding_;
   AddressType type_;
   Register base_;
+  int32_t log2sz_;  // Required log2 of operand size (-1 means any).
 
   friend class Assembler;
 };
@@ -517,7 +529,8 @@
   }
 
   void CompareTypeNullabilityWith(Register type, int8_t value) {
-    ldr(TMP, FieldAddress(type, compiler::target::Type::nullability_offset()),
+    ldr(TMP,
+        FieldAddress(type, compiler::target::Type::nullability_offset(), kByte),
         kUnsignedByte);
     cmp(TMP, Operand(value));
   }
@@ -2244,6 +2257,7 @@
     ASSERT((op != LDR && op != STR && op != LDRS) || a.can_writeback_to(rt));
 
     const int32_t size = Log2OperandSizeBytes(sz);
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == size);
     const int32_t encoding =
         op | ((size & 0x3) << kSzShift) | Arm64Encode::Rt(rt) | a.encoding();
     Emit(encoding);
@@ -2254,6 +2268,7 @@
                           Address a,
                           OperandSize sz) {
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == Log2OperandSizeBytes(sz));
     ASSERT((rt != CSP) && (rt != R31));
     const int32_t size = (sz == kDoubleWord) ? B30 : 0;
     const int32_t encoding = op | size | Arm64Encode::Rt(rt) | a.encoding();
@@ -2270,6 +2285,7 @@
     ASSERT(op != LDP || rt != rt2);
 
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == Log2OperandSizeBytes(sz));
     ASSERT((rt != CSP) && (rt != R31));
     ASSERT((rt2 != CSP) && (rt2 != R31));
     int32_t opc = 0;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index cfd814a..7ab2f6d 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1407,7 +1407,7 @@
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   __ LoadFieldFromOffset(result, str, String::length_offset());
-  __ ldr(TMP, compiler::FieldAddress(str, OneByteString::data_offset()),
+  __ ldr(TMP, compiler::FieldAddress(str, OneByteString::data_offset(), kByte),
          kUnsignedByte);
   __ CompareImmediate(result, Smi::RawValue(1));
   __ LoadImmediate(result, -1);
@@ -4123,7 +4123,8 @@
   compiler::Label done;
   __ SmiUntag(result, value);
   __ BranchIfSmi(value, &done);
-  __ ldr(result, compiler::FieldAddress(value, Mint::value_offset()), kWord);
+  __ ldr(result, compiler::FieldAddress(value, Mint::value_offset(), kWord),
+         kWord);
   __ LoadFieldFromOffset(result, value, Mint::value_offset());
   __ Bind(&done);
 }
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 84c1a04..488da1a 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -1812,7 +1812,7 @@
     Label slow_case;
 
     // Load num. variable (int32) in the existing context.
-    __ ldr(R1, FieldAddress(R5, target::Context::num_variables_offset()),
+    __ ldr(R1, FieldAddress(R5, target::Context::num_variables_offset(), kWord),
            kWord);
 
     GenerateAllocateContextSpaceStub(assembler, &slow_case);
@@ -3461,10 +3461,10 @@
   __ BranchIf(NOT_EQUAL, &is_complex_case);
 
   // Check whether this [Type] is instantiated/uninstantiated.
-  __ ldr(
-      kTmp,
-      FieldAddress(TypeTestABI::kDstTypeReg, target::Type::type_state_offset()),
-      kByte);
+  __ ldr(kTmp,
+         FieldAddress(TypeTestABI::kDstTypeReg,
+                      target::Type::type_state_offset(), kByte),
+         kByte);
   __ cmp(kTmp,
          Operand(target::AbstractTypeLayout::kTypeStateFinalizedInstantiated));
   __ BranchIf(NOT_EQUAL, &is_complex_case);
@@ -3923,9 +3923,13 @@
 void StubCodeCompiler::GenerateSingleTargetCallStub(Assembler* assembler) {
   Label miss;
   __ LoadClassIdMayBeSmi(R1, R0);
-  __ ldr(R2, FieldAddress(R5, target::SingleTargetCache::lower_limit_offset()),
+  __ ldr(R2,
+         FieldAddress(R5, target::SingleTargetCache::lower_limit_offset(),
+                      kHalfword),
          kUnsignedHalfword);
-  __ ldr(R3, FieldAddress(R5, target::SingleTargetCache::upper_limit_offset()),
+  __ ldr(R3,
+         FieldAddress(R5, target::SingleTargetCache::upper_limit_offset(),
+                      kHalfword),
          kUnsignedHalfword);
 
   __ cmp(R1, Operand(R2));
diff --git a/tools/VERSION b/tools/VERSION
index 31c1251..0168c17 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 235
+PRERELEASE 236
 PRERELEASE_PATCH 0
\ No newline at end of file