diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc | 59 | ||||
| -rw-r--r-- | test/136-daemon-jni-shutdown/expected.txt | 5 | ||||
| -rw-r--r-- | test/136-daemon-jni-shutdown/info.txt | 1 | ||||
| -rw-r--r-- | test/136-daemon-jni-shutdown/src/Main.java | 47 | ||||
| -rwxr-xr-x | test/137-cfi/run | 2 | ||||
| -rw-r--r-- | test/561-shared-slowpaths/expected.txt | 1 | ||||
| -rw-r--r-- | test/561-shared-slowpaths/info.txt | 1 | ||||
| -rw-r--r-- | test/561-shared-slowpaths/src/Main.java | 154 | ||||
| -rw-r--r-- | test/562-bce-preheader/expected.txt | 1 | ||||
| -rw-r--r-- | test/562-bce-preheader/info.txt | 1 | ||||
| -rw-r--r-- | test/562-bce-preheader/src/Main.java | 107 | ||||
| -rw-r--r-- | test/562-no-intermediate/expected.txt | 0 | ||||
| -rw-r--r-- | test/562-no-intermediate/info.txt | 2 | ||||
| -rw-r--r-- | test/562-no-intermediate/src/Main.java | 27 | ||||
| -rw-r--r-- | test/Android.libarttest.mk | 1 | ||||
| -rw-r--r-- | test/Android.run-test.mk | 16 |
16 files changed, 412 insertions, 13 deletions
diff --git a/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc b/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc new file mode 100644 index 0000000000..54879fbad9 --- /dev/null +++ b/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc @@ -0,0 +1,59 @@ +/* + * 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. + */ + +#include <iostream> + +#include "base/casts.h" +#include "base/macros.h" +#include "java_vm_ext.h" +#include "jni_env_ext.h" +#include "thread-inl.h" + +namespace art { +namespace { + +static volatile std::atomic<bool> vm_was_shutdown(false); + +extern "C" JNIEXPORT void JNICALL Java_Main_waitAndCallIntoJniEnv(JNIEnv* env, jclass) { + // Wait until the runtime is shutdown. + while (!vm_was_shutdown.load()) { + usleep(1000); + } + std::cout << "About to call exception check\n"; + env->ExceptionCheck(); + LOG(ERROR) << "Should not be reached!"; +} + +// NO_RETURN does not work with extern "C" for target builds. +extern "C" JNIEXPORT void JNICALL Java_Main_destroyJavaVMAndExit(JNIEnv* env, jclass) { + // Fake up the managed stack so we can detach. + Thread* const self = Thread::Current(); + self->SetTopOfStack(nullptr); + self->SetTopOfShadowStack(nullptr); + JavaVM* vm = down_cast<JNIEnvExt*>(env)->vm; + vm->DetachCurrentThread(); + vm->DestroyJavaVM(); + vm_was_shutdown.store(true); + // Give threads some time to get stuck in ExceptionCheck. + usleep(1000000); + if (env != nullptr) { + // Use env != nullptr to trick noreturn. + exit(0); + } +} + +} // namespace +} // namespace art diff --git a/test/136-daemon-jni-shutdown/expected.txt b/test/136-daemon-jni-shutdown/expected.txt new file mode 100644 index 0000000000..f0b6353e9f --- /dev/null +++ b/test/136-daemon-jni-shutdown/expected.txt @@ -0,0 +1,5 @@ +JNI_OnLoad called +About to call exception check +About to call exception check +About to call exception check +About to call exception check diff --git a/test/136-daemon-jni-shutdown/info.txt b/test/136-daemon-jni-shutdown/info.txt new file mode 100644 index 0000000000..06a12dff9e --- /dev/null +++ b/test/136-daemon-jni-shutdown/info.txt @@ -0,0 +1 @@ +Test that daemon threads that call into a JNI env after the runtime is shutdown do not crash.
\ No newline at end of file diff --git a/test/136-daemon-jni-shutdown/src/Main.java b/test/136-daemon-jni-shutdown/src/Main.java new file mode 100644 index 0000000000..6eceb757b1 --- /dev/null +++ b/test/136-daemon-jni-shutdown/src/Main.java @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/** + * Test that daemon threads that call into a JNI env after the runtime is shutdown do not crash. + */ +public class Main { + + public final static int THREAD_COUNT = 4; + + public static void main(String[] args) throws Exception { + System.loadLibrary(args[0]); + + for (int i = 0; i < THREAD_COUNT; i++) { + Thread t = new Thread(new DaemonRunnable()); + t.setDaemon(true); + t.start(); + } + // Give threads time to start and become stuck in waitAndCallIntoJniEnv. + Thread.sleep(1000); + destroyJavaVMAndExit(); + } + + static native void waitAndCallIntoJniEnv(); + static native void destroyJavaVMAndExit(); + + private static class DaemonRunnable implements Runnable { + public void run() { + for (;;) { + waitAndCallIntoJniEnv(); + } + } + } +} diff --git a/test/137-cfi/run b/test/137-cfi/run index ecbbbc7c48..9c567b6813 100755 --- a/test/137-cfi/run +++ b/test/137-cfi/run @@ -14,4 +14,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -exec ${RUN} "$@" +exec ${RUN} "$@" -Xcompiler-option --generate-debug-info diff --git a/test/561-shared-slowpaths/expected.txt b/test/561-shared-slowpaths/expected.txt new file mode 100644 index 0000000000..b0aad4deb5 --- /dev/null +++ b/test/561-shared-slowpaths/expected.txt @@ -0,0 +1 @@ +passed diff --git a/test/561-shared-slowpaths/info.txt b/test/561-shared-slowpaths/info.txt new file mode 100644 index 0000000000..c51e70b452 --- /dev/null +++ b/test/561-shared-slowpaths/info.txt @@ -0,0 +1 @@ +Test on correctness while possibly sharing slow paths. diff --git a/test/561-shared-slowpaths/src/Main.java b/test/561-shared-slowpaths/src/Main.java new file mode 100644 index 0000000000..718b8750a7 --- /dev/null +++ b/test/561-shared-slowpaths/src/Main.java @@ -0,0 +1,154 @@ +/* + * 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. + */ + +// +// Test on correctness in situations where slow paths may be shared +// (actual sharing may vary between different code generators). +// +// +public class Main { + + // A method with two loops that can be optimized with dynamic BCE, + // resulting in a two times a deopt on null, a deopt on lower OOB, + // and a deopt on upper OOB. + private static void init(int[] x, int [] y, int l1, int h1, int l2, int h2) { + for (int i = l1; i < h1; i++) { + x[i] = i; + } + for (int i = l2; i < h2; i++) { + y[i] = i; + } + } + + // Test that each of the six possible exceptions situations for init() + // are correctly handled by the deopt instructions. + public static void main(String[] args) { + int[] x = new int[100]; + int[] y = new int[100]; + int z; + + // All is well. + z = 0; + reset(x, y); + try { + init(x, y, 0, 100, 0, 100); + } catch (Exception e) { + z = 1; + } + expectEquals(z, 0); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], i); + expectEquals(y[i], i); + } + + // Null deopt on x. + z = 0; + reset(x, y); + try { + init(null, y, 0, 100, 0, 100); + } catch (NullPointerException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], 0); + expectEquals(y[i], 0); + } + + // Lower out-of-bounds on x. + z = 0; + reset(x, y); + try { + init(x, y, -1, 100, 0, 100); + } catch (ArrayIndexOutOfBoundsException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], 0); + expectEquals(y[i], 0); + } + + // Upper out-of-bounds on x. + z = 0; + reset(x, y); + try { + init(x, y, 0, 101, 0, 100); + } catch (ArrayIndexOutOfBoundsException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], i); + expectEquals(y[i], 0); + } + + // Null deopt on y. + z = 0; + reset(x, y); + try { + init(x, null, 0, 100, 0, 100); + } catch (NullPointerException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], i); + expectEquals(y[i], 0); + } + + // Lower out-of-bounds on y. + z = 0; + reset(x, y); + try { + init(x, y, 0, 100, -1, 100); + } catch (ArrayIndexOutOfBoundsException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], i); + expectEquals(y[i], 0); + } + + // Upper out-of-bounds on y. + z = 0; + reset(x, y); + try { + init(x, y, 0, 100, 0, 101); + } catch (ArrayIndexOutOfBoundsException e) { + z = 1; + } + expectEquals(z, 1); + for (int i = 0; i < 100; i++) { + expectEquals(x[i], i); + expectEquals(y[i], i); + } + + System.out.println("passed"); + } + + private static void reset(int[] x, int[] y) { + for (int i = 0; i < x.length; i++) x[i] = 0; + for (int i = 0; i < y.length; i++) y[i] = 0; + } + + private static void expectEquals(int expected, int result) { + if (expected != result) { + throw new Error("Expected: " + expected + ", found: " + result); + } + } +} diff --git a/test/562-bce-preheader/expected.txt b/test/562-bce-preheader/expected.txt new file mode 100644 index 0000000000..b0aad4deb5 --- /dev/null +++ b/test/562-bce-preheader/expected.txt @@ -0,0 +1 @@ +passed diff --git a/test/562-bce-preheader/info.txt b/test/562-bce-preheader/info.txt new file mode 100644 index 0000000000..ae006aca47 --- /dev/null +++ b/test/562-bce-preheader/info.txt @@ -0,0 +1 @@ +Regression test for correct placement of hoisting/deopting code. diff --git a/test/562-bce-preheader/src/Main.java b/test/562-bce-preheader/src/Main.java new file mode 100644 index 0000000000..8de0533591 --- /dev/null +++ b/test/562-bce-preheader/src/Main.java @@ -0,0 +1,107 @@ +/* + * 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. + */ + +public class Main { + + /** + * Method with an outer countable loop and an inner do-while loop. + * Since all work is done in the header of the inner loop, any invariant hoisting + * and deopting should be done in its proper loop preheader, not the true-block + * of the newly generated taken-test after dynamic BCE. + */ + public static int doit(int[][] x, int j) { + float f = 0; + int acc = 0; + for (int i = 0; i < 2; i++) { + // The full body of a do-while loop is the loop header. + do { + // Some "noise" to avoid hoisting the array reference + // before the dynamic BCE phase runs. + f++; + // The invariant array reference with corresponding bounds check + // is a candidate for hoisting when dynamic BCE runs. If it is + // not moved to the proper loop preheader, the wrong values + // cause the test to fail. + acc += x[i][i]; + } while (++j < i); + } + return acc; + } + + /** + * Single countable loop with a clear header and a loop body. In this case, + * after dynamic bce, some invariant hoisting and deopting must go to the + * proper loop preheader and some must go to the true-block. + */ + public static int foo(int[] x, int[] y, int n) { + float f = 0; + int acc = 0; + int i = 0; + while (true) { + // This part is the loop header. + // Some "noise" to avoid hoisting the array reference + // before the dynamic BCE phase runs. + f++; + // The invariant array reference with corresponding bounds check + // is a candidate for hoisting when dynamic BCE runs. If it is + // not moved to the proper loop preheader, the wrong values + // cause the test to fail. + acc += y[0]; + if (++i > n) + break; + // From here on, this part is the loop body. + // The unit-stride array reference is a candidate for dynamic BCE. + // The deopting appears in the true-block. + acc += x[i]; + } + return acc; + } + + public static void main(String args[]) { + int[][] x = new int[2][2]; + int y; + + x[0][0] = 1; + x[1][1] = 2; + + expectEquals(8, doit(x, -6)); + expectEquals(7, doit(x, -5)); + expectEquals(6, doit(x, -4)); + expectEquals(5, doit(x, -3)); + expectEquals(4, doit(x, -2)); + expectEquals(3, doit(x, -1)); + expectEquals(3, doit(x, 0)); + expectEquals(3, doit(x, 1)); + expectEquals(3, doit(x, 22)); + + int a[] = { 1, 2, 3, 5 }; + int b[] = { 7 }; + + expectEquals(7, foo(a, b, -1)); + expectEquals(7, foo(a, b, 0)); + expectEquals(16, foo(a, b, 1)); + expectEquals(26, foo(a, b, 2)); + expectEquals(38, foo(a, b, 3)); + + System.out.println("passed"); + } + + private static void expectEquals(int expected, int result) { + if (expected != result) { + throw new Error("Expected: " + expected + ", found: " + result); + } + } +} diff --git a/test/562-no-intermediate/expected.txt b/test/562-no-intermediate/expected.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/562-no-intermediate/expected.txt diff --git a/test/562-no-intermediate/info.txt b/test/562-no-intermediate/info.txt new file mode 100644 index 0000000000..4f21aebd03 --- /dev/null +++ b/test/562-no-intermediate/info.txt @@ -0,0 +1,2 @@ +Regression test for optimizing, checking that there is no +intermediate address between a Java call. diff --git a/test/562-no-intermediate/src/Main.java b/test/562-no-intermediate/src/Main.java new file mode 100644 index 0000000000..3b74d6f269 --- /dev/null +++ b/test/562-no-intermediate/src/Main.java @@ -0,0 +1,27 @@ +/* + * 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. + */ + +public class Main { + + /// CHECK-START-ARM64: int Main.main(String[]) register_allocator (after) + /// CHECK-NOT: IntermediateAddress + public static void main(String[] args) { + array[index] += Math.cos(42); + } + + static int index = 0; + static double[] array = new double[2]; +} diff --git a/test/Android.libarttest.mk b/test/Android.libarttest.mk index f74a516486..b922b4576e 100644 --- a/test/Android.libarttest.mk +++ b/test/Android.libarttest.mk @@ -30,6 +30,7 @@ LIBARTTEST_COMMON_SRC_FILES := \ 051-thread/thread_test.cc \ 117-nopatchoat/nopatchoat.cc \ 1337-gc-coverage/gc_coverage.cc \ + 136-daemon-jni-shutdown/daemon_jni_shutdown.cc \ 137-cfi/cfi.cc \ 139-register-natives/regnative.cc \ 141-class-unload/jni_unload.cc \ diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 569a0214fc..ee6b7aa4f7 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -267,16 +267,6 @@ endif TEST_ART_BROKEN_PREBUILD_RUN_TESTS := -# b/26483935 -TEST_ART_BROKEN_HOST_RUN_TESTS := \ - 132-daemon-locks-shutdown \ - -ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,host,$(RUN_TYPES),$(PREBUILD_TYPES), \ - $(COMPILER_TYPES),$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES), \ - $(IMAGE_TYPES), $(PICTEST_TYPES), $(DEBUGGABLE_TYPES), $(TEST_ART_BROKEN_HOST_RUN_TESTS), $(ALL_ADDRESS_SIZES)) - -TEST_ART_BROKEN_HOST_RUN_TESTS := - # 143-string-value tests for a LOG(E) tag, which is only supported on host. TEST_ART_BROKEN_TARGET_RUN_TESTS := \ 143-string-value \ @@ -682,7 +672,8 @@ ART_TEST_HOST_RUN_TEST_DEPENDENCIES := \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libarttestd$(ART_HOST_SHLIB_EXTENSION) \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libnativebridgetest$(ART_HOST_SHLIB_EXTENSION) \ $(ART_HOST_OUT_SHARED_LIBRARIES)/libjavacore$(ART_HOST_SHLIB_EXTENSION) \ - $(ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) + $(ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) \ + $(ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdkd$(ART_HOST_SHLIB_EXTENSION) ifneq ($(HOST_PREFER_32_BIT),true) ART_TEST_HOST_RUN_TEST_DEPENDENCIES += \ @@ -690,7 +681,8 @@ ART_TEST_HOST_RUN_TEST_DEPENDENCIES += \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libarttestd$(ART_HOST_SHLIB_EXTENSION) \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libnativebridgetest$(ART_HOST_SHLIB_EXTENSION) \ $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libjavacore$(ART_HOST_SHLIB_EXTENSION) \ - $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) + $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdk$(ART_HOST_SHLIB_EXTENSION) \ + $(2ND_ART_HOST_OUT_SHARED_LIBRARIES)/libopenjdkd$(ART_HOST_SHLIB_EXTENSION) endif # Create a rule to build and run a tests following the form: |