Version 2.11.0-229.0.dev

Merge commit '3191b4599878f793616c72cec2fb9cf479e6f5a0' into 'dev'
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
index 2a3bf26..c1e27d7 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.outline.expect
@@ -14,7 +14,7 @@
   field ffi::Pointer<self::Coordinate*>* next;
   static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate*
     ;
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.expect
@@ -20,7 +20,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect
@@ -8,9 +8,10 @@
 import "package:ffi/ffi.dart";
 
 @#C3
+@#C8
 class Coordinate extends ffi::Struct {
   @#C3
-  static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+  static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
   @#C3
   constructor #fromPointer(dynamic #pointer) → dynamic
     : super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
 }
 static method main() → dynamic {}
 
@@ -52,13 +53,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(ffi::Double)
+  #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+  #C7 = <core::Type>[#C5, #C5, #C6]
+  #C8 = core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
index 0e669c0..a853421 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.expect
@@ -20,7 +20,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
index c402dca..324ae5f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ffi_sample.dart.weak.transformed.expect
@@ -8,9 +8,10 @@
 import "package:ffi/ffi.dart";
 
 @#C3
+@#C8
 class Coordinate extends ffi::Struct {
   @#C3
-  static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
+  static final field core::int* #sizeOf = (#C11).{core::List::[]}(ffi::_abi());
   @#C3
   constructor #fromPointer(dynamic #pointer) → dynamic
     : super ffi::Struct::_fromPointer(#pointer)
@@ -22,7 +23,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
+  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -34,17 +35,17 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C13).{core::List::[]}(ffi::_abi()), #v);
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
 }
 static method main() → dynamic {}
 
@@ -52,13 +53,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(ffi::Double)
+  #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
+  #C7 = <core::Type>[#C5, #C5, #C6]
+  #C8 = core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
index 07b6c80..0fc8261 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.1.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
index c592dbf..4926750 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_01.yaml.world.2.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -58,13 +59,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
index fae41df..afc46dc 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/ffi_02.yaml.world.1.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
index 07b6c80..0fc8261 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.1.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -54,13 +55,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
index 879c497..b4e9544 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.2.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -14,7 +15,7 @@
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +27,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -55,13 +56,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
index c31f270..3c5ae83 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_35.yaml.world.3.expect
@@ -4,9 +4,10 @@
   import "dart:ffi";
 
   @#C3
+  @#C8
   class Coordinate extends dart.ffi::Struct {
     @#C3
-    static final field dart.core::int* #sizeOf = (#C6).{dart.core::List::[]}(dart.ffi::_abi());
+    static final field dart.core::int* #sizeOf = (#C11).{dart.core::List::[]}(dart.ffi::_abi());
     @#C3
     constructor #fromPointer(dynamic #pointer) → dynamic
       : super dart.ffi::Struct::_fromPointer(#pointer)
@@ -15,7 +16,7 @@
       dart.core::print("hello");
       return null;
     }
-    abstract member-signature get _addressOf() → dart.ffi::Pointer<dart.ffi::Struct*>*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -27,17 +28,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C8).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -56,13 +57,18 @@
   #C1 = "vm:entry-point"
   #C2 = null
   #C3 = dart.core::pragma {name:#C1, options:#C2}
-  #C4 = 24
-  #C5 = 20
-  #C6 = <dart.core::int*>[#C4, #C5, #C4]
-  #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
-  #C9 = 8
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
-  #C11 = 16
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C4 = "vm:ffi:struct-fields"
+  #C5 = TypeLiteralConstant(dart.ffi::Double)
+  #C6 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C7 = <dart.core::Type>[#C5, #C5, #C6]
+  #C8 = dart.core::pragma {name:#C4, options:#C7}
+  #C9 = 24
+  #C10 = 20
+  #C11 = <dart.core::int*>[#C9, #C10, #C9]
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 8
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = 16
+  #C17 = <dart.core::int*>[#C16, #C16, #C16]
 }
diff --git a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
index c96a472..bed1d87 100644
--- a/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/non_nullable_fix.dart
@@ -124,8 +124,8 @@
 
   /// Processes the non-source files of the package rooted at [pkgFolder].
   ///
-  /// This means updating the pubspec.yaml file and the package_config.json
-  /// file, if necessary.
+  /// This means updating the pubspec.yaml file, the package_config.json
+  /// file, and the analysis_options.yaml file, each only if necessary.
   void processPackage(Folder pkgFolder) {
     if (!_packageIsNNBD) {
       return;
@@ -133,13 +133,14 @@
 
     var pubspecFile = pkgFolder.getChildAssumingFile('pubspec.yaml');
     if (!pubspecFile.exists) {
-      // TODO(srawlins): Handle other package types, such as Bazel.
+      // If the pubspec file cannot be found, we do not attempt to change the
+      // Package Config file, nor the analysis options file.
       return;
     }
 
-    _Pubspec pubspec;
+    _YamlFile pubspec;
     try {
-      pubspec = _Pubspec.parseFrom(pubspecFile);
+      pubspec = _YamlFile._parseFrom(pubspecFile);
     } on FileSystemException catch (e) {
       _processPubspecException('read', pubspecFile.path, e);
       return;
@@ -149,10 +150,12 @@
     }
 
     var updated = _processPubspec(pubspec);
-
     if (updated) {
       _processConfigFile(pkgFolder, pubspec);
     }
+    // TODO(https://github.com/dart-lang/sdk/issues/43806): stop processing
+    // analysis options file when the experiment is no longer needed.
+    _processAnalysisOptionsFile(pkgFolder);
   }
 
   Future<void> processUnit(ResolvedUnitResult result) async {
@@ -209,15 +212,102 @@
     }
   }
 
+  void _processAnalysisOptionsException(
+      String action, String analysisOptionsPath, error) {
+    listener.addRecommendation('''Failed to $action analysis options file
+  $analysisOptionsPath
+  $error
+
+  Manually update this file to enable the Null Safety language feature in static
+  analysis by adding:
+
+    analyzer:
+      enable-experiment:
+        - non-nullable
+''');
+  }
+
+  void _processAnalysisOptionsFile(Folder pkgFolder) {
+    var analysisOptionsFile =
+        pkgFolder.getChildAssumingFile('analysis_options.yaml');
+    if (!analysisOptionsFile.exists) {
+      // A source file edit cannot be made for a file which doesn't exist.
+      // Instead of using the fix listener, just write the file directly.
+      analysisOptionsFile.writeAsStringSync('''
+analyzer:
+  enable-experiment:
+    - non-nullable
+
+''');
+      return;
+    }
+
+    _YamlFile analysisOptions;
+    try {
+      analysisOptions = _YamlFile._parseFrom(analysisOptionsFile);
+    } on FileSystemException catch (e) {
+      _processAnalysisOptionsException('read', analysisOptionsFile.path, e);
+      return;
+    } on FormatException catch (e) {
+      _processAnalysisOptionsException('parse', analysisOptionsFile.path, e);
+      return;
+    }
+
+    var analysisOptionsMap = analysisOptions.content;
+    YamlNode analyzerOptions;
+    if (analysisOptionsMap is YamlMap) {
+      analyzerOptions = analysisOptionsMap.nodes['analyzer'];
+    }
+    if (analyzerOptions == null) {
+      // There is no top-level "analyzer" section. We can write one in its
+      // entirety, and use a 2-space indentation. This is a valid indentation,
+      // even if the file contains another top-level section (perhaps "linter")
+      // which uses a different indentation.
+      var start = SourceLocation(0, line: 0, column: 0);
+      var content = '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+
+''';
+      analysisOptions._insertAfterParent(
+          SourceSpan(start, start, ''), content, listener);
+    } else if (analyzerOptions is YamlMap) {
+      var enableExperiment = analyzerOptions.nodes['enable-experiment'];
+      if (enableExperiment == null) {
+        var analyzerIndentation =
+            analysisOptions._getMapEntryIndentation(analyzerOptions);
+        var indent = ' ' * analyzerIndentation;
+        var content = '\n'
+            '${indent}enable-experiment:\n'
+            '$indent  - non-nullable';
+        analysisOptions._insertAfterParent(
+            analyzerOptions.span, content, listener);
+      } else if (enableExperiment is YamlList) {
+        var enableExperimentIndentation =
+            analysisOptions._getListIndentation(enableExperiment);
+        var indent = ' ' * enableExperimentIndentation;
+        var nonNullableIsEnabled = enableExperiment.value
+            .any((experiment) => experiment == 'non-nullable');
+        if (nonNullableIsEnabled) return;
+        var content = '\n' '$indent- non-nullable';
+        analysisOptions._insertAfterParent(
+            enableExperiment.span, content, listener);
+      }
+    }
+  }
+
   /// Updates the Package Config file to specify a minimum Dart SDK version
   /// which supports null safety.
-  void _processConfigFile(Folder pkgFolder, _Pubspec pubspec) {
+  void _processConfigFile(Folder pkgFolder, _YamlFile pubspec) {
     if (!_packageIsNNBD) {
       return;
     }
 
     var packageName = pubspec._getName();
-    if (packageName == null) {}
+    if (packageName == null) {
+      return;
+    }
 
     var packageConfigFile = pkgFolder
         .getChildAssumingFolder('.dart_tool')
@@ -295,41 +385,7 @@
 
   /// Updates the pubspec.yaml file to specify a minimum Dart SDK version which
   /// supports null safety.
-  bool _processPubspec(_Pubspec pubspec) {
-    /// Inserts [content] into [pubspecFile], immediately after [parentSpan].
-    void insertAfterParent(SourceSpan parentSpan, String content) {
-      var line = parentSpan.end.line;
-      var offset = parentSpan.end.offset;
-      // Walk [offset] and [line] back to the first non-whitespace character
-      // before [offset].
-      while (offset > 0) {
-        var ch = pubspec.textContent.codeUnitAt(offset - 1);
-        if (ch == $space || ch == $cr) {
-          --offset;
-        } else if (ch == $lf) {
-          --offset;
-          --line;
-        } else {
-          break;
-        }
-      }
-      var edit = SourceEdit(offset, 0, content);
-      listener.addSourceFileEdit(
-          'enable Null Safety language feature',
-          Location(pubspec.path, offset, content.length, line, 0),
-          SourceFileEdit(pubspec.path, 0, edits: [edit]));
-    }
-
-    void replaceSpan(SourceSpan span, String content) {
-      var line = span.start.line;
-      var offset = span.start.offset;
-      var edit = SourceEdit(offset, span.length, content);
-      listener.addSourceFileEdit(
-          'enable Null Safety language feature',
-          Location(pubspec.path, offset, content.length, line, 0),
-          SourceFileEdit(pubspec.path, 0, edits: [edit]));
-    }
-
+  bool _processPubspec(_YamlFile pubspec) {
     var pubspecMap = pubspec.content;
     YamlNode environmentOptions;
     if (pubspecMap is YamlMap) {
@@ -342,14 +398,15 @@
   sdk: '$_intendedSdkVersionConstraint'
 
 ''';
-      insertAfterParent(SourceSpan(start, start, ''), content);
+      pubspec._insertAfterParent(
+          SourceSpan(start, start, ''), content, listener);
     } else if (environmentOptions is YamlMap) {
       var sdk = environmentOptions.nodes['sdk'];
       if (sdk == null) {
         var content = """
 
   sdk: '$_intendedSdkVersionConstraint'""";
-        insertAfterParent(environmentOptions.span, content);
+        pubspec._insertAfterParent(environmentOptions.span, content, listener);
       } else if (sdk is YamlScalar) {
         VersionConstraint currentConstraint;
         if (sdk.value is String) {
@@ -363,7 +420,8 @@
             // TODO(srawlins): This overwrites the current maximum version. In
             // the uncommon situation that the maximum is not '<3.0.0', it
             // should not.
-            replaceSpan(sdk.span, "'$_intendedSdkVersionConstraint'");
+            pubspec._replaceSpan(
+                sdk.span, "'$_intendedSdkVersionConstraint'", listener);
           }
         } else {
           // Something is odd with the SDK constraint we've found in
@@ -457,22 +515,41 @@
   }
 }
 
-class _Pubspec {
+class _YamlFile {
   final String path;
   final String textContent;
   final YamlNode content;
 
-  factory _Pubspec.parseFrom(File file) {
-    var textContent = file.readAsStringSync();
-    var content = loadYaml(textContent);
-    if (content is YamlNode) {
-      return _Pubspec._(file.path, textContent, content);
-    } else {
-      throw FormatException('pubspec.yaml is not a YAML map.');
-    }
+  _YamlFile._(this.path, this.textContent, this.content);
+
+  /// Returns the indentation of the entries in [node].
+  int _getListIndentation(YamlList node) {
+    return node.span.start.column;
   }
 
-  _Pubspec._(this.path, this.textContent, this.content);
+  static final _newlineCharacter = RegExp('[\r\n]');
+
+  /// Returns the indentation of the first (and presumably all) entry of [node].
+  int _getMapEntryIndentation(YamlMap node) {
+    if (node.isEmpty) return 2;
+
+    var value = node.nodes.values.first;
+    if (value is YamlScalar) {
+      // A YamlScalar value indicates that a "key: value" pair is on a single
+      // line. The span's start column is the start column of the value, not the
+      // key.
+      var offset = value.span.start.offset;
+      var firstSpaceIndex =
+          textContent.lastIndexOf(_newlineCharacter, offset) + 1;
+      var index = firstSpaceIndex;
+      while (textContent.codeUnitAt(index) == $space) {
+        index++;
+      }
+      return index - firstSpaceIndex;
+    } else {
+      return value.span.start.column;
+    }
+  }
 
   String _getName() {
     YamlNode packageNameNode;
@@ -489,4 +566,49 @@
       return null;
     }
   }
+
+  /// Inserts [content] into this file, immediately after [parentSpan].
+  void _insertAfterParent(
+      SourceSpan parentSpan, String content, DartFixListener listener) {
+    var line = parentSpan.end.line;
+    var offset = parentSpan.end.offset;
+    // Walk [offset] and [line] back to the first non-whitespace character
+    // before [offset].
+    while (offset > 0) {
+      var ch = textContent.codeUnitAt(offset - 1);
+      if (ch == $space || ch == $cr) {
+        --offset;
+      } else if (ch == $lf) {
+        --offset;
+        --line;
+      } else {
+        break;
+      }
+    }
+    var edit = SourceEdit(offset, 0, content);
+    listener.addSourceFileEdit(
+        'enable Null Safety language feature',
+        Location(path, offset, content.length, line, 0),
+        SourceFileEdit(path, 0, edits: [edit]));
+  }
+
+  void _replaceSpan(SourceSpan span, String content, DartFixListener listener) {
+    var line = span.start.line;
+    var offset = span.start.offset;
+    var edit = SourceEdit(offset, span.length, content);
+    listener.addSourceFileEdit(
+        'enable Null Safety language feature',
+        Location(path, offset, content.length, line, 0),
+        SourceFileEdit(path, 0, edits: [edit]));
+  }
+
+  static _YamlFile _parseFrom(File file) {
+    var textContent = file.readAsStringSync();
+    var content = loadYaml(textContent);
+    if (content is YamlNode) {
+      return _YamlFile._(file.path, textContent, content);
+    } else {
+      throw FormatException('pubspec.yaml is not a YAML map.');
+    }
+  }
 }
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 42325ee..736ea52 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -421,7 +421,8 @@
       {bool migrated = false,
       String sourceText,
       String pubspecText,
-      String packageConfigText}) {
+      String packageConfigText,
+      String analysisOptionsText}) {
     return {
       'pubspec.yaml': pubspecText ??
           '''
@@ -446,7 +447,9 @@
       'lib/test.dart': sourceText ??
           '''
 int${migrated ? '?' : ''} f() => null;
-'''
+''',
+      if (analysisOptionsText != null)
+        'analysis_options.yaml': analysisOptionsText,
     };
   }
 
@@ -454,6 +457,187 @@
     NonNullableFix.shutdownAllServers();
   }
 
+  test_analysis_options_analyzer_is_missing_enable_experiment() async {
+    var projectContents = simpleProject(analysisOptionsText: '''
+analyzer:
+  foo: 1
+''');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+  foo: 1
+  enable-experiment:
+    - non-nullable
+'''));
+  }
+
+  test_analysis_options_analyzer_is_missing_enable_experiment_big_indent() async {
+    var projectContents = simpleProject(analysisOptionsText: '''
+analyzer:
+      foo: 1
+''');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+      foo: 1
+      enable-experiment:
+        - non-nullable
+'''));
+  }
+
+  test_analysis_options_analyzer_is_not_a_map() async {
+    var analysisOptionsText = '''
+analyzer: 1
+''';
+    var projectContents =
+        simpleProject(analysisOptionsText: analysisOptionsText);
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir,
+        simpleProject(
+            migrated: true, analysisOptionsText: analysisOptionsText));
+  }
+
+  test_analysis_options_does_not_exist() async {
+    var projectContents = simpleProject();
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+
+'''));
+  }
+
+  test_analysis_options_enable_experiment_contains_non_nullable() async {
+    var analysisOptionsText = '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+''';
+    var projectContents =
+        simpleProject(analysisOptionsText: analysisOptionsText);
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir,
+        simpleProject(
+            migrated: true, analysisOptionsText: analysisOptionsText));
+  }
+
+  test_analysis_options_enable_experiment_is_not_list() async {
+    var analysisOptionsText = '''
+analyzer:
+  enable-experiment: 1
+''';
+    var projectContents =
+        simpleProject(analysisOptionsText: analysisOptionsText);
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir,
+        simpleProject(
+            migrated: true, analysisOptionsText: analysisOptionsText));
+  }
+
+  test_analysis_options_enable_experiment_missing_non_nullable() async {
+    var analysisOptionsText = '''
+analyzer:
+  enable-experiment:
+    - foo
+''';
+    var projectContents =
+        simpleProject(analysisOptionsText: analysisOptionsText);
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+  enable-experiment:
+    - foo
+    - non-nullable
+'''));
+  }
+
+  test_analysis_options_enable_experiment_missing_non_nullable_big_indent() async {
+    var analysisOptionsText = '''
+analyzer:
+  enable-experiment:
+        - foo
+''';
+    var projectContents =
+        simpleProject(analysisOptionsText: analysisOptionsText);
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText: '''
+analyzer:
+  enable-experiment:
+        - foo
+        - non-nullable
+'''));
+  }
+
+  test_analysis_options_is_missing_analyzer() async {
+    var projectContents = simpleProject(analysisOptionsText: '''
+name: test
+''');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    await cliRunner.run();
+    // The Dart source code should still be migrated.
+    assertProjectContents(
+        projectDir, simpleProject(migrated: true, analysisOptionsText:
+            // This is strange-looking, but valid.
+            '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+
+name: test
+'''));
+  }
+
+  test_analysis_options_is_not_a_map() async {
+    var projectContents = simpleProject(analysisOptionsText: 'not-a-map');
+    var projectDir = createProjectDir(projectContents);
+    var cliRunner = _createCli().decodeCommandLineArgs(
+        _parseArgs(['--no-web-preview', '--apply-changes', projectDir]));
+    expect(() async => await cliRunner.run(), throwsUnsupportedError);
+  }
+
   test_default_logger() {
     // When running normally, we don't override the logger; make sure it has a
     // non-null default so that there won't be a crash.
@@ -569,16 +753,16 @@
     expect(assertParseArgsSuccess([]).skipPubOutdated, isTrue);
   }
 
-  test_flag_skip_pub_outdated_negated() async {
-    expect(assertParseArgsSuccess(['--no-skip-pub-outdated']).skipPubOutdated,
-        isFalse);
-  }
-
   test_flag_skip_pub_outdated_enable() {
     expect(assertParseArgsSuccess(['--skip-pub-outdated']).skipPubOutdated,
         isTrue);
   }
 
+  test_flag_skip_pub_outdated_negated() async {
+    expect(assertParseArgsSuccess(['--no-skip-pub-outdated']).skipPubOutdated,
+        isFalse);
+  }
+
   test_flag_web_preview_default() {
     expect(assertParseArgsSuccess([]).webPreview, isTrue);
   }
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 716ba06..2752c23 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -192,6 +192,7 @@
   final Class intClass;
   final Class doubleClass;
   final Class listClass;
+  final Class typeClass;
   final Class pragmaClass;
   final Field pragmaName;
   final Field pragmaOptions;
@@ -233,6 +234,7 @@
         intClass = coreTypes.intClass,
         doubleClass = coreTypes.doubleClass,
         listClass = coreTypes.listClass,
+        typeClass = coreTypes.typeClass,
         pragmaClass = coreTypes.pragmaClass,
         pragmaName = coreTypes.pragmaName,
         pragmaOptions = coreTypes.pragmaOptions,
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 13498bc..b8a3e62 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -227,9 +227,9 @@
             f.fileUri);
       } else {
         final DartType nativeType = InterfaceType(
-            nativeTypesClasses[nativeTypeAnnos.first.index],
+            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first).index],
             Nullability.legacy);
-        // TODO(36730): Support structs inside structs.
+        // TODO(dartbug.com/37271): Support structs inside structs.
         final DartType shouldBeDartType = convertNativeTypeToDartType(
             nativeType, /*allowStructs=*/ false, /*allowHandle=*/ false);
         if (shouldBeDartType == null ||
@@ -294,6 +294,7 @@
   ///
   /// Returns the total size of the struct (for all ABIs).
   Map<Abi, int> _replaceFields(Class node, IndexedClass indexedClass) {
+    final classes = <Class>[];
     final types = <NativeType>[];
     final fields = <int, Field>{};
     final getters = <int, Procedure>{};
@@ -304,18 +305,22 @@
       final dartType = _structFieldMemberType(m);
 
       NativeType nativeType;
+      Class clazz;
       if (_isPointerType(dartType)) {
         nativeType = NativeType.kPointer;
+        clazz = pointerClass;
       } else {
         final nativeTypeAnnos = _getNativeTypeAnnotations(m).toList();
         if (nativeTypeAnnos.length == 1) {
-          nativeType = nativeTypeAnnos.first;
+          clazz = nativeTypeAnnos.first;
+          nativeType = _getFieldType(clazz);
         }
       }
 
       if ((m is Field || (m is Procedure && m.isGetter)) &&
           nativeType != null) {
         types.add(nativeType);
+        classes.add(clazz);
         if (m is Field) {
           fields[i] = m;
         }
@@ -332,6 +337,8 @@
       }
     }
 
+    _annoteStructWithFields(node, classes);
+
     final sizeAndOffsets = <Abi, SizeAndOffsets>{};
     for (final Abi abi in Abi.values) {
       sizeAndOffsets[abi] = _calculateSizeAndOffsets(types, abi);
@@ -377,6 +384,29 @@
     return sizeAndOffsets.map((k, v) => MapEntry(k, v.size));
   }
 
+  void _annoteStructWithFields(Class node, List<Class> fieldTypes) {
+    final types = fieldTypes.map((Class c) {
+      List<DartType> typeArg = const [];
+      if (c == pointerClass) {
+        typeArg = [
+          InterfaceType(pointerClass.superclass, Nullability.nonNullable)
+        ];
+      }
+      return TypeLiteralConstant(
+          InterfaceType(c, Nullability.nonNullable, typeArg));
+    }).toList();
+
+    node.addAnnotation(ConstantExpression(
+        InstanceConstant(pragmaClass.reference, [], {
+          pragmaName.reference: StringConstant("vm:ffi:struct-fields"),
+          // TODO(dartbug.com/38158): Wrap list in class to be able to encode
+          // more information when needed.
+          pragmaOptions.reference: ListConstant(
+              InterfaceType(typeClass, Nullability.nonNullable), types)
+        }),
+        InterfaceType(pragmaClass, Nullability.nonNullable, [])));
+  }
+
   /// Expression that queries VM internals at runtime to figure out on which ABI
   /// we are.
   Expression _runtimeBranchOnLayout(Map<Abi, int> values) {
@@ -571,14 +601,13 @@
     return fieldType;
   }
 
-  Iterable<NativeType> _getNativeTypeAnnotations(Member node) {
+  Iterable<Class> _getNativeTypeAnnotations(Member node) {
     return node.annotations
         .whereType<ConstantExpression>()
         .map((expr) => expr.constant)
         .whereType<InstanceConstant>()
         .map((constant) => constant.classNode)
-        .map((klass) => _getFieldType(klass))
-        .where((type) => type != null);
+        .where((klass) => _getFieldType(klass) != null);
   }
 }
 
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index e198b10..b0926a1 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -171,17 +171,18 @@
             nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
         final DartType dartType = node.arguments.types[1];
 
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
-
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
         return _replaceLookupFunction(node);
       } else if (target == asFunctionMethod) {
         final DartType dartType = node.arguments.types[1];
         final DartType nativeType = InterfaceType(
             nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
 
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
 
         final DartType nativeSignature =
             (nativeType as InterfaceType).typeArguments[0];
@@ -198,20 +199,22 @@
 
         _ensureIsStaticFunction(func);
 
-        // TODO(36730): Allow passing/returning structs by value.
-        _ensureNativeTypeValid(nativeType, node);
-        _ensureNativeTypeToDartType(nativeType, dartType, node);
+        _ensureNativeTypeValid(nativeType, node, allowStructs: false);
+        _ensureNativeTypeToDartType(nativeType, dartType, node,
+            allowStructs: false);
 
         // Check `exceptionalReturn`'s type.
         final FunctionType funcType = dartType;
-        final NativeType expectedReturn = getType(
+        final Class expectedReturnClass =
             ((node.arguments.types[0] as FunctionType).returnType
                     as InterfaceType)
-                .classNode);
+                .classNode;
+        final NativeType expectedReturn = getType(expectedReturnClass);
 
         if (expectedReturn == NativeType.kVoid ||
             expectedReturn == NativeType.kPointer ||
-            expectedReturn == NativeType.kHandle) {
+            expectedReturn == NativeType.kHandle ||
+            expectedReturnClass.superclass == structClass) {
           if (node.arguments.positional.length > 1) {
             diagnosticReporter.report(
                 templateFfiExpectedNoExceptionalReturn.withArguments(
diff --git a/sdk/lib/ffi/struct.dart b/sdk/lib/ffi/struct.dart
index f4cb315..0faf7ca 100644
--- a/sdk/lib/ffi/struct.dart
+++ b/sdk/lib/ffi/struct.dart
@@ -18,7 +18,7 @@
 /// by native memory. The may allocated via allocation or loaded from a
 /// [Pointer], but not by a generative constructor.
 abstract class Struct extends NativeType {
-  final Pointer<Struct> _addressOf;
+  final Object _addressOf;
 
   /// Construct a reference to the [nullptr].
   ///
diff --git a/tools/VERSION b/tools/VERSION
index f603700..354a040 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 228
+PRERELEASE 229
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/flutter/compile_flutter.sh b/tools/bots/flutter/compile_flutter.sh
index 5f27241..0ab0869 100755
--- a/tools/bots/flutter/compile_flutter.sh
+++ b/tools/bots/flutter/compile_flutter.sh
@@ -63,11 +63,11 @@
 popd  # flutter
 
 # Directly in temp directory again.
-mkdir src
+git clone --single-branch --depth=1 -vv \
+    https://dart.googlesource.com/external/github.com/flutter/buildroot src
 pushd src
 git clone --single-branch --depth=1 -vv \
     https://dart.googlesource.com/external/github.com/flutter/engine flutter
-mkdir third_party
 pushd third_party
 ln -s $checkout dart
 popd  # third_party