Art versions in the directory, and where they were build from
-------------------------------------------------------------

See https://source.android.com/source/build-numbers.html for build numbers.

Device names:

  angler: Nexus 6P
  mako: Nexus 4


art (default)
-------------
Build from AOSP branch master. To update to a new AOSP master

  mkdir master
  cd master
  repo init -u https://android.googlesource.com/platform/manifest -b master
  repo sync -cq -j24
  source build/envsetup.sh
  lunch aosp_angler-eng
  m -j24
  m -j24 build-art
  m -j24 test-art-host

Collected into tools/linux/art

  scripts/update-host-art.sh --android-checkout ~/android/master --art-dir art

The precise info for the AOSP master used is in aosp_master_manifest.xml, which is
produced using this command:

  repo manifest -o aosp_master_manifest.xml -r

To reproduce that AOSP state, use the following commands:

  mkdir master
  cd master
  mkdir -p .repo/manifests
  cp <r8-checkout>/aosp_master_manifest.xml .repo/manifests
  repo init -u https://android.googlesource.com/platform/manifest -m aosp_master_manifest.xml
  <continue with repo sync as above>


art-master (Currently Android U)
--------------------------------
Build from master, build spec included. Art at 31b98e9ce8fbb56c3507c8e7718881efa1ce9f63.

repo sync -cq -j24
source build/envsetup.sh
lunch aosp_redfin-userdebug
m -j48
m -j48 build-art
m -j48 test-art-host
repo manifest -r -o build_spec.xml

Collected into tools/linux/host/art-master. The "host" path element is checked
by the script for running Art.

  cd <r8 checkout>
  scripts/update-host-art.sh \
     --android-checkout <...>/android/tm-dev \
     --art-dir host/art-master \
     --android-product redfin

(cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-master)

art-13 (Android T)
------------------
Build branch android-13.0.0_r3.

export BRANCH=android-13.0.0_r3
mkdir ${BRANCH}
cd ${BRANCH}
repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
repo sync -cq -j48
source build/envsetup.sh
lunch aosp_redfin-userdebug
USE_RBE=false m -j48
USE_RBE=false m -j48 build-art
USE_RBE=false m -j48 test-art-host

Collected into tools/linux/host/art-13. The "host" path element is checked
by the script for running Art.

  cd <r8 checkout>
  scripts/update-host-art.sh \
     --android-checkout <...>/android-13.0.0_r3 \
     --art-dir host/art-13 \
     --android-product redfin

  (cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-13)

art-12.0.0 (Android S)
---------------------
Build from branch sc-beta4-release.

export BRANCH=sc-beta4-release
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_redfin-userdebug
m -j48
m -j48 build-art
m -j48 test-art-host

Collected into tools/linux/host/art-12.0.0-beta4. The "host" path element is checked
by the script for running Art.

  cd <r8 checkout>
  scripts/update-host-art.sh \
     --android-checkout /usr/local/ssd/android/${BRANCH} \
     --art-dir host/art-12.0.0-beta4 \
     --android-product redfin

(cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-12.0.0-beta4)

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)
---------------------
Build from branch android-9.0.0_r18.

export BRANCH=android-9.0.0_r18
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_marlin-userdebug
m -j24
m -j24 build-art
m -j24 test-art-host

Collected into tools/linux/art-9.0.0.

  cd <r8 checkout>
  scripts/update-host-art.sh \
    --android-checkout /usr/local/ssd/android/${BRANCH} \
    --art-dir art-9.0.0 \
    --android-product marlin

art-8.1.0 (Android O MR1)
-------------------------
Build from branch android-8.1.0_r51.

export BRANCH=android-8.1.0_r51
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_marlin-userdebug
m -j24
m -j24 build-art
m -j24 test-art-host

Collected into tools/linux/art-8.1.0.

  cd <r8 checkout>
  scripts/update-host-art.sh \
    --android-checkout /usr/local/ssd/android/${BRANCH} \
    --art-dir art-8.1.0 \
    --android-product marlin

art-7.0.0
---------
Build from branch android-7.0.0_r21 with the following patch:

diff --git a/runtime/thread.cc b/runtime/thread.cc
index 16f30cded..acdd995e9 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -554,6 +554,12 @@ void Thread::InstallImplicitProtection() {
   // AddressSanitizer does not like the part of this functions that reads every stack page.
   // Looks a lot like an out-of-bounds access.
 
+  //
+  // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+  // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+  // thus have to move the stack pointer. We do this portably by using a recursive function with a
+  // large stack frame size.
+
   // (Defensively) first remove the protection on the protected region as will want to read
   // and write it. Ignore errors.
   UnprotectStack();
@@ -561,12 +567,26 @@ void Thread::InstallImplicitProtection() {
   VLOG(threads) << "Need to map in stack for thread at " << std::hex <<
       static_cast<void*>(pregion);
 
-  // Read every page from the high address to the low.
-  volatile uint8_t dont_optimize_this;
-  UNUSED(dont_optimize_this);
-  for (uint8_t* p = stack_top; p >= pregion; p -= kPageSize) {
-    dont_optimize_this = *p;
-  }
+  struct RecurseDownStack {
+    // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+    NO_INLINE
+    static void Touch(uintptr_t target) {
+      volatile size_t zero = 0;
+      // Use a large local volatile array to ensure a large frame size. Do not use anything close
+      // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+      // there is no pragma support for this.
+      volatile char space[kPageSize - 256];
+      char sink ATTRIBUTE_UNUSED = space[zero];
+      if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+        Touch(target);
+      }
+      zero *= 2;  // Try to avoid tail recursion.
+    }
+#pragma GCC diagnostic pop
+  };
+  RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
 
   VLOG(threads) << "(again) installing stack protected region at " << std::hex <<
       static_cast<void*>(pregion) << " to " <<


  mkdir 7.0.0_r21
  cd 7.0.0_r21
  repo init -u https://android.googlesource.com/platform/manifest -b android-7.0.0_r21
  repo sync -cq -j24
  source build/envsetup.sh
  lunch aosp_angler-userdebug
  cd art
  <apply patch>
  cd ..
  m -j24
  m -j24 build-art
  m -j24 test-art-host

Collected into tools/linux/art-7.0.0.

  scripts/update-host-art.sh --android-checkout ~/android/7.0.0_r21 --art-dir art-7.0.0


art-6.0.1
---------
Build from branch android-6.0.1_r66 with the following patch:

diff --git a/runtime/thread.cc b/runtime/thread.cc
index 6e8f89cb4..788d717ca 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -357,20 +357,37 @@ void Thread::InstallImplicitProtection() {
   uint8_t* stack_top = reinterpret_cast<uint8_t*>(reinterpret_cast<uintptr_t>(&stack_himem) &
       ~(kPageSize - 1));    // Page containing current top of stack.
 
+  //
+  // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+  // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+  // thus have to move the stack pointer. We do this portably by using a recursive function with a
+  // large stack frame size.
+
   // First remove the protection on the protected region as will want to read and
   // write it.  This may fail (on the first attempt when the stack is not mapped)
   // but we ignore that.
   UnprotectStack();
 
-  // Map in the stack.  This must be done by reading from the
-  // current stack pointer downwards as the stack may be mapped using VM_GROWSDOWN
-  // in the kernel.  Any access more than a page below the current SP might cause
-  // a segv.
-
-  // Read every page from the high address to the low.
-  for (uint8_t* p = stack_top; p >= pregion; p -= kPageSize) {
-    dont_optimize_this = *p;
-  }
+  struct RecurseDownStack {
+    // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+    NO_INLINE
+    static void Touch(uintptr_t target) {
+      volatile size_t zero = 0;
+      // Use a large local volatile array to ensure a large frame size. Do not use anything close
+      // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+      // there is no pragma support for this.
+      volatile char space[kPageSize - 256];
+      char sink ATTRIBUTE_UNUSED = space[zero];
+      if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+        Touch(target);
+      }
+      zero *= 2;  // Try to avoid tail recursion.
+    }
+#pragma GCC diagnostic pop
+  };
+  RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
 
   VLOG(threads) << "installing stack protected region at " << std::hex <<
       static_cast<void*>(pregion) << " to " <<


  mkdir 6.0.1_r66
  cd 6.0.1_r66
  repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r66
  repo sync -cq -j24
  source build/envsetup.sh
  lunch aosp_angler-userdebug
  cd art
  <apply patch>
  cd ..
  m -j24
  m -j24 build-art
  m -j24 test-art-host

Collected into tools/linux/art-6.0.1.

  scripts/update-host-art.sh --android-checkout ~/android/6.0.1_r66 --art-dir art-6.0.1


art-5.1.1
---------
Build from branch 5.1.1_r19 with the following patch:

diff --git a/runtime/thread.cc b/runtime/thread.cc
index 2f474f7ae..f927ad7a3 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -257,20 +257,39 @@ void Thread::InstallImplicitProtection() {
   byte* stack_top = reinterpret_cast<byte*>(reinterpret_cast<uintptr_t>(&stack_himem) &
       ~(kPageSize - 1));    // Page containing current top of stack.
 
+  //
+  // Accesses too far below the current machine register corresponding to the stack pointer (e.g.,
+  // ESP on x86[-32], SP on ARM) might cause a SIGSEGV (at least on x86 with newer kernels). We
+  // thus have to move the stack pointer. We do this portably by using a recursive function with a
+  // large stack frame size.
+
   // First remove the protection on the protected region as will want to read and
   // write it.  This may fail (on the first attempt when the stack is not mapped)
   // but we ignore that.
   UnprotectStack();
 
-  // Map in the stack.  This must be done by reading from the
-  // current stack pointer downwards as the stack may be mapped using VM_GROWSDOWN
-  // in the kernel.  Any access more than a page below the current SP might cause
-  // a segv.
-
-  // Read every page from the high address to the low.
-  for (byte* p = stack_top; p >= pregion; p -= kPageSize) {
-    dont_optimize_this = *p;
-  }
+#define NO_INLINE __attribute__ ((noinline))
+#define ATTRIBUTE_UNUSED __attribute__((__unused__))
+  struct RecurseDownStack {
+    // This function has an intentionally large stack size.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wframe-larger-than="
+    NO_INLINE
+    static void Touch(uintptr_t target) {
+      volatile size_t zero = 0;
+      // Use a large local volatile array to ensure a large frame size. Do not use anything close
+      // to a full page for ASAN. It would be nice to ensure the frame size is at most a page, but
+      // there is no pragma support for this.
+      volatile char space[kPageSize - 256];
+      char sink ATTRIBUTE_UNUSED = space[zero];
+      if (reinterpret_cast<uintptr_t>(space) >= target + kPageSize) {
+        Touch(target);
+      }
+      zero *= 2;  // Try to avoid tail recursion.
+    }
+#pragma GCC diagnostic pop
+  };
+  RecurseDownStack::Touch(reinterpret_cast<uintptr_t>(pregion));
 
   VLOG(threads) << "installing stack protected region at " << std::hex <<
       static_cast<void*>(pregion) << " to " <<


  mkdir 5.1.1_r19
  cd 5.1.1_r19
  repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r19
  repo sync -cq -j24
  source build/envsetup.sh
  lunch aosp_mako-userdebug
  cd art
  <apply patch>
  cd ..
  m -j24
  m -j24 build-art
  m -j24 test-art-host

Collected into tools/linux/art-5.1.1.

  scripts/update-host-art.sh --android-checkout ~/android/5.1.1_r19 --art-dir art-5.1.1 --android-product mako
