summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc14
-rw-r--r--test/570-checker-osr/osr.cc2
-rw-r--r--test/601-verifier-fails/expected.txt4
-rw-r--r--test/601-verifier-fails/info.txt18
-rw-r--r--test/601-verifier-fails/smali/construct.smali25
-rw-r--r--test/601-verifier-fails/smali/iget.smali25
-rw-r--r--test/601-verifier-fails/smali/iput.smali25
-rw-r--r--test/601-verifier-fails/smali/sput.smali23
-rw-r--r--test/601-verifier-fails/src/Main.java40
-rw-r--r--test/604-hot-static-interface/hot_static_interface.cc7
-rw-r--r--test/605-new-string-from-bytes/expected.txt0
-rw-r--r--test/605-new-string-from-bytes/info.txt2
-rw-r--r--test/605-new-string-from-bytes/src/Main.java45
13 files changed, 213 insertions, 17 deletions
diff --git a/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc b/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc
index b7293015cf..c9110a905d 100644
--- a/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc
+++ b/test/136-daemon-jni-shutdown/daemon_jni_shutdown.cc
@@ -27,20 +27,8 @@ namespace art {
namespace {
static volatile std::atomic<bool> vm_was_shutdown(false);
-static const int kThreadCount = 4;
-
-static std::atomic<int> barrier_count(kThreadCount + 1);
-
-static void JniThreadBarrierWait() {
- barrier_count--;
- while (barrier_count.load() != 0) {
- usleep(1000);
- }
-}
extern "C" JNIEXPORT void JNICALL Java_Main_waitAndCallIntoJniEnv(JNIEnv* env, jclass) {
- // Wait for all threads to enter JNI together.
- JniThreadBarrierWait();
// Wait until the runtime is shutdown.
while (!vm_was_shutdown.load()) {
usleep(1000);
@@ -52,8 +40,6 @@ extern "C" JNIEXPORT void JNICALL Java_Main_waitAndCallIntoJniEnv(JNIEnv* env, j
// NO_RETURN does not work with extern "C" for target builds.
extern "C" JNIEXPORT void JNICALL Java_Main_destroyJavaVMAndExit(JNIEnv* env, jclass) {
- // Wait for all threads to enter JNI together.
- JniThreadBarrierWait();
// Fake up the managed stack so we can detach.
Thread* const self = Thread::Current();
self->SetTopOfStack(nullptr);
diff --git a/test/570-checker-osr/osr.cc b/test/570-checker-osr/osr.cc
index 2fa5800e5c..cf413bab71 100644
--- a/test/570-checker-osr/osr.cc
+++ b/test/570-checker-osr/osr.cc
@@ -136,7 +136,7 @@ class OsrCheckVisitor : public StackVisitor {
if (m_name.compare(method_name_) == 0) {
while (jit->GetCodeCache()->LookupOsrMethodHeader(m) == nullptr) {
// Sleep to yield to the compiler thread.
- sleep(0);
+ usleep(1000);
// Will either ensure it's compiled or do the compilation itself.
jit->CompileMethod(m, Thread::Current(), /* osr */ true);
}
diff --git a/test/601-verifier-fails/expected.txt b/test/601-verifier-fails/expected.txt
new file mode 100644
index 0000000000..8399969a2d
--- /dev/null
+++ b/test/601-verifier-fails/expected.txt
@@ -0,0 +1,4 @@
+passed A
+passed B
+passed C
+passed D
diff --git a/test/601-verifier-fails/info.txt b/test/601-verifier-fails/info.txt
new file mode 100644
index 0000000000..f77de05ac7
--- /dev/null
+++ b/test/601-verifier-fails/info.txt
@@ -0,0 +1,18 @@
+The situations in these tests were discovered by running the mutating
+dexfuzz on the DEX files of fuzzingly random generated Java test.
+
+(A) b/28908555:
+ soft verification failure (on the final field modification) should
+ not hide the hard verification failure (on the type mismatch) to
+ avoid compiler crash later on
+(B) b/29070461:
+ hard verification failure (not calling super in constructor) should
+ bail immediately and not allow soft verification failures to pile up
+ behind it to avoid fatal message later on
+(C) b/29068831:
+ access validation should occur prior to null reference check
+(D) b/29126870:
+ soft verification failure (cannot access) should not hide the hard
+ verification failure (non-reference type) to avoid a compiler crash
+ later on
+
diff --git a/test/601-verifier-fails/smali/construct.smali b/test/601-verifier-fails/smali/construct.smali
new file mode 100644
index 0000000000..417ced94fa
--- /dev/null
+++ b/test/601-verifier-fails/smali/construct.smali
@@ -0,0 +1,25 @@
+#
+# 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 public LB;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+ .registers 1
+ if-eqz v0, :bail
+ invoke-direct {v0}, LB;->append(Ljava/lang/String;)V
+:bail
+ return-void
+.end method
diff --git a/test/601-verifier-fails/smali/iget.smali b/test/601-verifier-fails/smali/iget.smali
new file mode 100644
index 0000000000..5c045e6b76
--- /dev/null
+++ b/test/601-verifier-fails/smali/iget.smali
@@ -0,0 +1,25 @@
+#
+# 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 public LD;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+ .registers 2
+ invoke-direct {v1}, Ljava/lang/Object;-><init>()V
+ const v0, 2
+ iget v1, v0, LMain;->privateField:I
+ return-void
+.end method
diff --git a/test/601-verifier-fails/smali/iput.smali b/test/601-verifier-fails/smali/iput.smali
new file mode 100644
index 0000000000..bd8b9280c0
--- /dev/null
+++ b/test/601-verifier-fails/smali/iput.smali
@@ -0,0 +1,25 @@
+#
+# 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 public LC;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+ .registers 2
+ invoke-direct {v1}, Ljava/lang/Object;-><init>()V
+ const v0, 0
+ iput-object v0, v0, LMain;->staticPrivateField:Ljava/lang/String;
+ return-void
+.end method
diff --git a/test/601-verifier-fails/smali/sput.smali b/test/601-verifier-fails/smali/sput.smali
new file mode 100644
index 0000000000..e8e56acf13
--- /dev/null
+++ b/test/601-verifier-fails/smali/sput.smali
@@ -0,0 +1,23 @@
+#
+# 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 public LA;
+.super Ljava/lang/Object;
+
+.method public foo(I)V
+.registers 2
+ sput v1, LMain;->staticFinalField:Ljava/lang/String;
+ return-void
+.end method
diff --git a/test/601-verifier-fails/src/Main.java b/test/601-verifier-fails/src/Main.java
new file mode 100644
index 0000000000..a6a07fda79
--- /dev/null
+++ b/test/601-verifier-fails/src/Main.java
@@ -0,0 +1,40 @@
+/*
+ * 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 {
+
+ public static final String staticFinalField = null;
+
+ private static String staticPrivateField = null;
+
+ private int privateField = 0;
+
+ private static void test(String name) throws Exception {
+ try {
+ Class<?> a = Class.forName(name);
+ a.newInstance();
+ } catch (java.lang.LinkageError e) {
+ System.out.println("passed " + name);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ test("A");
+ test("B");
+ test("C");
+ test("D");
+ }
+}
diff --git a/test/604-hot-static-interface/hot_static_interface.cc b/test/604-hot-static-interface/hot_static_interface.cc
index 71877f5baa..475a11d351 100644
--- a/test/604-hot-static-interface/hot_static_interface.cc
+++ b/test/604-hot-static-interface/hot_static_interface.cc
@@ -17,6 +17,7 @@
#include "art_method.h"
#include "jit/jit.h"
#include "jit/jit_code_cache.h"
+#include "jit/profiling_info.h"
#include "oat_quick_method_header.h"
#include "scoped_thread_state_change.h"
#include "ScopedUtfChars.h"
@@ -43,15 +44,17 @@ extern "C" JNIEXPORT void JNICALL Java_Main_waitUntilJitted(JNIEnv* env,
jit::JitCodeCache* code_cache = jit->GetCodeCache();
OatQuickMethodHeader* header = nullptr;
+ // Make sure there is a profiling info, required by the compiler.
+ ProfilingInfo::Create(soa.Self(), method, /* retry_allocation */ true);
while (true) {
header = OatQuickMethodHeader::FromEntryPoint(method->GetEntryPointFromQuickCompiledCode());
if (code_cache->ContainsPc(header->GetCode())) {
break;
} else {
// Sleep to yield to the compiler thread.
- sleep(0);
+ usleep(1000);
// Will either ensure it's compiled or do the compilation itself.
- jit->CompileMethod(method, Thread::Current(), /* osr */ false);
+ jit->CompileMethod(method, soa.Self(), /* osr */ false);
}
}
}
diff --git a/test/605-new-string-from-bytes/expected.txt b/test/605-new-string-from-bytes/expected.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/test/605-new-string-from-bytes/expected.txt
diff --git a/test/605-new-string-from-bytes/info.txt b/test/605-new-string-from-bytes/info.txt
new file mode 100644
index 0000000000..be02c43bbd
--- /dev/null
+++ b/test/605-new-string-from-bytes/info.txt
@@ -0,0 +1,2 @@
+Regression test for the newStringFromBytes entrypoint,
+which used to wrongly setup the stack.
diff --git a/test/605-new-string-from-bytes/src/Main.java b/test/605-new-string-from-bytes/src/Main.java
new file mode 100644
index 0000000000..7dc0c15d99
--- /dev/null
+++ b/test/605-new-string-from-bytes/src/Main.java
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class Main {
+
+ public static void main(String[] args) throws Exception {
+ Class c = Class.forName("java.lang.StringFactory");
+ Method m = c.getDeclaredMethod("newStringFromBytes", byte[].class, int.class);
+
+ // Loop over allocations to get more chances of doing GC while in the
+ // newStringFromBytes intrinsic.
+ for (int i = 0; i < 10; i++) {
+ try {
+ byte[] f = new byte[100000000];
+ f[0] = (byte)i;
+ f[1] = (byte)i;
+ m.invoke(null, f, 0);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof OutOfMemoryError) {
+ // Ignore, this is a stress test.
+ } else {
+ throw e;
+ }
+ } catch (OutOfMemoryError e) {
+ // Ignore, this is a stress test.
+ }
+ }
+ }
+}