diff options
Diffstat (limited to 'test')
70 files changed, 924 insertions, 180 deletions
diff --git a/test/021-string2/src/Main.java b/test/021-string2/src/Main.java index 0dd82abf6f..194f4a1a7d 100644 --- a/test/021-string2/src/Main.java +++ b/test/021-string2/src/Main.java @@ -127,6 +127,9 @@ public class Main { Assert.assertEquals("I", /* Small latin dotless i */ "\u0131".toUpperCase()); Assert.assertEquals("abc", "a\u0131c".replace('\u0131', 'b')); Assert.assertEquals("a\u0131c", "abc".replace('b', '\u0131')); + + // Regression test for scratch register exhaustion in String.equals() intrinsic on arm64. + Assert.assertFalse(result.equals("Very long constant string, so that the known constant count field cannot be embedded in a CMP immediate instruction on arm64. Since it can hold 12-bit values, optionally shifted left by 12, let's go somewhere over 2^12, i.e. 4096. That should trigger the bug with or without string compression. 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/")); } public static void testCompareToAndEquals() { diff --git a/test/155-java-set-resolved-type/src/Main.java b/test/155-java-set-resolved-type/src/Main.java index f92363e915..8f79bd7ecd 100644 --- a/test/155-java-set-resolved-type/src/Main.java +++ b/test/155-java-set-resolved-type/src/Main.java @@ -55,14 +55,10 @@ public class Main { Class<?> timpl = Class.forName("TestImplementation", false, mainLoader); // Clear the dex cache resolved types to force a proper lookup the next time // we need to find TestInterface. - // TODO: Enable clearing the dex cache when we switch to the hash-based type array - // and do a proper lookup. Currently, ClassLinker fully relies on the DexCache. - if (false) { - clearResolvedTypes(timpl); - } + clearResolvedTypes(timpl); - // Force intialization of TestClass2. This expects the interface type to be - // resolved and found through simple lookup. + // Force intialization of TestImplementation. This expects the interface type + // to be resolved and found through simple lookup. timpl.newInstance(); } catch (Throwable t) { t.printStackTrace(); diff --git a/test/157-void-class/src/Main.java b/test/157-void-class/src/Main.java index 0a052e774d..322b705f1d 100644 --- a/test/157-void-class/src/Main.java +++ b/test/157-void-class/src/Main.java @@ -35,11 +35,7 @@ public class Main { } // Clear the resolved types of the ojluni dex file to make sure there is no entry // for "V", i.e. void. - // TODO: Enable clearing the dex cache when we switch to the hash-based type array - // and do a proper lookup. Currently, ClassLinker fully relies on the DexCache. - if (false) { - clearResolvedTypes(Integer.class); - } + clearResolvedTypes(Integer.class); // With java.lang.Void being compile-time verified but uninitialized, initialize // it now. Previously, this would indirectly initialize TYPE with the current, // i.e. zero-initialized, value of TYPE. The only thing that could prevent the diff --git a/test/158-app-image-class-table/expected.txt b/test/158-app-image-class-table/expected.txt new file mode 100644 index 0000000000..6a5618ebc6 --- /dev/null +++ b/test/158-app-image-class-table/expected.txt @@ -0,0 +1 @@ +JNI_OnLoad called diff --git a/test/158-app-image-class-table/info.txt b/test/158-app-image-class-table/info.txt new file mode 100644 index 0000000000..c844c8ecd6 --- /dev/null +++ b/test/158-app-image-class-table/info.txt @@ -0,0 +1,3 @@ +Regression test for app image class table being erroneously omitted +when it contains only boot image class loader classes while dex caches +were written with references to these classes. diff --git a/test/158-app-image-class-table/profile b/test/158-app-image-class-table/profile new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/158-app-image-class-table/profile diff --git a/test/158-app-image-class-table/run b/test/158-app-image-class-table/run new file mode 100644 index 0000000000..146e180000 --- /dev/null +++ b/test/158-app-image-class-table/run @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright (C) 2017 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +exec ${RUN} $@ --profile -Xcompiler-option --compiler-filter=speed-profile diff --git a/test/158-app-image-class-table/src/Main.java b/test/158-app-image-class-table/src/Main.java new file mode 100644 index 0000000000..804468fe91 --- /dev/null +++ b/test/158-app-image-class-table/src/Main.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + public static String TEST_NAME = "158-app-image-class-table"; + + public static void main(String[] args) { + try { + Class<?> class_loader_class = Class.forName("dalvik.system.PathClassLoader"); + System.loadLibrary(args[0]); + } catch (ClassNotFoundException e) { + usingRI = true; + // Add expected JNI_OnLoad log line to match expected.txt. + System.out.println("JNI_OnLoad called"); + } + try { + // Resolve but do not initialize TestImplementation. During the resolution, + // we see the Cloneable in the dex cache, so we do not try to look it up + // or resolve it. + Class<?> timpl = + Class.forName("TestImplementation", false, Main.class.getClassLoader()); + // Clear the dex cache resolved types to force a proper lookup the next time + // we need to find TestInterface. + clearResolvedTypes(timpl); + // Force intialization of TestImplementation. This expects the interface type + // to be resolved and found through simple lookup. + timpl.newInstance(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public static void clearResolvedTypes(Class<?> c) { + if (!usingRI) { + nativeClearResolvedTypes(c); + } + } + + private static boolean usingRI = false; + + public static native void nativeClearResolvedTypes(Class<?> c); +} diff --git a/test/158-app-image-class-table/src/TestImplementation.java b/test/158-app-image-class-table/src/TestImplementation.java new file mode 100644 index 0000000000..558e58772f --- /dev/null +++ b/test/158-app-image-class-table/src/TestImplementation.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class TestImplementation implements Cloneable { + public Object clone() { + return new TestImplementation(); + } +} diff --git a/test/626-const-class-linking/clear_dex_cache_types.cc b/test/626-const-class-linking/clear_dex_cache_types.cc index b35dff48ee..e1af02edfd 100644 --- a/test/626-const-class-linking/clear_dex_cache_types.cc +++ b/test/626-const-class-linking/clear_dex_cache_types.cc @@ -27,7 +27,8 @@ extern "C" JNIEXPORT void JNICALL Java_Main_nativeClearResolvedTypes(JNIEnv*, jc ScopedObjectAccess soa(Thread::Current()); mirror::DexCache* dex_cache = soa.Decode<mirror::Class>(cls)->GetDexCache(); for (size_t i = 0, num_types = dex_cache->NumResolvedTypes(); i != num_types; ++i) { - dex_cache->SetResolvedType(dex::TypeIndex(i), ObjPtr<mirror::Class>(nullptr)); + mirror::TypeDexCachePair cleared(nullptr, mirror::TypeDexCachePair::InvalidIndexForSlot(i)); + dex_cache->GetResolvedTypes()[i].store(cleared, std::memory_order_relaxed); } } diff --git a/test/642-fp-callees/expected.txt b/test/642-fp-callees/expected.txt new file mode 100644 index 0000000000..77a1486479 --- /dev/null +++ b/test/642-fp-callees/expected.txt @@ -0,0 +1,2 @@ +JNI_OnLoad called +Done diff --git a/test/642-fp-callees/fp_callees.cc b/test/642-fp-callees/fp_callees.cc new file mode 100644 index 0000000000..600f9690eb --- /dev/null +++ b/test/642-fp-callees/fp_callees.cc @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "base/casts.h" +#include "base/logging.h" +#include "jni.h" + +namespace art { + +// Make the array volatile, which is apparently making the C compiler +// use FP registers in the method below. +volatile double array[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 }; + +extern "C" JNIEXPORT void JNICALL Java_Main_holdFpTemporaries(JNIEnv* env, jclass cls) { + jmethodID mid = env->GetStaticMethodID(cls, "caller", "(IIJ)V"); + CHECK(mid != nullptr); + // Load values from the arrays, which will be loaded in callee-save FP registers. + double a = array[0]; + double b = array[1]; + double c = array[2]; + double d = array[3]; + double e = array[4]; + double f = array[5]; + double g = array[6]; + double h = array[7]; + double i = array[8]; + double j = array[9]; + double k = array[10]; + double l = array[11]; + env->CallStaticVoidMethod(cls, mid, 1, 1, 1L); + // Load it in a temporary to please C compiler with bit_cast. + double temp = array[0]; + CHECK_EQ(bit_cast<int64_t>(a), bit_cast<int64_t>(temp)); + temp = array[1]; + CHECK_EQ(bit_cast<int64_t>(b), bit_cast<int64_t>(temp)); + temp = array[2]; + CHECK_EQ(bit_cast<int64_t>(c), bit_cast<int64_t>(temp)); + temp = array[3]; + CHECK_EQ(bit_cast<int64_t>(d), bit_cast<int64_t>(temp)); + temp = array[4]; + CHECK_EQ(bit_cast<int64_t>(e), bit_cast<int64_t>(temp)); + temp = array[5]; + CHECK_EQ(bit_cast<int64_t>(f), bit_cast<int64_t>(temp)); + temp = array[6]; + CHECK_EQ(bit_cast<int64_t>(g), bit_cast<int64_t>(temp)); + temp = array[7]; + CHECK_EQ(bit_cast<int64_t>(h), bit_cast<int64_t>(temp)); + temp = array[8]; + CHECK_EQ(bit_cast<int64_t>(i), bit_cast<int64_t>(temp)); + temp = array[9]; + CHECK_EQ(bit_cast<int64_t>(j), bit_cast<int64_t>(temp)); + temp = array[10]; + CHECK_EQ(bit_cast<int64_t>(k), bit_cast<int64_t>(temp)); + temp = array[11]; + CHECK_EQ(bit_cast<int64_t>(l), bit_cast<int64_t>(temp)); +} + +} // namespace art diff --git a/test/642-fp-callees/info.txt b/test/642-fp-callees/info.txt new file mode 100644 index 0000000000..d3e4bdac50 --- /dev/null +++ b/test/642-fp-callees/info.txt @@ -0,0 +1,2 @@ +Regression test for vixl32 backend, which used to incorrectly +use D14 as a temporary register. diff --git a/test/642-fp-callees/src/Main.java b/test/642-fp-callees/src/Main.java new file mode 100644 index 0000000000..fa57c93eda --- /dev/null +++ b/test/642-fp-callees/src/Main.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + public static void main(String[] args) { + System.loadLibrary(args[0]); + holdFpTemporaries(); + System.out.println("Done"); + } + + public static void caller(int a, int b, long c) { + $noinline$callee(a, b, c); + } + + // This method is "no inline", in order to generate the + // bad floating point use at the call site. + public static void $noinline$callee(int a, int b, long c) { + } + + public native static void holdFpTemporaries(); +} diff --git a/test/701-easy-div-rem/build b/test/701-easy-div-rem/build index 666fe895b5..d83ee82b47 100644 --- a/test/701-easy-div-rem/build +++ b/test/701-easy-div-rem/build @@ -21,12 +21,4 @@ set -e mkdir src python ./genMain.py -# Increase the file size limitation for classes.lst as the machine generated -# source file contains a lot of methods and is quite large. - -# Jack generates big temp files so only apply ulimit for dx. -if [ ${USE_JACK} = "false" ]; then - ulimit -S 4096 -fi - ./default-build diff --git a/test/901-hello-ti-agent/basics.cc b/test/901-hello-ti-agent/basics.cc index 0b17656303..91662770be 100644 --- a/test/901-hello-ti-agent/basics.cc +++ b/test/901-hello-ti-agent/basics.cc @@ -20,7 +20,7 @@ #include <stdio.h> #include <string.h> #include "base/macros.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/903-hello-tagging/tagging.cc b/test/903-hello-tagging/tagging.cc index 6177263cd2..b85ed48930 100644 --- a/test/903-hello-tagging/tagging.cc +++ b/test/903-hello-tagging/tagging.cc @@ -25,7 +25,7 @@ #include "art_method-inl.h" #include "base/logging.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" #include "utils.h" diff --git a/test/904-object-allocation/tracking.cc b/test/904-object-allocation/tracking.cc index 95eab0c6cc..cc6f681d79 100644 --- a/test/904-object-allocation/tracking.cc +++ b/test/904-object-allocation/tracking.cc @@ -21,7 +21,7 @@ #include "base/logging.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/905-object-free/tracking_free.cc b/test/905-object-free/tracking_free.cc index 7b26d79edb..5eed4729af 100644 --- a/test/905-object-free/tracking_free.cc +++ b/test/905-object-free/tracking_free.cc @@ -21,7 +21,7 @@ #include "base/logging.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/906-iterate-heap/iterate_heap.cc b/test/906-iterate-heap/iterate_heap.cc index 13c3562b60..f2532debfb 100644 --- a/test/906-iterate-heap/iterate_heap.cc +++ b/test/906-iterate-heap/iterate_heap.cc @@ -26,7 +26,7 @@ #include "android-base/stringprintf.h" #include "base/logging.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedPrimitiveArray.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/907-get-loaded-classes/get_loaded_classes.cc b/test/907-get-loaded-classes/get_loaded_classes.cc index 5bda7ebac8..48ce2e2de1 100644 --- a/test/907-get-loaded-classes/get_loaded_classes.cc +++ b/test/907-get-loaded-classes/get_loaded_classes.cc @@ -21,7 +21,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" diff --git a/test/908-gc-start-finish/gc_callbacks.cc b/test/908-gc-start-finish/gc_callbacks.cc index 8f96ee63ef..45148f87cd 100644 --- a/test/908-gc-start-finish/gc_callbacks.cc +++ b/test/908-gc-start-finish/gc_callbacks.cc @@ -19,7 +19,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/909-attach-agent/attach.cc b/test/909-attach-agent/attach.cc index adae844ef0..67c756745f 100644 --- a/test/909-attach-agent/attach.cc +++ b/test/909-attach-agent/attach.cc @@ -20,7 +20,7 @@ #include <stdio.h> #include <string.h> #include "base/macros.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" namespace art { namespace Test909AttachAgent { diff --git a/test/910-methods/methods.cc b/test/910-methods/methods.cc index f60fabb1df..fdc4cdbe04 100644 --- a/test/910-methods/methods.cc +++ b/test/910-methods/methods.cc @@ -18,7 +18,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/911-get-stack-trace/stack_trace.cc b/test/911-get-stack-trace/stack_trace.cc index 68f6d8dfb2..5a3a311255 100644 --- a/test/911-get-stack-trace/stack_trace.cc +++ b/test/911-get-stack-trace/stack_trace.cc @@ -24,7 +24,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/912-classes/classes.cc b/test/912-classes/classes.cc index 3ccfe86bed..5bd34f6be8 100644 --- a/test/912-classes/classes.cc +++ b/test/912-classes/classes.cc @@ -20,7 +20,7 @@ #include "class_linker.h" #include "jni.h" #include "mirror/class_loader.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "runtime.h" #include "ScopedLocalRef.h" #include "ScopedUtfChars.h" diff --git a/test/913-heaps/heaps.cc b/test/913-heaps/heaps.cc index 39fa000195..66fc7bef9a 100644 --- a/test/913-heaps/heaps.cc +++ b/test/913-heaps/heaps.cc @@ -28,7 +28,7 @@ #include "jit/jit.h" #include "jni.h" #include "native_stack_dump.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "runtime.h" #include "scoped_thread_state_change-inl.h" #include "thread-inl.h" diff --git a/test/918-fields/fields.cc b/test/918-fields/fields.cc index 7d29912f47..c659126aae 100644 --- a/test/918-fields/fields.cc +++ b/test/918-fields/fields.cc @@ -18,7 +18,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/920-objects/objects.cc b/test/920-objects/objects.cc index 0553a9d007..ad1431ed00 100644 --- a/test/920-objects/objects.cc +++ b/test/920-objects/objects.cc @@ -18,7 +18,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/922-properties/properties.cc b/test/922-properties/properties.cc index cb732c74f1..3fd274e9d6 100644 --- a/test/922-properties/properties.cc +++ b/test/922-properties/properties.cc @@ -18,7 +18,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/923-monitors/monitors.cc b/test/923-monitors/monitors.cc index 4baa530ec2..131fc6a4d4 100644 --- a/test/923-monitors/monitors.cc +++ b/test/923-monitors/monitors.cc @@ -18,7 +18,7 @@ #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/924-threads/threads.cc b/test/924-threads/threads.cc index 0380433d19..14ea5af60e 100644 --- a/test/924-threads/threads.cc +++ b/test/924-threads/threads.cc @@ -20,7 +20,7 @@ #include "base/macros.h" #include "base/logging.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/925-threadgroups/threadgroups.cc b/test/925-threadgroups/threadgroups.cc index 6c6e835dd3..2feaab079b 100644 --- a/test/925-threadgroups/threadgroups.cc +++ b/test/925-threadgroups/threadgroups.cc @@ -20,7 +20,7 @@ #include "base/macros.h" #include "base/logging.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/927-timers/timers.cc b/test/927-timers/timers.cc index 58d5c271e6..7b1d5c3f52 100644 --- a/test/927-timers/timers.cc +++ b/test/927-timers/timers.cc @@ -20,7 +20,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/928-jni-table/jni_table.cc b/test/928-jni-table/jni_table.cc index 5123d3a43f..b5c0efdd95 100644 --- a/test/928-jni-table/jni_table.cc +++ b/test/928-jni-table/jni_table.cc @@ -17,7 +17,7 @@ #include <stdio.h> #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "base/logging.h" #include "base/macros.h" diff --git a/test/929-search/search.cc b/test/929-search/search.cc index d1c698491e..ad7a05323b 100644 --- a/test/929-search/search.cc +++ b/test/929-search/search.cc @@ -20,7 +20,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/931-agent-thread/agent_thread.cc b/test/931-agent-thread/agent_thread.cc index a488d9a803..f8f9e48657 100644 --- a/test/931-agent-thread/agent_thread.cc +++ b/test/931-agent-thread/agent_thread.cc @@ -21,7 +21,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "runtime.h" #include "ScopedLocalRef.h" #include "thread-inl.h" diff --git a/test/933-misc-events/misc_events.cc b/test/933-misc-events/misc_events.cc index 860d4b5e16..7043350b5a 100644 --- a/test/933-misc-events/misc_events.cc +++ b/test/933-misc-events/misc_events.cc @@ -21,7 +21,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/936-search-onload/search_onload.cc b/test/936-search-onload/search_onload.cc index 2286a467d3..3b19ca591d 100644 --- a/test/936-search-onload/search_onload.cc +++ b/test/936-search-onload/search_onload.cc @@ -22,7 +22,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedUtfChars.h" #include "ti-agent/common_helper.h" diff --git a/test/944-transform-classloaders/classloader.cc b/test/944-transform-classloaders/classloader.cc index 5fbd8e11c9..7cb3c08dc3 100644 --- a/test/944-transform-classloaders/classloader.cc +++ b/test/944-transform-classloaders/classloader.cc @@ -16,8 +16,8 @@ #include "base/macros.h" #include "jni.h" +#include "jvmti.h" #include "mirror/class-inl.h" -#include "openjdkjvmti/jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" diff --git a/test/945-obsolete-native/obsolete_native.cc b/test/945-obsolete-native/obsolete_native.cc index 061e7afbbc..442836b7ff 100644 --- a/test/945-obsolete-native/obsolete_native.cc +++ b/test/945-obsolete-native/obsolete_native.cc @@ -24,7 +24,7 @@ #include "base/logging.h" #include "base/macros.h" #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" #include "ti-agent/common_helper.h" #include "ti-agent/common_load.h" diff --git a/test/958-methodhandle-emulated-stackframe/build b/test/958-methodhandle-stackframe/build index a423ca6b4e..a423ca6b4e 100755 --- a/test/958-methodhandle-emulated-stackframe/build +++ b/test/958-methodhandle-stackframe/build diff --git a/test/958-methodhandle-emulated-stackframe/expected.txt b/test/958-methodhandle-stackframe/expected.txt index 5f3825962d..5f3825962d 100644 --- a/test/958-methodhandle-emulated-stackframe/expected.txt +++ b/test/958-methodhandle-stackframe/expected.txt diff --git a/test/958-methodhandle-emulated-stackframe/info.txt b/test/958-methodhandle-stackframe/info.txt index bec2324e76..bec2324e76 100644 --- a/test/958-methodhandle-emulated-stackframe/info.txt +++ b/test/958-methodhandle-stackframe/info.txt diff --git a/test/958-methodhandle-emulated-stackframe/src/Main.java b/test/958-methodhandle-stackframe/src/Main.java index f739d47d08..f739d47d08 100644 --- a/test/958-methodhandle-emulated-stackframe/src/Main.java +++ b/test/958-methodhandle-stackframe/src/Main.java diff --git a/test/961-default-iface-resolution-gen/build b/test/961-default-iface-resolution-gen/build index ccebbe4ac9..2f7e3ba553 100755 --- a/test/961-default-iface-resolution-gen/build +++ b/test/961-default-iface-resolution-gen/build @@ -17,15 +17,6 @@ # make us exit on a failure set -e -# We will be making more files than the ulimit is set to allow. Remove it temporarily. -OLD_ULIMIT=`ulimit -S` -ulimit -S unlimited - -restore_ulimit() { - ulimit -S "$OLD_ULIMIT" -} -trap 'restore_ulimit' ERR - if [[ $@ != *"--jvm"* ]]; then # Don't do anything with jvm # Hard-wired use of experimental jack. @@ -39,6 +30,3 @@ mkdir -p ./src ./util-src/generate_java.py ./src ./expected.txt ./default-build "$@" --experimental default-methods - -# Reset the ulimit back to its initial value -restore_ulimit diff --git a/test/964-default-iface-init-gen/build b/test/964-default-iface-init-gen/build index ccebbe4ac9..2f7e3ba553 100755 --- a/test/964-default-iface-init-gen/build +++ b/test/964-default-iface-init-gen/build @@ -17,15 +17,6 @@ # make us exit on a failure set -e -# We will be making more files than the ulimit is set to allow. Remove it temporarily. -OLD_ULIMIT=`ulimit -S` -ulimit -S unlimited - -restore_ulimit() { - ulimit -S "$OLD_ULIMIT" -} -trap 'restore_ulimit' ERR - if [[ $@ != *"--jvm"* ]]; then # Don't do anything with jvm # Hard-wired use of experimental jack. @@ -39,6 +30,3 @@ mkdir -p ./src ./util-src/generate_java.py ./src ./expected.txt ./default-build "$@" --experimental default-methods - -# Reset the ulimit back to its initial value -restore_ulimit diff --git a/test/968-default-partial-compile-gen/build b/test/968-default-partial-compile-gen/build index 1e9f8aadd5..00ccb89faf 100755 --- a/test/968-default-partial-compile-gen/build +++ b/test/968-default-partial-compile-gen/build @@ -17,15 +17,6 @@ # make us exit on a failure set -e -# We will be making more files than the ulimit is set to allow. Remove it temporarily. -OLD_ULIMIT=`ulimit -S` -ulimit -S unlimited - -restore_ulimit() { - ulimit -S "$OLD_ULIMIT" -} -trap 'restore_ulimit' ERR - # TODO: Support running with jack. if [[ $@ == *"--jvm"* ]]; then @@ -45,6 +36,3 @@ else # Use the default build script ./default-build "$@" "$EXTRA_ARGS" --experimental default-methods fi - -# Reset the ulimit back to its initial value -restore_ulimit diff --git a/test/970-iface-super-resolution-gen/build b/test/970-iface-super-resolution-gen/build index fd1b271c1c..7217fac601 100755 --- a/test/970-iface-super-resolution-gen/build +++ b/test/970-iface-super-resolution-gen/build @@ -17,15 +17,6 @@ # make us exit on a failure set -e -# We will be making more files than the ulimit is set to allow. Remove it temporarily. -OLD_ULIMIT=`ulimit -S` -ulimit -S unlimited - -restore_ulimit() { - ulimit -S "$OLD_ULIMIT" -} -trap 'restore_ulimit' ERR - # Should we compile with Java source code. By default we will use Smali. USES_JAVA_SOURCE="false" if [[ $@ == *"--jvm"* ]]; then @@ -50,6 +41,3 @@ else fi ./default-build "$@" --experimental default-methods - -# Reset the ulimit back to its initial value -restore_ulimit diff --git a/test/971-iface-super/build b/test/971-iface-super/build index 1e9f8aadd5..00ccb89faf 100755 --- a/test/971-iface-super/build +++ b/test/971-iface-super/build @@ -17,15 +17,6 @@ # make us exit on a failure set -e -# We will be making more files than the ulimit is set to allow. Remove it temporarily. -OLD_ULIMIT=`ulimit -S` -ulimit -S unlimited - -restore_ulimit() { - ulimit -S "$OLD_ULIMIT" -} -trap 'restore_ulimit' ERR - # TODO: Support running with jack. if [[ $@ == *"--jvm"* ]]; then @@ -45,6 +36,3 @@ else # Use the default build script ./default-build "$@" "$EXTRA_ARGS" --experimental default-methods fi - -# Reset the ulimit back to its initial value -restore_ulimit diff --git a/test/980-redefine-object/check b/test/980-redefine-object/check new file mode 100755 index 0000000000..987066fe15 --- /dev/null +++ b/test/980-redefine-object/check @@ -0,0 +1,20 @@ +#!/bin/bash +# +# Copyright (C) 2014 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# The number of paused background threads (and therefore InterruptedExceptions) +# can change so we will just delete their lines from the log. + +sed "/Object allocated of type 'Ljava\/lang\/InterruptedException;'/d" "$2" | diff --strip-trailing-cr -q "$1" - >/dev/null diff --git a/test/980-redefine-object/expected.txt b/test/980-redefine-object/expected.txt new file mode 100644 index 0000000000..6e9bce027a --- /dev/null +++ b/test/980-redefine-object/expected.txt @@ -0,0 +1,52 @@ + Initializing and loading the TestWatcher class that will (eventually) be notified of object allocations + Allocating an j.l.Object before redefining Object class + Allocating a Transform before redefining Object class + Redefining the Object class to add a hook into the <init> method +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Allocating an j.l.Object after redefining Object class +Object allocated of type 'Ljava/lang/Object;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Allocating a Transform after redefining Object class +Object allocated of type 'LTransform;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Allocating an int[] after redefining Object class +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Allocating an array list +Object allocated of type 'Ljava/util/ArrayList;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Adding a bunch of stuff to the array list +Object allocated of type 'Ljava/lang/Object;' +Object allocated of type 'Ljava/lang/Object;' +Object allocated of type 'LTransform;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Allocating a linked list +Object allocated of type 'Ljava/util/LinkedList;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Adding a bunch of stuff to the linked list +Object allocated of type 'Ljava/lang/Object;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/lang/Object;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'LTransform;' +Object allocated of type 'Ljava/util/LinkedList$Node;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Throwing from down 4 stack frames +Object allocated of type 'Ljava/lang/Exception;' +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Exception caught. +Object allocated of type 'Ljava/lang/StringBuilder;' +Object allocated of type 'Ljava/nio/HeapCharBuffer;' + Finishing test! diff --git a/test/980-redefine-object/info.txt b/test/980-redefine-object/info.txt new file mode 100644 index 0000000000..f3e01b596d --- /dev/null +++ b/test/980-redefine-object/info.txt @@ -0,0 +1,23 @@ +Tests basic functions in the jvmti plugin. + +This tests that we are able to redefine methods/constructors on the +java.lang.Object class at runtime. + +This also (indirectly) tests that we correctly handle reading annotations on +obsolete methods. This is something that is not normally done since there is no +way to get a reference to an obsolete method outside of the runtime but some +annotations on the Object class are read by the runtime directly. + +NB This test cannot be run on the RI at the moment. + +If this test starts failing during the doCommonClassRedefinition call it is +possible that the definition of Object contained in the base64 DEX_BYTES array +has become stale and will need to be recreated. The only difference from the +normal Object dex bytes is that (a) it contains only the bytes of the Object +class itself, and (b) it adds an +'invoke-static {p0}, Ljava/lang/Object;->NotifyConstructed(Ljava/lang/Object;)V' +to the <init> function. + +It is also possible it could fail due to the pattern of allocations caused by +doing string concatenation or printing changing. In this case you should simply +update the expected.txt file. diff --git a/test/980-redefine-object/redefine_object.cc b/test/980-redefine-object/redefine_object.cc new file mode 100644 index 0000000000..daae08792a --- /dev/null +++ b/test/980-redefine-object/redefine_object.cc @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <inttypes.h> +#include <iostream> + +#include "android-base/stringprintf.h" +#include "base/logging.h" +#include "base/macros.h" +#include "jni.h" +#include "jvmti.h" +#include "ScopedUtfChars.h" + +#include "ti-agent/common_helper.h" +#include "ti-agent/common_load.h" + +namespace art { +namespace Test980RedefineObjects { + +extern "C" JNIEXPORT void JNICALL Java_Main_bindFunctionsForClass( + JNIEnv* env, jclass Main_klass ATTRIBUTE_UNUSED, jclass target) { + BindFunctionsOnClass(jvmti_env, env, target); +} + +extern "C" JNIEXPORT void JNICALL Java_art_test_TestWatcher_NotifyConstructed( + JNIEnv* env, jclass TestWatcherClass ATTRIBUTE_UNUSED, jobject constructed) { + char* sig = nullptr; + char* generic_sig = nullptr; + if (JvmtiErrorToException(env, jvmti_env->GetClassSignature(env->GetObjectClass(constructed), + &sig, + &generic_sig))) { + // Exception. + return; + } + std::cout << "Object allocated of type '" << sig << "'" << std::endl; + jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(sig)); + jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(generic_sig)); +} + +} // namespace Test980RedefineObjects +} // namespace art diff --git a/test/980-redefine-object/run b/test/980-redefine-object/run new file mode 100755 index 0000000000..c6e62ae6cd --- /dev/null +++ b/test/980-redefine-object/run @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +./default-run "$@" --jvmti diff --git a/test/980-redefine-object/src-ex/TestWatcher.java b/test/980-redefine-object/src-ex/TestWatcher.java new file mode 100644 index 0000000000..d15e68871c --- /dev/null +++ b/test/980-redefine-object/src-ex/TestWatcher.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package art.test; + +public class TestWatcher { + // NB This function is native since it is called in the Object.<init> method and so cannot cause + // any java allocations at all. The normal System.out.print* functions will cause allocations to + // occur so we cannot use them. This means the easiest way to report the object as being created + // is to go into native code and do it there. + public static native void NotifyConstructed(Object o); +} diff --git a/test/980-redefine-object/src/Main.java b/test/980-redefine-object/src/Main.java new file mode 100644 index 0000000000..348951c4ba --- /dev/null +++ b/test/980-redefine-object/src/Main.java @@ -0,0 +1,390 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.ArrayList; +import java.util.Base64; +import java.util.LinkedList; + +public class Main { + + // TODO We should make this run on the RI. + /** + * This test cannot be run on the RI. + */ + private static final byte[] CLASS_BYTES = new byte[0]; + + // TODO It might be a good idea to replace this hard-coded Object definition with a + // retransformation based test. + /** + * Base64 encoding of the following smali file. + * + * .class public Ljava/lang/Object; + * .source "Object.java" + * # instance fields + * .field private transient shadow$_klass_:Ljava/lang/Class; + * .annotation system Ldalvik/annotation/Signature; + * value = { + * "Ljava/lang/Class", + * "<*>;" + * } + * .end annotation + * .end field + * + * .field private transient shadow$_monitor_:I + * # direct methods + * .method public constructor <init>()V + * .registers 1 + * .prologue + * invoke-static {p0}, Lart/test/TestWatcher;->NotifyConstructed(Ljava/lang/Object;)V + * return-void + * .end method + * + * .method static identityHashCode(Ljava/lang/Object;)I + * .registers 7 + * .prologue + * iget v0, p0, Ljava/lang/Object;->shadow$_monitor_:I + * const/high16 v3, -0x40000000 # -2.0f + * const/high16 v2, -0x80000000 + * const v1, 0xfffffff + * const/high16 v4, -0x40000000 # -2.0f + * and-int/2addr v4, v0 + * const/high16 v5, -0x80000000 + * if-ne v4, v5, :cond_15 + * const v4, 0xfffffff + * and-int/2addr v4, v0 + * return v4 + * :cond_15 + * invoke-static {p0}, Ljava/lang/Object;->identityHashCodeNative(Ljava/lang/Object;)I + * move-result v4 + * return v4 + * .end method + * + * .method private static native identityHashCodeNative(Ljava/lang/Object;)I + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + * + * .method private native internalClone()Ljava/lang/Object; + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + * + * + * # virtual methods + * .method protected clone()Ljava/lang/Object; + * .registers 4 + * .annotation system Ldalvik/annotation/Throws; + * value = { + * Ljava/lang/CloneNotSupportedException; + * } + * .end annotation + * + * .prologue + * instance-of v0, p0, Ljava/lang/Cloneable; + * if-nez v0, :cond_2d + * new-instance v0, Ljava/lang/CloneNotSupportedException; + * new-instance v1, Ljava/lang/StringBuilder; + * invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V + * const-string/jumbo v2, "Class " + * invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v1 + * invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; + * move-result-object v2 + * invoke-virtual {v2}, Ljava/lang/Class;->getName()Ljava/lang/String; + * move-result-object v2 + * invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v1 + * const-string/jumbo v2, " doesn\'t implement Cloneable" + * invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v1 + * invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + * move-result-object v1 + * invoke-direct {v0, v1}, Ljava/lang/CloneNotSupportedException;-><init>(Ljava/lang/String;)V + * throw v0 + * :cond_2d + * invoke-direct {p0}, Ljava/lang/Object;->internalClone()Ljava/lang/Object; + * move-result-object v0 + * return-object v0 + * .end method + * + * .method public equals(Ljava/lang/Object;)Z + * .registers 3 + * .prologue + * if-ne p0, p1, :cond_4 + * const/4 v0, 0x1 + * :goto_3 + * return v0 + * :cond_4 + * const/4 v0, 0x0 + * goto :goto_3 + * .end method + * + * .method protected finalize()V + * .registers 1 + * .annotation system Ldalvik/annotation/Throws; + * value = { + * Ljava/lang/Throwable; + * } + * .end annotation + * .prologue + * return-void + * .end method + * + * .method public final getClass()Ljava/lang/Class; + * .registers 2 + * .annotation system Ldalvik/annotation/Signature; + * value = { + * "()", + * "Ljava/lang/Class", + * "<*>;" + * } + * .end annotation + * .prologue + * iget-object v0, p0, Ljava/lang/Object;->shadow$_klass_:Ljava/lang/Class; + * return-object v0 + * .end method + * + * .method public hashCode()I + * .registers 2 + * .prologue + * invoke-static {p0}, Ljava/lang/Object;->identityHashCode(Ljava/lang/Object;)I + * move-result v0 + * return v0 + * .end method + * + * .method public final native notify()V + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + * + * .method public final native notifyAll()V + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + * + * .method public toString()Ljava/lang/String; + * .registers 3 + * .prologue + * new-instance v0, Ljava/lang/StringBuilder; + * invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V + * invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; + * move-result-object v1 + * invoke-virtual {v1}, Ljava/lang/Class;->getName()Ljava/lang/String; + * move-result-object v1 + * invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v0 + * const-string/jumbo v1, "@" + * invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v0 + * invoke-virtual {p0}, Ljava/lang/Object;->hashCode()I + * move-result v1 + * invoke-static {v1}, Ljava/lang/Integer;->toHexString(I)Ljava/lang/String; + * move-result-object v1 + * invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + * move-result-object v0 + * invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + * move-result-object v0 + * return-object v0 + * .end method + * + * .method public final native wait()V + * .annotation system Ldalvik/annotation/Throws; + * value = { + * Ljava/lang/InterruptedException; + * } + * .end annotation + * + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + * + * .method public final wait(J)V + * .registers 4 + * .annotation system Ldalvik/annotation/Throws; + * value = { + * Ljava/lang/InterruptedException; + * } + * .end annotation + * .prologue + * const/4 v0, 0x0 + * invoke-virtual {p0, p1, p2, v0}, Ljava/lang/Object;->wait(JI)V + * return-void + * .end method + * + * .method public final native wait(JI)V + * .annotation system Ldalvik/annotation/Throws; + * value = { + * Ljava/lang/InterruptedException; + * } + * .end annotation + * + * .annotation build Ldalvik/annotation/optimization/FastNative; + * .end annotation + * .end method + */ + private static final byte[] DEX_BYTES = Base64.getDecoder().decode( + "ZGV4CjAzNQDUlMR9j03MYuOKekKs2p7zJzu2IfDb7RlMCgAAcAAAAHhWNBIAAAAAAAAAAIgJAAA6" + + "AAAAcAAAABEAAABYAQAADQAAAJwBAAACAAAAOAIAABYAAABIAgAAAQAAAPgCAAA0BwAAGAMAABgD" + + "AAA2AwAAOgMAAEADAABIAwAASwMAAFMDAABWAwAAWgMAAF0DAABgAwAAZAMAAGgDAACAAwAAnwMA" + + "ALsDAADoAwAA+gMAAA0EAAA1BAAATAQAAGEEAACDBAAAlwQAAKsEAADGBAAA3QQAAPAEAAD9BAAA" + + "AAUAAAQFAAAJBQAADQUAABAFAAAUBQAAHAUAACMFAAArBQAANQUAAD8FAABIBQAAUgUAAGQFAAB8" + + "BQAAiwUAAJUFAACnBQAAugUAAM0FAADVBQAA3QUAAOgFAADtBQAA/QUAAA8GAAAcBgAAJgYAAC0G" + + "AAAGAAAACAAAAAwAAAANAAAADgAAAA8AAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAA" + + "ABkAAAAcAAAAIAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAPAYAAAkAAAAGAAAAAAAAAAkAAAALAAAA" + + "AAAAAAkAAAAMAAAAAAAAAAoAAAAMAAAARAYAAAsAAAANAAAAVAYAABwAAAAPAAAAAAAAAB0AAAAP" + + "AAAATAYAAB4AAAAPAAAANAYAAB8AAAAPAAAAPAYAAB8AAAAPAAAAVAYAACEAAAAQAAAAPAYAAAsA" + + "BgA0AAAACwAAADUAAAACAAoAGgAAAAYABAAnAAAABwALAAMAAAAJAAUANgAAAAsABwADAAAACwAD" + + "ACMAAAALAAwAJAAAAAsABwAlAAAACwACACYAAAALAAAAKAAAAAsAAQApAAAACwABACoAAAALAAMA" + + "KwAAAAsABwAxAAAACwAHADIAAAALAAQANwAAAAsABwA5AAAACwAIADkAAAALAAkAOQAAAA0ABwAD" + + "AAAADQAGACIAAAANAAQANwAAAAsAAAABAAAA/////wAAAAAbAAAA0AYAAD4JAAAAAAAAHCBkb2Vz" + + "bid0IGltcGxlbWVudCBDbG9uZWFibGUAAigpAAQ8Kj47AAY8aW5pdD4AAUAABkNsYXNzIAABSQAC" + + "SUwAAUoAAUwAAkxJAAJMTAAWTGFydC90ZXN0L1Rlc3RXYXRjaGVyOwAdTGRhbHZpay9hbm5vdGF0" + + "aW9uL1NpZ25hdHVyZTsAGkxkYWx2aWsvYW5ub3RhdGlvbi9UaHJvd3M7ACtMZGFsdmlrL2Fubm90" + + "YXRpb24vb3B0aW1pemF0aW9uL0Zhc3ROYXRpdmU7ABBMamF2YS9sYW5nL0NsYXNzABFMamF2YS9s" + + "YW5nL0NsYXNzOwAmTGphdmEvbGFuZy9DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsAFUxqYXZh" + + "L2xhbmcvQ2xvbmVhYmxlOwATTGphdmEvbGFuZy9JbnRlZ2VyOwAgTGphdmEvbGFuZy9JbnRlcnJ1" + + "cHRlZEV4Y2VwdGlvbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABlM" + + "amF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7ABVMamF2YS9sYW5nL1Rocm93YWJsZTsAEU5vdGlmeUNv" + + "bnN0cnVjdGVkAAtPYmplY3QuamF2YQABVgACVkoAA1ZKSQACVkwAAVoAAlpMAAZhcHBlbmQABWNs" + + "b25lAAZlcXVhbHMACGZpbmFsaXplAAhnZXRDbGFzcwAHZ2V0TmFtZQAIaGFzaENvZGUAEGlkZW50" + + "aXR5SGFzaENvZGUAFmlkZW50aXR5SGFzaENvZGVOYXRpdmUADWludGVybmFsQ2xvbmUACGxvY2tX" + + "b3JkABBsb2NrV29yZEhhc2hNYXNrABFsb2NrV29yZFN0YXRlSGFzaAARbG9ja1dvcmRTdGF0ZU1h" + + "c2sABm1pbGxpcwAGbm90aWZ5AAlub3RpZnlBbGwAA29iagAOc2hhZG93JF9rbGFzc18AEHNoYWRv" + + "dyRfbW9uaXRvcl8AC3RvSGV4U3RyaW5nAAh0b1N0cmluZwAFdmFsdWUABHdhaXQAAAIAAAABAAAA" + + "AQAAAAsAAAABAAAAAAAAAAEAAAABAAAAAQAAAAwAAgQBOBwBGAcCBAE4HAEYCgIDATgcAhcQFwIC" + + "BAE4HAEYDgAFAAIDATgcAxcBFxAXAgAAAAAAAAAAAAEAAABaBgAAAgAAAGIGAAB8BgAAAQAAAGIG" + + "AAABAAAAagYAAAEAAAB0BgAAAQAAAHwGAAABAAAAfwYAAAAAAAABAAAACgAAAAAAAAAAAAAAsAYA" + + "AAUAAACUBgAABwAAALgGAAAIAAAAyAYAAAsAAADABgAADAAAAMAGAAANAAAAwAYAAA4AAADABgAA" + + "EAAAAJwGAAARAAAAqAYAABIAAACcBgAAKAAHDgBwATQHDi0DAC0BLQMDMAEtAwIvATwDAS4BeFsA" + + "7AEABw5LARoPOsYArAEBNAcOAMUEAAcOAEEABw4AaAAHDgCRAgAHDgCmAwExBw5LAAAAAQABAAEA" + + "AAA4BwAABAAAAHEQAAAAAA4ABwABAAEAAAA9BwAAGgAAAFJgAQAVAwDAFQIAgBQB////DxUEAMC1" + + "BBUFAIAzVAcAFAT///8PtQQPBHEQCwAGAAoEDwQEAAEAAgAAAFkHAAAyAAAAIDAIADkAKwAiAAcA" + + "IgENAHAQEwABABsCBQAAAG4gFAAhAAwBbhAIAAMADAJuEAEAAgAMAm4gFAAhAAwBGwIAAAAAbiAU" + + "ACEADAFuEBUAAQAMAXAgAgAQACcAcBAMAAMADAARAAMAAgAAAAAAZQcAAAYAAAAzIQQAEhAPABIA" + + "KP4BAAEAAAAAAGwHAAABAAAADgAAAAIAAQAAAAAAcgcAAAMAAABUEAAAEQAAAAIAAQABAAAAdwcA" + + "AAUAAABxEAoAAQAKAA8AAAADAAEAAgAAAHwHAAApAAAAIgANAHAQEwAAAG4QCAACAAwBbhABAAEA" + + "DAFuIBQAEAAMABsBBAAAAG4gFAAQAAwAbhAJAAIACgFxEAMAAQAMAW4gFAAQAAwAbhAVAAAADAAR" + + "AAAABAADAAQAAACCBwAABQAAABIAbkASACEDDgAAAgQLAIIBAYIBBIGABIwPBgikDwGKAgABggIA" + + "BQToDwEB3BABBPgQARGMEQEBpBEEkQIAAZECAAEBwBEBkQIAARGkEgGRAgAAABAAAAAAAAAAAQAA" + + "AAAAAAABAAAAOgAAAHAAAAACAAAAEQAAAFgBAAADAAAADQAAAJwBAAAEAAAAAgAAADgCAAAFAAAA" + + "FgAAAEgCAAAGAAAAAQAAAPgCAAACIAAAOgAAABgDAAABEAAABQAAADQGAAAEIAAABgAAAFoGAAAD" + + "EAAACQAAAIwGAAAGIAAAAQAAANAGAAADIAAACQAAADgHAAABIAAACQAAAIwHAAAAIAAAAQAAAD4J" + + "AAAAEAAAAQAAAIgJAAA="); + + private static final String LISTENER_LOCATION = + System.getenv("DEX_LOCATION") + "/980-redefine-object-ex.jar"; + + public static void main(String[] args) { + doTest(); + } + + private static void ensureTestWatcherInitialized() { + try { + // Make sure the TestWatcher class can be found from the Object <init> function. + addToBootClassLoader(LISTENER_LOCATION); + // Load TestWatcher from the bootclassloader and make sure it is initialized. + Class<?> testwatcher_class = Class.forName("art.test.TestWatcher", true, null); + // Bind the native functions of testwatcher_class. + bindFunctionsForClass(testwatcher_class); + } catch (Exception e) { + throw new Error("Exception while making testwatcher", e); + } + } + + // NB This function will cause 2 objects of type "Ljava/nio/HeapCharBuffer;" and + // "Ljava/nio/HeapCharBuffer;" to be allocated each time it is called. + private static void safePrintln(Object o) { + System.out.flush(); + System.out.print("\t" + o + "\n"); + System.out.flush(); + } + + private static void throwFrom(int depth) throws Exception { + if (depth <= 0) { + throw new Exception("Throwing the exception"); + } else { + throwFrom(depth - 1); + } + } + + public static void doTest() { + safePrintln("Initializing and loading the TestWatcher class that will (eventually) be " + + "notified of object allocations"); + // Make sure the TestWatcher class is initialized before we do anything else. + ensureTestWatcherInitialized(); + safePrintln("Allocating an j.l.Object before redefining Object class"); + // Make sure these aren't shown. + Object o = new Object(); + safePrintln("Allocating a Transform before redefining Object class"); + Transform t = new Transform(); + + // Redefine the Object Class. + safePrintln("Redefining the Object class to add a hook into the <init> method"); + doCommonClassRedefinition(Object.class, CLASS_BYTES, DEX_BYTES); + + safePrintln("Allocating an j.l.Object after redefining Object class"); + Object o2 = new Object(); + safePrintln("Allocating a Transform after redefining Object class"); + Transform t2 = new Transform(); + + // This shouldn't cause the Object constructor to be run. + safePrintln("Allocating an int[] after redefining Object class"); + int[] abc = new int[12]; + + // Try adding stuff to an array list. + safePrintln("Allocating an array list"); + ArrayList<Object> al = new ArrayList<>(); + safePrintln("Adding a bunch of stuff to the array list"); + al.add(new Object()); + al.add(new Object()); + al.add(o2); + al.add(o); + al.add(t); + al.add(t2); + al.add(new Transform()); + + // Try adding stuff to a LinkedList + safePrintln("Allocating a linked list"); + LinkedList<Object> ll = new LinkedList<>(); + safePrintln("Adding a bunch of stuff to the linked list"); + ll.add(new Object()); + ll.add(new Object()); + ll.add(o2); + ll.add(o); + ll.add(t); + ll.add(t2); + ll.add(new Transform()); + + // Try making an exception. + safePrintln("Throwing from down 4 stack frames"); + try { + throwFrom(4); + } catch (Exception e) { + safePrintln("Exception caught."); + } + + safePrintln("Finishing test!"); + } + + private static native void addToBootClassLoader(String s); + + private static native void bindFunctionsForClass(Class<?> target); + + // Transforms the class + private static native void doCommonClassRedefinition(Class<?> target, + byte[] class_file, + byte[] dex_file); +} diff --git a/test/980-redefine-object/src/Transform.java b/test/980-redefine-object/src/Transform.java new file mode 100644 index 0000000000..23f67d96c7 --- /dev/null +++ b/test/980-redefine-object/src/Transform.java @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class Transform { } diff --git a/test/Android.bp b/test/Android.bp index 00c890a834..4ebfd7429a 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -275,10 +275,12 @@ art_cc_defaults { "936-search-onload/search_onload.cc", "944-transform-classloaders/classloader.cc", "945-obsolete-native/obsolete_native.cc", + "980-redefine-object/redefine_object.cc", ], shared_libs: [ "libbase", ], + header_libs: ["libopenjdkjvmti_headers"], } art_cc_test_library { @@ -335,6 +337,7 @@ cc_defaults { "596-monitor-inflation/monitor_inflation.cc", "597-deopt-new-string/deopt.cc", "626-const-class-linking/clear_dex_cache_types.cc", + "642-fp-callees/fp_callees.cc", ], shared_libs: [ "libbacktrace", diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 01eb14eda2..051ee58ea8 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -374,6 +374,7 @@ TEST_ART_BROKEN_INTERPRETER_ACCESS_CHECK_TESTS := # * 961-default-iface-resolution-gen and 964-default-iface-init-genare very long tests that often # will take more than the timeout to run when gcstress is enabled. This is because gcstress # slows down allocations significantly which these tests do a lot. +# * 946-obsolete-throw: b/36335999. TEST_ART_BROKEN_GCSTRESS_RUN_TESTS := \ 137-cfi \ 152-dead-large-object \ @@ -381,7 +382,8 @@ TEST_ART_BROKEN_GCSTRESS_RUN_TESTS := \ 908-gc-start-finish \ 913-heaps \ 961-default-iface-resolution-gen \ - 964-default-iface-init-gen + 964-default-iface-init-gen \ + 946-obsolete-throw ifneq (,$(filter gcstress,$(GC_TYPES))) ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,$(TARGET_TYPES),$(RUN_TYPES),$(PREBUILD_TYPES), \ @@ -440,6 +442,9 @@ TEST_ART_BROKEN_NO_IMAGE_RUN_TESTS := \ 137-cfi \ 138-duplicate-classes-check \ 018-stack-overflow \ + 616-cha \ + 616-cha-abstract \ + 912-classes \ 961-default-iface-resolution-gen \ 964-default-iface-init \ 968-default-partial-compile-gen \ diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar index e4e571cbcf..808e58a7bd 100755 --- a/test/etc/run-test-jar +++ b/test/etc/run-test-jar @@ -444,27 +444,11 @@ fi JNI_OPTS="-Xjnigreflimit:512 -Xcheck:jni" +COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xnorelocate" if [ "$RELOCATE" = "y" ]; then - COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xnorelocate" FLAGS="${FLAGS} -Xrelocate" - if [ "$HOST" = "y" ]; then - # Run test sets a fairly draconian ulimit that we will likely blow right over - # since we are relocating. Get the total size of the /system/framework directory - # in 512 byte blocks and set it as the ulimit. This should be more than enough - # room. - if [ ! `uname` = "Darwin" ]; then # TODO: Darwin doesn't support "du -B..." - ulimit -S $(du -c -B512 ${ANDROID_HOST_OUT}/framework 2>/dev/null | tail -1 | cut -f1) || exit 1 - fi - fi else FLAGS="$FLAGS -Xnorelocate" - COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xnorelocate" -fi - -if [ "$HOST" = "y" ]; then - # Increase ulimit to 128MB in case we are running hprof test, - # or string append test with art-debug-gc. - ulimit -S 128000 || exit 1 fi if [ "$HOST" = "n" ]; then diff --git a/test/knownfailures.json b/test/knownfailures.json index 50d70f18dc..5923ebd6c6 100644 --- a/test/knownfailures.json +++ b/test/knownfailures.json @@ -103,7 +103,8 @@ { "test": "152-dead-large-object", "variant": "gcstress", - "description": ["152-dead-large-object requires a heap larger than what gcstress uses."] + "description": ["152-dead-large-object requires a heap larger than what gcstress uses."], + "bug": "http://b/35800768" }, { "tests": ["908-gc-start-finish", @@ -128,9 +129,10 @@ "variant": "gcstress" }, { - "tests": "154-gc-loop", - "variant": "gcstress | jit", - "description": ["154-gc-loop depends GC not happening too often"] + "test": "154-gc-loop", + "variant": "gcstress | jit & debug", + "description": ["154-gc-loop depends GC not happening too often"], + "bug": "http://b/35917229" }, { "test": "115-native-bridge", @@ -339,5 +341,17 @@ "641-checker-arraycopy"], "env_vars": {"ART_USE_READ_BARRIER": "true"}, "variant": "interpreter | optimizing | regalloc_gc | jit" + }, + { + "tests": "946-obsolete-throw", + "bug": "http://b/36335999", + "variant": "interp-ac & gcstress" + }, + { + "tests": ["912-classes", + "616-cha", + "616-cha-abstract"], + "bug": "http://b/36344364 http://b36344221", + "variant": "no-dex2oat | relocate-npatchoat" } ] diff --git a/test/run-test b/test/run-test index 1ac285769d..1715423a5c 100755 --- a/test/run-test +++ b/test/run-test @@ -766,27 +766,14 @@ fi run_args="${run_args} --testlib ${testlib}" -# To cause tests to fail fast, limit the file sizes created by dx, dex2oat and ART output to 2MB. -build_file_size_limit=2048 -run_file_size_limit=2048 - -# Add tests requiring a higher ulimit to this list. Ulimits might need to be raised to deal with -# large amounts of expected output or large generated files. -if echo "$test_dir" | grep -Eq "(083|089|961|964|971)" > /dev/null; then - build_file_size_limit=5120 - run_file_size_limit=5120 -fi -if [ "$run_checker" = "yes" -a "$target_mode" = "yes" ]; then - # We will need to `adb pull` the .cfg output from the target onto the host to - # run checker on it. This file can be big. - build_file_size_limit=32768 - run_file_size_limit=32768 -fi -if [ ${USE_JACK} = "false" ]; then - # Set ulimit if we build with dx only, Jack can generate big temp files. - if ! ulimit -S "$build_file_size_limit"; then - err_echo "ulimit file size setting failed" - fi +# To cause tests to fail fast, limit the file sizes created by dx, dex2oat and +# ART output to approximately 128MB. This should be more than sufficient +# for any test while still catching cases of runaway output. +# Set a hard limit to encourage ART developers to increase the ulimit here if +# needed to support a test case rather than resetting the limit in the run +# script for the particular test in question. +if ! ulimit -f -H 128000; then + err_echo "ulimit file size setting failed" fi good="no" @@ -797,9 +784,6 @@ if [ "$dev_mode" = "yes" ]; then build_exit="$?" echo "build exit status: $build_exit" 1>&2 if [ "$build_exit" = '0' ]; then - if ! ulimit -S "$run_file_size_limit"; then - err_echo "ulimit file size setting failed" - fi echo "${test_dir}: running..." 1>&2 "./${run}" $run_args "$@" 2>&1 run_exit="$?" @@ -825,9 +809,6 @@ elif [ "$update_mode" = "yes" ]; then "./${build}" $build_args >"$build_output" 2>&1 build_exit="$?" if [ "$build_exit" = '0' ]; then - if ! ulimit -S "$run_file_size_limit"; then - err_echo "ulimit file size setting failed" - fi echo "${test_dir}: running..." 1>&2 "./${run}" $run_args "$@" >"$output" 2>&1 if [ "$run_checker" = "yes" ]; then @@ -862,9 +843,6 @@ else "./${build}" $build_args >"$build_output" 2>&1 build_exit="$?" if [ "$build_exit" = '0' ]; then - if ! ulimit -S "$run_file_size_limit"; then - err_echo "ulimit file size setting failed" - fi echo "${test_dir}: running..." 1>&2 "./${run}" $run_args "$@" >"$output" 2>&1 run_exit="$?" @@ -934,9 +912,6 @@ if [ "$bisection_search" = "yes" -a "$good" != "yes" ]; then echo "${test_dir}: not bisecting, checker test." 1>&2 else # Increase file size limit, bisection search can generate large logfiles. - if ! ulimit -S unlimited; then - err_echo "ulimit file size setting failed" - fi echo "${test_dir}: bisecting..." 1>&2 cwd=`pwd` maybe_device_mode="" diff --git a/test/testrunner/run_build_test_target.py b/test/testrunner/run_build_test_target.py index 0cd1ddee7b..4c519ae7f7 100755 --- a/test/testrunner/run_build_test_target.py +++ b/test/testrunner/run_build_test_target.py @@ -14,15 +14,28 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Build and run go/ab/git_master-art-host target + +Provided with a target name, the script setup the environment for +building the test target by taking config information from +from target_config.py. + +If the target field is defined in the configuration for the target, it +invokes `make` to build the target, otherwise, it assumes +that the its is a run-test target, and invokes testrunner.py +script for building and running the run-tests. +""" + import argparse import os import subprocess +import sys from target_config import target_config import env parser = argparse.ArgumentParser() -parser.add_argument('--build-target', required=True, dest='build_target') +parser.add_argument('build_target') parser.add_argument('-j', default='1', dest='n_threads') options = parser.parse_args() @@ -49,6 +62,7 @@ else: run_test_command += target.get('flags', []) run_test_command += ['-j', str(n_threads)] run_test_command += ['-b'] + run_test_command += ['--host'] run_test_command += ['--verbose'] print run_test_command diff --git a/test/testrunner/target_config.py b/test/testrunner/target_config.py index 5387d6a8e8..1af2ae7a63 100644 --- a/test/testrunner/target_config.py +++ b/test/testrunner/target_config.py @@ -51,7 +51,8 @@ target_config = { 'flags': ['--jit', '--gcstress'], 'env' : { - 'ART_USE_READ_BARRIER' : 'false' + 'ART_USE_READ_BARRIER' : 'false', + 'ART_DEFAULT_GC_TYPE' : 'SS' } }, 'art-read-barrier' : { @@ -185,20 +186,20 @@ target_config = { } }, 'art-gtest' : { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env' : { 'ART_USE_READ_BARRIER' : 'true' } }, 'art-gtest-read-barrier': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env' : { 'ART_USE_READ_BARRIER' : 'true', 'ART_HEAP_POISONING' : 'true' } }, 'art-gtest-read-barrier-table-lookup': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env': { 'ART_USE_READ_BARRIER' : 'true', 'ART_READ_BARRIER_TYPE' : 'TABLELOOKUP', @@ -206,21 +207,21 @@ target_config = { } }, 'art-gtest-ss-gc': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env': { 'ART_DEFAULT_GC_TYPE' : 'SS', 'ART_USE_READ_BARRIER' : 'false' } }, 'art-gtest-gss-gc': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env' : { 'ART_DEFAULT_GC_TYPE' : 'GSS', 'ART_USE_READ_BARRIER' : 'false' } }, 'art-gtest-ss-gc-tlab': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env': { 'ART_DEFAULT_GC_TYPE' : 'SS', 'ART_USE_TLAB' : 'true', @@ -228,13 +229,20 @@ target_config = { } }, 'art-gtest-gss-gc-tlab': { - 'target' : 'test-art-gtest', + 'target' : 'test-art-host-gtest', 'env': { 'ART_DEFAULT_GC_TYPE' : 'GSS', 'ART_USE_TLAB' : 'true', 'ART_USE_READ_BARRIER' : 'false' } }, + 'art-gtest-debug-gc' : { + 'target' : 'test-art-host-gtest', + 'env' : { + 'ART_TEST_DEBUG_GC' : 'true', + 'ART_USE_READ_BARRIER' : 'false' + } + }, 'art-gtest-valgrind32': { 'target' : 'valgrind-test-art-host32', 'env': { diff --git a/test/testrunner/testrunner.py b/test/testrunner/testrunner.py index b814e14916..be84f898b2 100755 --- a/test/testrunner/testrunner.py +++ b/test/testrunner/testrunner.py @@ -184,10 +184,18 @@ def setup_test_env(): if env.ART_TEST_OPTIMIZING_GRAPH_COLOR: COMPILER_TYPES.add('regalloc_gc') OPTIMIZING_COMPILER_TYPES.add('regalloc_gc') - if env.ART_TEST_OPTIMIZING or not COMPILER_TYPES: # Default + if env.ART_TEST_OPTIMIZING: COMPILER_TYPES.add('optimizing') OPTIMIZING_COMPILER_TYPES.add('optimizing') + # By default we run all 'compiler' variants. + if not COMPILER_TYPES: + COMPILER_TYPES.add('optimizing') + COMPILER_TYPES.add('jit') + COMPILER_TYPES.add('interpreter') + COMPILER_TYPES.add('interp-ac') + OPTIMIZING_COMPILER_TYPES.add('optimizing') + if env.ART_TEST_RUN_TEST_RELOCATE: RELOCATE_TYPES.add('relocate') if env.ART_TEST_RUN_TEST_RELOCATE_NO_PATCHOAT: diff --git a/test/ti-agent/common_helper.cc b/test/ti-agent/common_helper.cc index ea6359e5e0..6316a9c368 100644 --- a/test/ti-agent/common_helper.cc +++ b/test/ti-agent/common_helper.cc @@ -25,7 +25,7 @@ #include "art_method.h" #include "jni.h" #include "jni_internal.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "scoped_thread_state_change-inl.h" #include "ScopedLocalRef.h" #include "stack.h" @@ -520,11 +520,14 @@ void BindFunctions(jvmtiEnv* jenv, JNIEnv* env, const char* class_name) { LOG(FATAL) << "Could not load " << class_name; } } + BindFunctionsOnClass(jenv, env, klass.get()); +} +void BindFunctionsOnClass(jvmtiEnv* jenv, JNIEnv* env, jclass klass) { // Use JVMTI to get the methods. jint method_count; jmethodID* methods; - jvmtiError methods_result = jenv->GetClassMethods(klass.get(), &method_count, &methods); + jvmtiError methods_result = jenv->GetClassMethods(klass, &method_count, &methods); if (methods_result != JVMTI_ERROR_NONE) { LOG(FATAL) << "Could not get methods"; } @@ -538,7 +541,7 @@ void BindFunctions(jvmtiEnv* jenv, JNIEnv* env, const char* class_name) { } constexpr jint kNative = static_cast<jint>(kAccNative); if ((modifiers & kNative) != 0) { - BindMethod(jenv, env, klass.get(), methods[i]); + BindMethod(jenv, env, klass, methods[i]); } } diff --git a/test/ti-agent/common_helper.h b/test/ti-agent/common_helper.h index 031850147e..f10356dcbb 100644 --- a/test/ti-agent/common_helper.h +++ b/test/ti-agent/common_helper.h @@ -18,7 +18,7 @@ #define ART_TEST_TI_AGENT_COMMON_HELPER_H_ #include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" #include "ScopedLocalRef.h" namespace art { @@ -81,6 +81,7 @@ bool JvmtiErrorToException(JNIEnv* env, jvmtiError error); // // This will abort on failure. void BindFunctions(jvmtiEnv* jvmti_env, JNIEnv* env, const char* class_name); +void BindFunctionsOnClass(jvmtiEnv* jvmti_env, JNIEnv* env, jclass klass); } // namespace art diff --git a/test/ti-agent/common_load.cc b/test/ti-agent/common_load.cc index 351857d1d9..fddae3af02 100644 --- a/test/ti-agent/common_load.cc +++ b/test/ti-agent/common_load.cc @@ -18,8 +18,6 @@ #include <jni.h> #include <stdio.h> -// TODO I don't know? -#include "openjdkjvmti/jvmti.h" #include "art_method-inl.h" #include "base/logging.h" diff --git a/test/ti-agent/common_load.h b/test/ti-agent/common_load.h index d2544214ec..e79a0067b0 100644 --- a/test/ti-agent/common_load.h +++ b/test/ti-agent/common_load.h @@ -17,8 +17,7 @@ #ifndef ART_TEST_TI_AGENT_COMMON_LOAD_H_ #define ART_TEST_TI_AGENT_COMMON_LOAD_H_ -#include "jni.h" -#include "openjdkjvmti/jvmti.h" +#include "jvmti.h" namespace art { |