Version 2.2.0-dev.1.1

Merge commit '63fd8f63e66d56f4865445a8bfd836a68fabac0d' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee303e8..37ef962 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 2.2.0-dev.1.0
+## 2.2.0-dev.1.1
 
 ### Tool Changes
 
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 11958a0..3c7e212 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -125,8 +125,30 @@
   var summaryModules = Map.fromIterables(
       summaryPaths.map(sourcePathToUri), options.summaryModules.values);
   var useAnalyzer = summaryPaths.any((s) => !s.endsWith('.dill'));
-  var sdkSummaryPath = argResults['dart-sdk-summary'] as String ??
-      (useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath);
+  var sdkSummaryPath = argResults['dart-sdk-summary'] as String;
+  String librarySpecPath;
+  if (sdkSummaryPath == null) {
+    sdkSummaryPath =
+        useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath;
+    librarySpecPath = defaultLibrarySpecPath;
+  } else {
+    // TODO(jmesserly): the `isSupported` bit should be included in the SDK
+    // summary, but front_end requires a separate file, so we have to work
+    // around that, while avoiding yet another command line option.
+    //
+    // Right now we search two locations: one level above the SDK summary
+    // (this works for the build and SDK layouts) or next to the SDK summary
+    // (if the user is doing something custom).
+    //
+    // Another option: we could make an in-memory file with the relevant info.
+    librarySpecPath =
+        path.join(path.dirname(path.dirname(sdkSummaryPath)), "libraries.json");
+    if (!File(librarySpecPath).existsSync()) {
+      librarySpecPath =
+          path.join(path.dirname(sdkSummaryPath), "libraries.json");
+    }
+  }
+
   useAnalyzer = useAnalyzer || !sdkSummaryPath.endsWith('.dill');
 
   /// The .packages file path provided by the user.
@@ -158,6 +180,7 @@
       oldCompilerState,
       sourcePathToUri(sdkSummaryPath),
       sourcePathToUri(packageFile),
+      sourcePathToUri(librarySpecPath),
       summaryModules.keys.toList(),
       DevCompilerTarget(),
       fileSystem: fileSystem);
@@ -332,6 +355,8 @@
 final defaultSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
 
+final defaultLibrarySpecPath = path.join(getSdkPath(), 'lib', 'libraries.json');
+
 final defaultAnalyzerSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
 
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 3a1c819..517e6599 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -573,7 +573,7 @@
   var mainUri = Uri.file('/memory/test.dart');
   _fileSystem.entityForUri(mainUri).writeAsStringSync(code);
   _compilerState = await fe.initializeCompiler(
-      _compilerState, sdkUri, packagesUri, [], DevCompilerTarget(),
+      _compilerState, sdkUri, packagesUri, null, [], DevCompilerTarget(),
       fileSystem: _fileSystem);
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json b/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
deleted file mode 100644
index 49b904f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
-  "dartdevc": {
-    "libraries": {
-      "_runtime": {
-        "uri": "../private/ddc_runtime/runtime.dart"
-      },
-      "_debugger": {
-        "uri": "../private/debugger.dart"
-      },
-      "_foreign_helper": {
-        "uri": "../private/foreign_helper.dart"
-      },
-      "_http": {
-        "uri": "../../../../../sdk/lib/_http/http.dart"
-      },
-      "_interceptors": {
-        "uri": "../private/interceptors.dart"
-      },
-      "_internal": {
-        "uri": "../../../../../sdk/lib/internal/internal.dart",
-        "patches": "../patch/internal_patch.dart"
-      },
-      "_isolate_helper": {
-        "uri": "../private/isolate_helper.dart"
-      },
-      "_js_helper": {
-        "uri": "../private/js_helper.dart"
-      },
-      "_js_mirrors": {
-        "uri": "../private/js_mirrors.dart"
-      },
-      "_js_primitives": {
-        "uri": "../private/js_primitives.dart"
-      },
-      "_metadata": {
-        "uri": "../../../../../sdk/lib/html/html_common/metadata.dart"
-      },
-      "_native_typed_data": {
-        "uri": "../private/native_typed_data.dart"
-      },
-      "async": {
-        "uri": "../../../../../sdk/lib/async/async.dart",
-        "patches": "../patch/async_patch.dart"
-      },
-      "collection": {
-        "uri": "../../../../../sdk/lib/collection/collection.dart",
-        "patches": "../patch/collection_patch.dart"
-      },
-      "convert": {
-        "uri": "../../../../../sdk/lib/convert/convert.dart",
-        "patches": "../patch/convert_patch.dart"
-      },
-      "core": {
-        "uri": "../../../../../sdk/lib/core/core.dart",
-        "patches": "../patch/core_patch.dart"
-      },
-      "developer": {
-        "uri": "../../../../../sdk/lib/developer/developer.dart",
-        "patches": "../patch/developer_patch.dart"
-      },
-      "io": {
-        "uri": "../../../../../sdk/lib/io/io.dart",
-        "patches": "../patch/io_patch.dart"
-      },
-      "isolate": {
-        "uri": "../../../../../sdk/lib/isolate/isolate.dart",
-        "patches": "../patch/isolate_patch.dart"
-      },
-      "mirrors": {
-        "uri": "../../../../../sdk/lib/mirrors/mirrors.dart",
-        "patches": "../patch/mirrors_patch.dart"
-      },
-      "math": {
-        "uri": "../../../../../sdk/lib/math/math.dart",
-        "patches": "../patch/math_patch.dart"
-      },
-      "typed_data": {
-        "uri": "../../../../../sdk/lib/typed_data/typed_data.dart",
-        "patches": "../patch/typed_data_patch.dart"
-      },
-      "html": {
-        "uri": "../../../../../sdk/lib/html/dart2js/html_dart2js.dart"
-      },
-      "html_common": {
-        "uri": "../../../../../sdk/lib/html/html_common/html_common_dart2js.dart"
-      },
-      "indexed_db": {
-        "uri": "../../../../../sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart"
-      },
-      "js": {
-        "uri": "js/dart2js/js_dart2js.dart"
-      },
-      "js_util": {
-        "uri": "js_util/dart2js/js_util_dart2js.dart"
-      },
-      "svg": {
-        "uri": "../../../../../sdk/lib/svg/dart2js/svg_dart2js.dart"
-      },
-      "web_audio": {
-        "uri": "../../../../../sdk/lib/web_audio/dart2js/web_audio_dart2js.dart"
-      },
-      "web_gl": {
-        "uri": "../../../../../sdk/lib/web_gl/dart2js/web_gl_dart2js.dart"
-      },
-      "web_sql": {
-        "uri": "../../../../../sdk/lib/web_sql/dart2js/web_sql_dart2js.dart"
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index feacbc7..2827fbe 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -36,13 +36,14 @@
     outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill');
   }
 
+  var librarySpecPath = parserOptions['libraries'] as String;
+
   var target = DevCompilerTarget();
   var options = CompilerOptions()
     ..compileSdk = true
     // TODO(sigmund): remove this unnecessary option when possible.
     ..sdkRoot = Uri.base
-    ..librariesSpecificationUri =
-        Uri.base.resolveUri(Uri.file(parserOptions['libraries']))
+    ..librariesSpecificationUri = Uri.base.resolveUri(Uri.file(librarySpecPath))
     ..target = target;
 
   var inputs = target.extraRequiredLibraries.map(Uri.parse).toList();
@@ -51,6 +52,8 @@
   var outputDir = path.dirname(outputPath);
   await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
+  File(librarySpecPath).copySync(
+      path.join(path.dirname(outputDir), path.basename(librarySpecPath)));
 
   var jsModule = ProgramCompiler(
       component,
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index dcc4c43..1a85b55 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -56,6 +56,7 @@
     InitializedCompilerState oldState,
     Uri sdkSummary,
     Uri packagesFile,
+    Uri librariesSpecificationUri,
     List<Uri> inputSummaries,
     Target target,
     {FileSystem fileSystem}) async {
@@ -71,6 +72,7 @@
   if (oldState != null &&
       oldState.options.sdkSummary == sdkSummary &&
       oldState.options.packagesFileUri == packagesFile &&
+      oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       listEqual(oldState.options.inputSummaries, inputSummaries)) {
     // Reuse old state.
 
@@ -91,6 +93,7 @@
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
     ..inputSummaries = inputSummaries
+    ..librariesSpecificationUri = librariesSpecificationUri
     ..target = target
     ..fileSystem = fileSystem ?? StandardFileSystem.instance;
 
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 1c33aeb..2d663e0 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -246,30 +246,6 @@
   return scriptUri.toString();
 }
 
-// Embedder Entrypoint (gen_snapshot):
-// Resolve relative paths relative to working directory.
-@pragma("vm:entry-point")
-String _resolveInWorkingDirectory(String fileName) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  if (_workingDirectory == null) {
-    throw 'No current working directory set.';
-  }
-  var name = _sanitizeWindowsPath(fileName);
-
-  var uri = Uri.parse(name);
-  if (uri.scheme != '') {
-    throw 'Schemes are not supported when resolving filenames.';
-  }
-  uri = _workingDirectory.resolveUri(uri);
-
-  if (_traceLoading) {
-    _log('Resolved in working directory: $fileName -> $uri');
-  }
-  return uri.toString();
-}
-
 // Only used by vm/cc unit tests.
 Uri _resolvePackageUri(Uri uri) {
   assert(_packageRoot != null);
@@ -304,22 +280,6 @@
   }
 }
 
-// Embedder Entrypoint.
-@pragma("vm:entry-point")
-_libraryFilePath(String libraryUri) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  int index = libraryUri.lastIndexOf('/');
-  var path;
-  if (index == -1) {
-    path = './';
-  } else {
-    path = libraryUri.substring(0, index + 1);
-  }
-  return _filePathFromUri(path);
-}
-
 // Register callbacks and hooks with the rest of the core libraries.
 @pragma("vm:entry-point")
 _setupHooks() {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index cf75b68..9252508 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -35,7 +35,6 @@
 namespace bin {
 
 const char* DartUtils::original_working_directory = NULL;
-CommandLineOptions* DartUtils::url_mapping = NULL;
 const char* const DartUtils::kDartScheme = "dart:";
 const char* const DartUtils::kDartExtensionScheme = "dart-ext:";
 const char* const DartUtils::kAsyncLibURL = "dart:async";
@@ -69,23 +68,6 @@
 #endif  // defined(HOST_OS_WINDOWS)
 }
 
-const char* DartUtils::MapLibraryUrl(const char* url_string) {
-  ASSERT(url_mapping != NULL);
-  // We need to check if the passed in url is found in the url_mapping array,
-  // in that case use the mapped entry.
-  intptr_t len = strlen(url_string);
-  for (intptr_t idx = 0; idx < url_mapping->count(); idx++) {
-    const char* url_name = url_mapping->GetArgument(idx);
-    if (!strncmp(url_string, url_name, len) && (url_name[len] == ',')) {
-      const char* url_mapped_name = url_name + len + 1;
-      if (strlen(url_mapped_name) != 0) {
-        return url_mapped_name;  // Found a mapping for this URL.
-      }
-    }
-  }
-  return NULL;  // Did not find a mapping for this URL.
-}
-
 int64_t DartUtils::GetIntegerValue(Dart_Handle value_obj) {
   int64_t value = 0;
   Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
@@ -394,23 +376,6 @@
                               directory);
 }
 
-Dart_Handle DartUtils::ResolveUriInWorkingDirectory(Dart_Handle script_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = script_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_resolveInWorkingDirectory"), kNumArgs,
-                     dart_args);
-}
-
-Dart_Handle DartUtils::LibraryFilePath(Dart_Handle library_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = library_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_libraryFilePath"), kNumArgs, dart_args);
-}
-
 Dart_Handle DartUtils::ResolveScript(Dart_Handle url) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
@@ -792,17 +757,6 @@
   return original_working_directory != nullptr;
 }
 
-Dart_Handle DartUtils::GetCanonicalizableWorkingDirectory() {
-  const char* str = DartUtils::original_working_directory;
-  intptr_t len = strlen(str);
-  if ((str[len] == '/') || (IsWindowsHost() && str[len] == '\\')) {
-    return Dart_NewStringFromCString(str);
-  }
-  char* new_str = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 2));
-  snprintf(new_str, (len + 2), "%s%s", str, File::PathSeparator());
-  return Dart_NewStringFromCString(new_str);
-}
-
 void DartUtils::SetEnvironment(dart::SimpleHashMap* environment) {
   environment_ = environment;
 }
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 666d248..6dd1c5b 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -214,11 +214,7 @@
   }
 
   static bool SetOriginalWorkingDirectory();
-  static Dart_Handle GetCanonicalizableWorkingDirectory();
 
-  static const char* MapLibraryUrl(const char* url_string);
-
-  static Dart_Handle ResolveUriInWorkingDirectory(Dart_Handle script_uri);
   static Dart_Handle ResolveScript(Dart_Handle url);
 
   enum MagicNumber {
@@ -239,9 +235,6 @@
   // Global state that stores the original working directory..
   static const char* original_working_directory;
 
-  // Global state that captures the URL mappings specified on the command line.
-  static CommandLineOptions* url_mapping;
-
   static const char* const kDartScheme;
   static const char* const kDartExtensionScheme;
   static const char* const kAsyncLibURL;
@@ -258,8 +251,6 @@
   static const char* const kHttpScheme;
   static const char* const kVMServiceLibURL;
 
-  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
-
   static void SetEnvironment(dart::SimpleHashMap* environment);
   static Dart_Handle EnvironmentCallback(Dart_Handle name);
 
@@ -585,61 +576,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedBlockingCall);
 };
 
-// Where the argument to the constructor is the handle for an object
-// implementing List<int>, this class creates a scope in which the memory
-// backing the list can be accessed.
-//
-// Do not make Dart_ API calls while in a ScopedMemBuffer.
-// Do not call Dart_PropagateError while in a ScopedMemBuffer.
-class ScopedMemBuffer {
- public:
-  explicit ScopedMemBuffer(Dart_Handle object) {
-    if (!Dart_IsTypedData(object) && !Dart_IsList(object)) {
-      Dart_ThrowException(
-          DartUtils::NewDartArgumentError("Argument is not a List<int>"));
-    }
-
-    uint8_t* bytes = NULL;
-    intptr_t bytes_len = 0;
-    bool is_typed_data = false;
-    if (Dart_IsTypedData(object)) {
-      is_typed_data = true;
-      Dart_TypedData_Type typ;
-      ThrowIfError(Dart_TypedDataAcquireData(
-          object, &typ, reinterpret_cast<void**>(&bytes), &bytes_len));
-    } else {
-      ASSERT(Dart_IsList(object));
-      ThrowIfError(Dart_ListLength(object, &bytes_len));
-      bytes = Dart_ScopeAllocate(bytes_len);
-      ASSERT(bytes != NULL);
-      ThrowIfError(Dart_ListGetAsBytes(object, 0, bytes, bytes_len));
-    }
-
-    object_ = object;
-    bytes_ = bytes;
-    bytes_len_ = bytes_len;
-    is_typed_data_ = is_typed_data;
-  }
-
-  ~ScopedMemBuffer() {
-    if (is_typed_data_) {
-      ThrowIfError(Dart_TypedDataReleaseData(object_));
-    }
-  }
-
-  uint8_t* get() const { return bytes_; }
-  intptr_t length() const { return bytes_len_; }
-
- private:
-  Dart_Handle object_;
-  uint8_t* bytes_;
-  intptr_t bytes_len_;
-  bool is_typed_data_;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(ScopedMemBuffer);
-};
-
 struct MagicNumberData {
   static const intptr_t kMaxLength = 8;
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index bbda5dc..98654fe 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -147,14 +147,6 @@
 #undef BOOL_OPTION_DEFINITION
 
 DEFINE_ENUM_OPTION(snapshot_kind, SnapshotKind, snapshot_kind);
-DEFINE_STRING_OPTION_CB(embedder_entry_points_manifest, {
-  Log::PrintErr(
-      "Option --embedder_entry_points_manifest is no longer supported."
-      " Use @pragma(\'vm:entry-point\') instead.\n");
-  exit(kErrorExitCode);
-});
-DEFINE_STRING_OPTION_CB(url_mapping,
-                        { DartUtils::url_mapping->AddArgument(value); });
 DEFINE_CB_OPTION(ProcessEnvironmentOption);
 
 static bool IsSnapshottingForPrecompilation() {
@@ -173,9 +165,6 @@
 "  Where to find packages, that is, package:...  imports.                    \n"
 "--packages=<packages_file>                                                  \n"
 "  Where to find a package spec file                                         \n"
-"--url_mapping=<mapping>                                                     \n"
-"  Uses the URL mapping(s) specified on the command line to load the         \n"
-"  libraries.                                                                \n"
 "--dependencies=<output-file>                                                \n"
 "  Generates a Makefile with snapshot output files as targets and all        \n"
 "  transitive imports as sources.                                            \n"
@@ -940,10 +929,6 @@
   const int EXTRA_VM_ARGUMENTS = 7;
   CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
 
-  // Initialize the URL mapping array.
-  CommandLineOptions cmdline_url_mapping(argc);
-  DartUtils::url_mapping = &cmdline_url_mapping;
-
   // When running from the command line we assume that we are optimizing for
   // throughput, and therefore use a larger new gen semi space size and a faster
   // new gen growth factor unless others have been specified.
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 599d17c..88da22e 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -54,11 +54,6 @@
   result.add_option("--packages",
       action="store", type="string",
       help="package config file used to reasolve package: imports.")
-  result.add_option("--url_mapping",
-      default=[],
-      action="append",
-      help=("mapping from url to file name, used when generating snapshots " +
-            "E.g.: --url_mapping=fileUri,/path/to/file.dart"))
   result.add_option("-v", "--verbose",
       help='Verbose output.',
       default=False, action="store_true")
@@ -143,11 +138,6 @@
     script_args.append(''.join([ "--isolate_snapshot_instructions=",
                                  options.isolate_instructions_output_bin ]))
 
-  # Next setup all url mapping options specified.
-  for url_arg in options.url_mapping:
-    url_mapping_argument = ''.join(["--url_mapping=", url_arg ])
-    script_args.append(url_mapping_argument)
-
   # Finally append the script name if one is specified.
   if options.script:
     script_args.append(options.script)
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index b4909ed..3545739 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -57,6 +57,7 @@
         jit-[opt-][debug-]dbc   = Dart JIT (simdbc)
         jit-[opt-][debug-]dbc64 = Dart JIT (simdbc64)
         aot-[debug-]x64         = Dart AOT (x64)
+        aot-[debug-]arm32       = Dart AOT (simarm)
         aot-[debug-]arm64       = Dart AOT (simarm64)
         kbc-int-[debug-]x64     = Dart KBC (interpreted bytecode)
         kbc-mix-[debug-]x64     = Dart KBC (mixed-mode bytecode)
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index d92cd8a..35d9a56 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -38,7 +38,7 @@
   if (res.exitCode == -sigkill) {
     return new TestResult(ResultCode.timeout, res.stdout);
   } else if (res.exitCode != 0) {
-    return new TestResult(ResultCode.error, res.stdout);
+    return new TestResult(ResultCode.error, res.stderr);
   }
   return new TestResult(ResultCode.success, res.stdout);
 }
@@ -336,8 +336,20 @@
     numDivergences++;
     print(
         '\n${isolate}: !DIVERGENCE! $version:$seed (output=${outputDivergence})');
-    if (showStats && outputDivergence) {
-      print('out1:\n${result1.output}\nout2:\n${result2.output}\n');
+    if (outputDivergence) {
+      // Only report the actual output divergence details when requested,
+      // since this output may be lengthy and should be reproducable anyway.
+      if (showStats) {
+        print('\nout1:\n${result1.output}\nout2:\n${result2.output}\n');
+      }
+    } else {
+      // For any other divergence, always report what went wrong.
+      if (result1.code != ResultCode.success) {
+        print('\nfail1:\n${result1.output}\n');
+      }
+      if (result2.code != ResultCode.success) {
+        print('\nfail2:\n${result2.output}\n');
+      }
     }
   }
 
@@ -452,7 +464,7 @@
     // Random when not set.
     if (mode == null || mode == '') {
       // Pick a mode at random (cluster), different from other.
-      int cluster_modes = modes.length - 15;
+      int cluster_modes = modes.indexOf('aot-debug-arm32');
       Random rand = new Random();
       do {
         mode = modes[rand.nextInt(cluster_modes)];
@@ -502,7 +514,9 @@
     'kbc-cmp-x64',
     'kbc-mix-x64',
     // Times out often:
+    'aot-debug-arm32',
     'aot-debug-arm64',
+    'aot-arm32',
     'aot-arm64',
     // Too many divergences (due to arithmetic):
     'js',
@@ -519,6 +533,9 @@
     'jit-opt-arm64',
     'jit-opt-dbc',
     'jit-opt-dbc64',
+    // Not supported:
+    'aot-debug-ia32',
+    'aot-ia32',
   ];
 }
 
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 3929ba0..50b2691c 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -150,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 39dd081..afb751c 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -150,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
index ce24a25..2ddd3e0 100644
--- a/runtime/vm/v8_snapshot_writer.cc
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -75,7 +75,9 @@
 
   ASSERT(reference.offset_or_name >= 0);
   info->edges->Add({
-      reference.reference_type == Reference::kElement ? kElement : kProperty,
+      static_cast<intptr_t>(reference.reference_type == Reference::kElement
+                                ? kElement
+                                : kProperty),
       reference.offset_or_name,
       reference.to_object_id,
   });
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index a178398..3265de2 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -342,7 +342,8 @@
       },
       "isolate": {
         "patches": "../../pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart",
-        "uri": "isolate/isolate.dart"
+        "uri": "isolate/isolate.dart",
+        "supported": false
       },
       "web_gl": {
         "uri": "web_gl/dart2js/web_gl_dart2js.dart"
diff --git a/tests/language_2/async_star/async_star_await_for_test.dart b/tests/language_2/async_star/async_star_await_for_test.dart
deleted file mode 100644
index 0493a1f..0000000
--- a/tests/language_2/async_star/async_star_await_for_test.dart
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that `await for` and `async*` interact correctly.
-
-// An `await for` must pause its subscription immediately
-// if the `await for` body does anything asynchronous
-// (any `await`, `await for`, or pausing at a `yield`/`yield*`)
-// A pause happening synchronously in an event delivery
-// must pause the `sync*` method at the `yield` sending the event.
-// A break happening synchronously in an event delivery,
-// or while paused at a `yield`, must exit at that `yield`.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-Stream<int> stream(List<String> log) async* {
-  log.add("^");
-  try {
-    log.add("?1");
-    yield 1;
-    log.add("?2");
-    yield 2;
-    log.add("?3");
-    yield 3;
-  } finally {
-    log.add(r"$");
-  }
-}
-
-Stream<int> consume(List<String> log,
-    {int breakAt = -1,
-    int yieldAt = -1,
-    int yieldStarAt = -1,
-    int pauseAt = -1}) async* {
-  // Create stream.
-  var s = stream(log);
-  log.add("(");
-  // The "consume loop".
-  await for (var event in s) {
-    // Should be acting synchronously wrt. the delivery of the event.
-    // The source stream should be at the yield now.
-    log.add("!$event");
-    if (event == pauseAt) {
-      log.add("p$event[");
-      // Async operation causes subscription to pause.
-      // Nothing should happen in the source stream
-      // until the end of the loop body where the subscription is resumed.
-      await Future.delayed(Duration(microseconds: 1));
-      log.add("]");
-    }
-    if (event == yieldAt) {
-      log.add("y$event[");
-      // Yield may cause subscription to pause or cancel.
-      // This loop should stay at the yield until the event has been delieverd.
-      // If the receiver pauses or cancels, we delay or break the loop here.
-      yield event;
-      log.add("]");
-    }
-    if (event == yieldStarAt) {
-      log.add("Y$event[");
-      // Yield* will always cause the subscription for this loop to pause.
-      // If the listener pauses, this stream is paused. If the listener cancels,
-      // this stream is cancelled, and the yield* acts like return, cancelling
-      // the loop subscription and waiting for the cancel future.
-      yield* Stream<int>.fromIterable([event]);
-      log.add("]");
-    }
-    if (event == breakAt) {
-      log.add("b$event");
-      // Breaks the loop. This cancels the loop subscription and waits for the
-      // cancel future.
-      break;
-    }
-  }
-  // Done event from stream or cancel future has completed.
-  log.add(")");
-}
-
-main() async {
-  asyncStart();
-
-  // Just run the loop over the stream. The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 1));
-    var trace = log.join("");
-    Expects.equals(r"(^?1!1?2!2?3!3$)", trace, "straight through");
-  }
-
-  // Pause at 1, then resume.
-  // Consume loop forces a pause when it receives the 1 event.
-  // Nothing should happen until that pause is resumed.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, pauseAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "pause at 1";
-    if (trace.contains("p1[?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1p1[]?2!2?3!3$)", trace, message);
-  }
-
-  // Break at 1.
-  // Consume loop breaks after receiving the 1 event.
-  // The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, breakAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "break at 1";
-    if (trace.contains("b1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1b1$)", trace, message);
-  }
-
-  // Pause then break at 1.
-  // Consume loop pauses after receiving the 1 event,
-  // then breaks before resuming. It should still be at the yield.
-  // The consume stream emits no events.
-  {
-    var log = <String>[];
-    await for (var _ in consume(log, pauseAt: 1, breakAt: 1)) {
-      throw "unreachable";
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "pause then break at 1";
-    if (trace.contains("p1[?2")) {
-      message += " (did not pause in time)";
-    }
-    if (trace.contains("b1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1p1[]b1$)", trace, message);
-  }
-
-  // Yield at 1.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The consume loop may or may not pause, it should make no difference.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1y1[e1]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield at 1, then pause at yield.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The test loop then pauses.
-  // Nothing should happen in either the original yield
-  // or the consume-function yield until the test loop ends.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e$s<");
-      // Force pause at yield.
-      await Future.delayed(Duration(milliseconds: 1));
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1, pause at yield";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("e1<?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1y1[e1<>]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield at 1, then break at yield.
-  // The consume loop re-emits the 1 event.
-  // The test loop should receive that event while the consume loop is still
-  // at the yield statement.
-  // The test loop then breaks. That makes the consume loop yield return,
-  // breaking the consume loop, which makes the source yield return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldAt: 1)) {
-      log.add("e${s}B$s");
-      break; // Force break at yield*.
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield at 1, break at yield";
-    if (trace.contains("y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("B1?2")) {
-      message += " (did not break in time)";
-    }
-    Expects.equals(r"(^?1!1y1[e1B1$)", trace, message);
-  }
-
-  // Yield* at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`, which again happens before the source
-  // stream continues from its `yield`.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then force a pause.
-  // Nothing further should happen during that pause.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    if (trace.contains("e1<?2")) {
-      message += " (did not pause in time)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1<>]?2!2?3!3$)", trace, message);
-  }
-
-  // Yield* at 1, then break at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`.
-  // When the consume loop continues, it breaks,
-  // forcing the waiting source yield to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
-      log.add("e$s");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not wait for delivery)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1]b1$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield, then break at 1.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. After the `yield*`, the consume loop breaks.
-  // This forces the waiting source yield to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">");
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause at 1";
-    Expects.equals(r"(^?1!1Y1[e1<>]b1$)", trace, message);
-  }
-
-  // Yield* at 1, break at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then breaks,
-  // forcing the two waiting yields to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e${s}B$s");
-      break;
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then break at 1";
-    if (trace.contains("Y1[?2")) {
-      message += " (did not deliver event in time)";
-    }
-    if (trace.contains("e1?2")) {
-      message += " (did not cancel in time)";
-    }
-    Expects.equals(r"(^?1!1Y1[e1B1$)", trace, message);
-  }
-
-  // Yield* at 1, pause at yield, then break at yield.
-  // The consume loop re-emits a stream containing the 1 event.
-  // The test loop should receive that event before the consume loop
-  // continues from the `yield*`. The test loop then forces a pause,
-  // and then breaks before that pause is resumed.
-  // This forces the two waiting yields to return.
-  {
-    var log = <String>[];
-    await for (var s in consume(log, yieldStarAt: 1)) {
-      log.add("e$s<");
-      await Future.delayed(Duration(milliseconds: 1)); // force pause.
-      log.add(">B$s");
-      break; // And break.
-    }
-    await Future.delayed(Duration(milliseconds: 10));
-    var trace = log.join("");
-    String message = "yield* then pause then break at 1";
-    Expects.equals(r"(^?1!1Y1[e1<>B1$)", trace, message);
-  }
-
-  Expects.summarize();
-  asyncEnd();
-}
-
-class Expects {
-  static var _errors = [];
-  static int _tests = 0;
-  static void summarize() {
-    if (_errors.isNotEmpty) {
-      var buffer = StringBuffer();
-      for (var es in _errors) {
-        buffer.writeln("FAILURE:");
-        buffer.writeln(es[0]); // error
-        buffer.writeln(es[1]); // stack trace
-      }
-      ;
-      buffer.writeln("Expectations failed: ${_errors.length}"
-          ", succeeded: ${_tests - _errors.length}");
-      throw ExpectException(buffer.toString());
-    }
-  }
-
-  static void equals(o1, o2, String message) {
-    _tests++;
-    try {
-      Expect.equals(o1, o2, message);
-    } on ExpectException catch (e) {
-      var stack = StackTrace.current;
-      _errors.add([e, stack]);
-    }
-  }
-}
diff --git a/tests/language_2/async_star/async_star_cancel_test.dart b/tests/language_2/async_star/async_star_cancel_test.dart
deleted file mode 100644
index c23c6ba..0000000
--- a/tests/language_2/async_star/async_star_cancel_test.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that stream cancellation is checked immediately after delivering the
-// event, and before continuing after the yield.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-main() async {
-  asyncStart();
-  var log = [];
-  Stream<int> f() async* {
-    try {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    } finally {
-      log.add("x");
-    }
-  }
-
-  var completer = Completer();
-  var s;
-  s = f().listen((e) {
-    log.add("+$e");
-    // The `cancel` operation makes all `yield` operations act as returns.
-    // It should make the `finally` block in `f` log an "x",
-    // and nothing else.
-    completer.complete(s.cancel());
-  }, onError: (e) {
-    // Should never be reached, but if it does, we'll make the await
-    // below terminate.
-    completer.complete(new Future.sync(() {
-      Expect.fail("$e");
-    }));
-  }, onDone: () {
-    completer.complete(null);
-  });
-  await completer.future;
-  Expect.listEquals(["-1", "+1", "x"], log, "cancel");
-  asyncEnd();
-}
diff --git a/tests/language_2/async_star/async_star_invalid_test.dart b/tests/language_2/async_star/async_star_invalid_test.dart
deleted file mode 100644
index 529cf25..0000000
--- a/tests/language_2/async_star/async_star_invalid_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that various invalid uses of `yield` are disallowed.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-var yield = 42;
-
-main() async {
-  asyncStart();
-  Stream<String> f() async* {
-    // Invalid syntax.
-    yield ("a", "b"); //# 01: compile-time error
-    yield yield "twice"; //# 02: compile-time error
-
-    // Valid but curious syntax.
-    yield throw "throw"; //# 03: runtime error
-
-    // Type error.
-    yield* "one"; //# 04: compile-time error
-
-    label: yield "ok";
-  }
-  var completer = Completer();
-  f().listen(completer.complete, onError: completer.completeError,
-      onDone: () {
-        if (!completer.isCompleted) completer.completeError("not ok?");
-      });
-  Expect.equals("ok", await completer.future);
-  asyncEnd();
-}
diff --git a/tests/language_2/async_star/async_star_test.dart b/tests/language_2/async_star/async_star_test.dart
deleted file mode 100644
index 819039e..0000000
--- a/tests/language_2/async_star/async_star_test.dart
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-main() async {
-  asyncStart();
-  // Normal operations.
-  {
-    Stream<int> f() async* {
-      yield 1;
-      yield 2;
-      yield 3;
-    }
-
-    Expect.listEquals([1, 2, 3], await f().toList(), "basic1");
-  }
-
-  {
-    Stream<int> f() async* {
-      yield 1;
-      yield 2;
-      yield 3;
-    }
-
-    var log = [];
-    var completer = Completer();
-    f().listen(log.add,
-        onError: (e) {
-          // Shouldn't be reached.
-          completer.complete(new Future.sync(() {
-            Expect.fail("$e");
-          }));
-        },
-        onDone: () => completer.complete(null));
-    await completer.future;
-    Expect.listEquals([1, 2, 3], log, "basic2");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await f().forEach((e) {
-      log.add("+$e");
-    });
-    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic3");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-    }
-    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic4");
-  }
-
-  // async
-  {
-    Stream<int> f() async* {
-      yield 1;
-      await Future(() {});
-      yield 2;
-      await Future(() {});
-      yield 3;
-    }
-
-    Expect.listEquals([1, 2, 3], await f().toList(), "async");
-  }
-
-  // Yield*
-  {
-    Stream<int> f(n) async* {
-      yield n;
-      if (n == 0) return;
-      yield* f(n - 1);
-      yield n;
-    }
-
-    Expect.listEquals([3, 2, 1, 0, 1, 2, 3], await f(3).toList(), "yield*");
-  }
-
-  // Errors
-  {
-    var log = [];
-    Stream<int> f() async* {
-      yield 1;
-      throw "error";
-    }
-
-    await f().handleError((e) {
-      log.add(e);
-    }).forEach(log.add);
-    Expect.listEquals([1, "error"], log, "error");
-  }
-
-  {
-    var log = [];
-    Stream<int> f() async* {
-      yield 1;
-      yield* Future<int>.error("error").asStream(); // Emits error as error.
-      yield 3;
-    }
-
-    await f().handleError((e) {
-      log.add(e);
-    }).forEach(log.add);
-    Expect.listEquals([1, "error", 3], log, "error2");
-  }
-
-  // Pause is checked after delivering event.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    var completer = Completer();
-    var s;
-    s = f().listen((e) {
-      log.add("+$e");
-      s.pause(Future(() {}));
-      log.add("++$e");
-    }, onError: (e) {
-      completer.complete(new Future.sync(() {
-        Expect.fail("$e");
-      }));
-    }, onDone: () => completer.complete(null));
-    await completer.future;
-    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "pause");
-  }
-
-  // Await for-loop pauses between events.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      log.add("-1");
-      yield 1;
-      log.add("-2");
-      yield 2;
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-      await Future(() {}); // One timer tick.
-      log.add("++$e");
-    }
-    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "looppause");
-  }
-
-  // Await for-loop break works immediately.
-  {
-    var log = [];
-    Stream<int> f() async* {
-      try {
-        log.add("-1");
-        yield 1;
-        log.add("-2");
-        yield 2;
-        log.add("-3");
-        yield 3;
-      } finally {
-        log.add("x");
-      }
-    }
-
-    await for (var e in f()) {
-      log.add("+$e");
-      await Future(() {}); // One timer tick, pauses function at yield.
-      log.add("++$e");
-      if (e == 2) break;
-    }
-    Expect.listEquals(
-        ["-1", "+1", "++1", "-2", "+2", "++2", "x"], log, "loop-pause-break");
-  }
-  asyncEnd();
-}
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 1edba47..a2102b3 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -5,8 +5,6 @@
 
 [ $compiler == dart2js ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 22853
 bit_operations_test: RuntimeError, OK # non JS number semantics
 bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index 9e924cf..f8c2bfc 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -12,9 +12,6 @@
 accessor_conflict_import_test: CompileTimeError # Issue 25626
 additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
 assertion_test: RuntimeError # Issue 30326; Expect.equals(expected: <1>, actual: <0>) fails.
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 async_star_test/01: RuntimeError
 async_star_test/03: RuntimeError
 async_star_test/04: RuntimeError
@@ -161,8 +158,6 @@
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -183,8 +178,6 @@
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31537
-conditional_import_string_test: CompileTimeError # Test is broken
-conditional_import_test: CompileTimeError # Test is broken
 config_import_test: RuntimeError
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
@@ -322,7 +315,6 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_covariant_type_test: RuntimeError # Check too late
-async_star/async_star_await_for_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
 async_star_test/02: RuntimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index bd08604..b514980 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -359,10 +359,6 @@
 vm/precompiled_static_initializer_test: Pass, Slow
 
 [ $compiler == dartkp && $mode == product && $runtime == dart_precompiled && $strong ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_invalid_test/none: RuntimeError
-async_star/async_star_test: RuntimeError
 vm/type_vm_test/28: MissingRuntimeError
 vm/type_vm_test/29: MissingRuntimeError
 vm/type_vm_test/30: MissingRuntimeError
@@ -410,13 +406,6 @@
 assertion_initializer_const_error2_test/cc11: Crash
 async_await_test: RuntimeError
 async_return_types_test/nestedFuture: Fail
-async_star/async_star_cancel_test: DartkCrash
-async_star/async_star_invalid_test/01: DartkCrash
-async_star/async_star_invalid_test/02: DartkCrash
-async_star/async_star_invalid_test/03: DartkCrash
-async_star/async_star_invalid_test/04: DartkCrash
-async_star/async_star_invalid_test/none: DartkCrash
-async_star/async_star_test: DartkCrash
 compile_time_constant_checked_test/02: MissingCompileTimeError
 covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index 6b7afa9..858a0572 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -36,13 +36,4 @@
 vm/no_such_args_error_message_vm_test: Skip
 vm/no_such_method_error_message_callable_vm_test: Skip
 vm/no_such_method_error_message_vm_test: Skip
-vm/regress_28325_test: Skip
-
-[ $runtime == dart_precompiled && ($compiler == dartkp || $compiler == precompiler) ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_invalid_test/01: MissingCompileTimeError
-async_star/async_star_invalid_test/02: MissingCompileTimeError
-async_star/async_star_invalid_test/04: MissingCompileTimeError
-async_star/async_star_invalid_test/none: RuntimeError
-async_star/async_star_test: RuntimeError
+vm/regress_28325_test: Skip
\ No newline at end of file
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 47d27f2..b696b0f 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -18,9 +18,6 @@
 set_literals/*: Skip
 
 [ $runtime == vm ]
-async_star/async_star_await_for_test: RuntimeError
-async_star/async_star_cancel_test: RuntimeError
-async_star/async_star_test: RuntimeError
 set_literals/*: Skip
 
 [ $arch == arm64 && $runtime == vm ]
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 2935167..081a84f 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -215,7 +215,7 @@
 io/http_advanced_test: Skip # Timeout
 io/http_auth_digest_test: Crash
 io/http_auth_test: Skip # Timeout
-io/http_basic_test: Pass, Crash # Sporadic crash, issue 33824
+io/http_basic_test: Pass, Timeout # Issue 28046
 io/http_proxy_advanced_test: Skip # Timeout
 io/http_read_test: Skip # Timeout
 io/non_utf8_directory_test: Pass, Timeout
diff --git a/tools/VERSION b/tools/VERSION
index e1cbe2b..146c6cc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 2
 PATCH 0
 PRERELEASE 1
-PRERELEASE_PATCH 0
+PRERELEASE_PATCH 1
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 04dd2fc..13ccd28 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -9,6 +9,7 @@
 patched_sdk_dir = "$target_gen_dir/patched_sdk"
 sdk_summary = "$target_gen_dir/ddc_sdk.sum"
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
+sdk_libraries_json = "$target_gen_dir/libraries.json"
 
 application_snapshot("dartdevc") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
@@ -48,7 +49,7 @@
     ":dartdevk_sdk",
   ]
 
-  inputs = [ sdk_dill ]
+  inputs = [ sdk_dill, sdk_libraries_json ]
 }
 
 sdk_lib_files = exec_script("../../tools/list_dart_files.py",
@@ -269,6 +270,7 @@
 
   inputs = [
     sdk_dill,
+    sdk_libraries_json,
     sdk_summary,
     "$target_gen_dir/dartdevc_files.stamp",
     "$root_gen_dir/pkg_files.stamp",
@@ -348,6 +350,7 @@
 
   outputs = [
     sdk_dill,
+    sdk_libraries_json,
     "$target_gen_dir/kernel/amd/dart_sdk.js",
     "$target_gen_dir/kernel/amd/dart_sdk.js.map",
     "$target_gen_dir/kernel/common/dart_sdk.js",