Introduce Art-10 bot

Bug: 144966342
Change-Id: Idf9b737d92ddc4f596248e885c117fc45cbba43b
diff --git a/.gitignore b/.gitignore
index ddab9db..e64324a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -153,6 +153,8 @@
 tools/*/art-8.1.0.tar.gz
 tools/*/art-9.0.0
 tools/*/art-9.0.0.tar.gz
+tools/*/art-10.0.0
+tools/*/art-10.0.0.tar.gz
 tools/*/art.tar.gz
 tools/*/dalvik
 tools/*/dalvik-4.0.4
diff --git a/build.gradle b/build.gradle
index 2e64458..8f323aa 100644
--- a/build.gradle
+++ b/build.gradle
@@ -332,6 +332,7 @@
                 "linux/art-7.0.0",
                 "linux/art-8.1.0",
                 "linux/art-9.0.0",
+                "linux/art-10.0.0",
                 "linux/dalvik",
                 "linux/dalvik-4.0.4",
                 "${osString}/dx",
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 75398ad..87562ad 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -281,6 +281,24 @@
       }
     }
     builders {
+      name: "linux-android-10.0.0"
+      mixins: "linux"
+      mixins: "normal"
+      recipe {
+        properties: "tool:r8"
+        properties: "dex_vm:10.0.0"
+      }
+    }
+    builders {
+      name: "linux-android-10.0.0_release"
+      mixins: "linux"
+      mixins: "normal"
+      recipe {
+        properties: "tool:r8"
+        properties: "dex_vm:10.0.0"
+      }
+    }
+    builders {
       name: "linux-internal"
       mixins: "linux"
       mixins: "internal"
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 7bdd5c2..faf51f3 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -51,6 +51,11 @@
     short_name: "9.0.0"
   }
   builders {
+    name: "buildbucket/luci.r8.ci/linux-android-10.0.0"
+    category: "R8"
+    short_name: "10.0.0"
+  }
+  builders {
     name: "buildbucket/luci.r8.ci/linux-internal"
     category: "R8"
     short_name: "internal"
@@ -131,6 +136,11 @@
     short_name: "9.0.0"
   }
   builders {
+    name: "buildbucket/luci.r8.ci/linux-android-10.0.0_release"
+    category: "R8 release"
+    short_name: "10.0.0"
+  }
+  builders {
     name: "buildbucket/luci.r8.ci/linux-internal_release"
     category: "R8 release"
     short_name: "internal"
diff --git a/infra/config/global/luci-notify.cfg b/infra/config/global/luci-notify.cfg
index bcd03ba..5e37d53 100644
--- a/infra/config/global/luci-notify.cfg
+++ b/infra/config/global/luci-notify.cfg
@@ -104,6 +104,16 @@
     repository: "https://r8.googlesource.com/r8"
   }
   builders {
+    name: "linux-android-10.0.0"
+    bucket: "ci"
+    repository: "https://r8.googlesource.com/r8"
+  }
+  builders {
+    name: "linux-android-10.0.0_release"
+    bucket: "ci"
+    repository: "https://r8.googlesource.com/r8"
+  }
+  builders {
     name: "linux-internal"
     bucket: "ci"
     repository: "https://r8.googlesource.com/r8"
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg
index dd8fdfa..dd2df27 100644
--- a/infra/config/global/luci-scheduler.cfg
+++ b/infra/config/global/luci-scheduler.cfg
@@ -34,6 +34,7 @@
   triggers: "linux-android-7.0.0"
   triggers: "linux-android-8.1.0"
   triggers: "linux-android-9.0.0"
+  triggers: "linux-android-10.0.0"
   triggers: "linux-run-on-as-app"
   triggers: "linux-run-on-as-app-recompilation"
   triggers: "linux-internal"
@@ -77,6 +78,17 @@
   triggers: "windows_release"
 }
 
+trigger {
+  id: "branch-gitiles-trigger-10"
+  acl_sets: "default"
+  gitiles: {
+    repo: "https://r8.googlesource.com/r8"
+    refs: "refs/heads/2.0"
+    path_regexps: "src/main/java/com/android/tools/r8/Version.java"
+  }
+  triggers: "linux-android-10.0.0_release"
+}
+
 
 job {
   id: "archive"
@@ -301,6 +313,32 @@
 }
 
 job {
+  id: "linux-android-10.0.0"
+  acl_sets: "default"
+  triggering_policy: {
+    max_concurrent_invocations: 2
+  }
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.r8.ci"
+    builder: "linux-android-10.0.0"
+  }
+}
+
+job {
+  id: "linux-android-10.0.0_release"
+  acl_sets: "default"
+  triggering_policy: {
+    max_concurrent_invocations: 2
+  }
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.r8.ci"
+    builder: "linux-android-10.0.0_release"
+  }
+}
+
+job {
   id: "linux-internal"
   acl_sets: "default"
   buildbucket {
diff --git a/scripts/update-host-art.sh b/scripts/update-host-art.sh
index fb45744..76572e0 100755
--- a/scripts/update-host-art.sh
+++ b/scripts/update-host-art.sh
@@ -109,7 +109,10 @@
 # dalvikvm32 or dalvikvm64).
 cp $ANDROID_HOST_BUILD/bin/dalvikvm $DEST/bin
 cp $ANDROID_HOST_BUILD/bin/dex2oat $DEST/bin
-cp $ANDROID_HOST_BUILD/bin/patchoat $DEST/bin
+if [ -e $ANDROID_HOST_BUILD/bin/patchoat ]
+  # File patchoat does not exist on Q anymore.
+  then cp $ANDROID_HOST_BUILD/bin/patchoat $DEST/bin
+fi
 
 # Required framework files.
 mkdir -p $DEST/framework
@@ -127,8 +130,13 @@
 cp -r $ANDROID_TARGET_BUILD/product/$ANDROID_PRODUCT/system/framework/* $DEST/product/$ANDROID_PRODUCT/system/framework
 
 # Required auxillary files.
-mkdir -p $DEST/usr/icu
-cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu
+if [ -e $ANDROID_HOST_BUILD/usr/icu ]; then
+  mkdir -p $DEST/usr/icu
+  cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu
+else
+  mkdir -p $DEST/com.android.runtime/etc/icu/
+  cp -r $ANDROID_HOST_BUILD/com.android.runtime/etc/icu/* $DEST/com.android.runtime/etc/icu/
+fi
 
 # Update links for vdex files for Android P and later.
 if [ -f $DEST/product/$ANDROID_PRODUCT/system/framework/boot.vdex ]; then
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 7b7f270..7e24591 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -102,7 +102,8 @@
       DexVm.Version.V6_0_1,
       DexVm.Version.V7_0_0,
       DexVm.Version.V8_1_0,
-      DexVm.Version.V9_0_0);
+      DexVm.Version.V9_0_0,
+      DexVm.Version.V10_0_0);
 
   // Input jar for jctf tests.
   private static final String JCTF_COMMON_JAR = "build/libs/jctfCommon.jar";
@@ -478,6 +479,14 @@
   static {
     ImmutableMap.Builder<DexVm.Version, List<String>> builder = ImmutableMap.builder();
     builder
+        .put(DexVm.Version.V10_0_0, ImmutableList.of(
+            // TODO(b/144975341): Triage, Verif error.
+            "518-null-array-get",
+            // TODO(b/144975341): Triage, Linking error.
+            "457-regs",
+            "543-env-long-ref",
+            "454-get-vreg"
+        ))
         .put(DexVm.Version.V9_0_0, ImmutableList.of(
             // TODO(120400625): Triage.
             "454-get-vreg",
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index 70e545e..d72ba77 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -24,6 +24,7 @@
     ART_V7_0_0,
     ART_V8_1_0,
     ART_V9_0_0,
+    ART_V10_0_0,
     ART_DEFAULT,
     JAVA;
 
@@ -46,6 +47,8 @@
           return ART_V8_1_0;
         case V9_0_0:
           return ART_V9_0_0;
+        case V10_0_0:
+          return ART_V10_0_0;
         case DEFAULT:
           return ART_DEFAULT;
         default:
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 43d08bc..772648ce 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -225,6 +225,8 @@
     ART_8_1_0_HOST(Version.V8_1_0, Kind.HOST),
     ART_9_0_0_TARGET(Version.V9_0_0, Kind.TARGET),
     ART_9_0_0_HOST(Version.V9_0_0, Kind.HOST),
+    ART_10_0_0_TARGET(Version.V10_0_0, Kind.TARGET),
+    ART_10_0_0_HOST(Version.V10_0_0, Kind.HOST),
     ART_DEFAULT(Version.DEFAULT, Kind.HOST);
 
     private static final ImmutableMap<String, DexVm> SHORT_NAME_MAP =
@@ -240,6 +242,7 @@
       V7_0_0("7.0.0"),
       V8_1_0("8.1.0"),
       V9_0_0("9.0.0"),
+      V10_0_0("10.0.0"),
       DEFAULT("default");
 
       Version(String shortName) {
@@ -532,6 +535,7 @@
   private static final Map<DexVm, String> ART_DIRS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "art")
+          .put(DexVm.ART_10_0_0_HOST, "art-10.0.0")
           .put(DexVm.ART_9_0_0_HOST, "art-9.0.0")
           .put(DexVm.ART_8_1_0_HOST, "art-8.1.0")
           .put(DexVm.ART_7_0_0_HOST, "art-7.0.0")
@@ -542,6 +546,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_10_0_0_HOST, "bin/art")
           .put(DexVm.ART_9_0_0_HOST, "bin/art")
           .put(DexVm.ART_8_1_0_HOST, "bin/art")
           .put(DexVm.ART_7_0_0_HOST, "bin/art")
@@ -551,12 +556,13 @@
           .put(DexVm.ART_4_0_4_HOST, "bin/dalvik").build();
 
   private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
-      ImmutableMap.of(
-          DexVm.ART_DEFAULT, "bin/art",
-          DexVm.ART_9_0_0_HOST, "bin/art",
-          DexVm.ART_8_1_0_HOST, "bin/art",
-          DexVm.ART_7_0_0_HOST, "bin/art",
-          DexVm.ART_6_0_1_HOST, "bin/art");
+      ImmutableMap.<DexVm, String>builder()
+          .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_10_0_0_HOST, "bin/art")
+          .put(DexVm.ART_9_0_0_HOST, "bin/art")
+          .put(DexVm.ART_8_1_0_HOST, "bin/art")
+          .put(DexVm.ART_7_0_0_HOST, "bin/art")
+          .put(DexVm.ART_6_0_1_HOST, "bin/art").build();
 
   private static final List<String> DALVIK_BOOT_LIBS =
       ImmutableList.of(
@@ -576,6 +582,7 @@
     ImmutableMap.Builder<DexVm, List<String>> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, ART_BOOT_LIBS)
+        .put(DexVm.ART_10_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_9_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_8_1_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_7_0_0_HOST, ART_BOOT_LIBS)
@@ -592,6 +599,7 @@
     ImmutableMap.Builder<DexVm, String> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, "angler")
+        .put(DexVm.ART_10_0_0_HOST, "coral")
         .put(DexVm.ART_9_0_0_HOST, "marlin")
         .put(DexVm.ART_8_1_0_HOST, "marlin")
         .put(DexVm.ART_7_0_0_HOST, "angler")
@@ -899,6 +907,8 @@
     switch (dexVm.version) {
       case DEFAULT:
         return AndroidApiLevel.O;
+      case V10_0_0:
+        return AndroidApiLevel.Q;
       case V9_0_0:
         return AndroidApiLevel.P;
       case V8_1_0:
@@ -1782,6 +1792,7 @@
   public static ProcessResult runDex2OatRaw(Path file, Path outFile, DexVm vm) throws IOException {
     // TODO(jmhenaff): find a way to run this on windows (push dex and run on device/emulator?)
     Assume.assumeTrue(ToolHelper.isDex2OatSupported());
+    Assume.assumeFalse("b/144975341", vm.version == DexVm.Version.V10_0_0);
     if (vm.isOlderThanOrEqual(DexVm.ART_4_4_4_HOST)) {
       // Run default dex2oat for tests on dalvik runtimes.
       vm = DexVm.ART_DEFAULT;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugaredlibraryjdktests/Jdk11ConcurrentMapTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugaredlibraryjdktests/Jdk11ConcurrentMapTests.java
index 5a1fd0f..ff779f5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugaredlibraryjdktests/Jdk11ConcurrentMapTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugaredlibraryjdktests/Jdk11ConcurrentMapTests.java
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Assume;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -105,6 +106,8 @@
   public void testD8Concurrent() throws Exception {
     // TODO(b/134732760): Support Java 9+ libraries.
     // We skip the ConcurrentRemoveIf test because of the  non desugared class CompletableFuture.
+    Assume.assumeFalse("b/144975341",
+        parameters.getRuntime().asDex().getVm().getVersion() == Version.V10_0_0);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String verbosity = "2";
     testForD8()
@@ -160,6 +163,8 @@
 
   @Test
   public void testD8ConcurrentHash() throws Exception {
+    Assume.assumeFalse("b/144975341",
+        parameters.getRuntime().asDex().getVm().getVersion() == Version.V10_0_0);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String verbosity = "2";
     D8TestCompileResult d8TestCompileResult =
diff --git a/tools/linux/README.art-versions b/tools/linux/README.art-versions
index 095872b..9cf0717 100644
--- a/tools/linux/README.art-versions
+++ b/tools/linux/README.art-versions
@@ -41,6 +41,28 @@
   repo init -u https://android.googlesource.com/platform/manifest -m aosp_master_manifest.xml
   <continue with repo sync as above>
 
+art-10.0.0 (Android Q)
+---------------------
+Build from branch android-10.0.0_r14.
+
+export BRANCH=android-10.0.0_r14
+mkdir ${BRANCH}
+cd ${BRANCH}
+repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
+repo sync -cq -j24
+source build/envsetup.sh
+lunch aosp_coral-userdebug
+m -j24
+m -j24 build-art
+m -j24 test-art-host
+
+Collected into tools/linux/art-10.0.0.
+
+  cd <r8 checkout>
+  scripts/update-host-art.sh \
+     --android-checkout /usr/local/ssd/android/${BRANCH} \
+     --art-dir art-10.0.0 \
+     --android-product coral
 
 art-9.0.0 (Android P)
 ---------------------
diff --git a/tools/linux/art-10.0.0.tar.gz.sha1 b/tools/linux/art-10.0.0.tar.gz.sha1
new file mode 100644
index 0000000..d64a0d7
--- /dev/null
+++ b/tools/linux/art-10.0.0.tar.gz.sha1
@@ -0,0 +1 @@
+04316aaf3b05ebfe17a35ea5f47d900ac3c32d69
\ No newline at end of file
diff --git a/tools/test.py b/tools/test.py
index a51f89a..5a8d29f 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -22,6 +22,7 @@
 
 ALL_ART_VMS = [
     "default",
+    "10.0.0",
     "9.0.0",
     "8.1.0",
     "7.0.0",