blob: 03ddaa3363517272be03f743d704f8de23beb5b9 [file] [log] [blame] [edit]
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)
repo init -b udc-preview1-release
art-14 (Android U)
------------------
Build branch udc-preview1-release.
export BRANCH=udc-preview1-release
mkdir ${BRANCH}
cd ${BRANCH}
export ANDROID_CHECKOUT=$(pwd)
repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
repo sync -cq -j48
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-14.0.0-dp1. The "host" path element is checked
by the script for running Art.
cd <r8 checkout>
scripts/update-host-art.sh \
--android-checkout $ANDROID_CHECKOUT \
--art-dir host/art-14.0.0-dp1 \
--android-product redfin
(cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-14.0.0-dp1)
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.0.0 \
--android-product redfin
(cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-13.0.0)
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
The dex2oat tool expects to find core-oj.dex in out/host/linux-x86 so copy it.
(cd tools/linux/host; cp -r apex out/host/linux-x86/apex)
(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