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