| 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-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 |