summaryrefslogtreecommitdiffstats
path: root/test/466-get-live-vreg
diff options
context:
space:
mode:
Diffstat (limited to 'test/466-get-live-vreg')
-rw-r--r--test/466-get-live-vreg/expected.txt0
-rw-r--r--test/466-get-live-vreg/get_live_vreg_jni.cc71
-rw-r--r--test/466-get-live-vreg/info.txt3
-rw-r--r--test/466-get-live-vreg/src/Main.java70
4 files changed, 144 insertions, 0 deletions
diff --git a/test/466-get-live-vreg/expected.txt b/test/466-get-live-vreg/expected.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/466-get-live-vreg/expected.txt
diff --git a/test/466-get-live-vreg/get_live_vreg_jni.cc b/test/466-get-live-vreg/get_live_vreg_jni.cc
new file mode 100644
index 0000000..6715ba1
--- /dev/null
+++ b/test/466-get-live-vreg/get_live_vreg_jni.cc
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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 "arch/context.h"
+#include "jni.h"
+#include "mirror/art_method-inl.h"
+#include "scoped_thread_state_change.h"
+#include "stack.h"
+#include "thread.h"
+
+namespace art {
+
+namespace {
+
+class TestVisitor : public StackVisitor {
+ public:
+ TestVisitor(Thread* thread, Context* context) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
+ : StackVisitor(thread, context) {}
+
+ bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ mirror::ArtMethod* m = GetMethod();
+ std::string m_name(m->GetName());
+
+ if (m_name.compare("testLiveArgument") == 0) {
+ found_method_ = true;
+ uint32_t value = 0;
+ CHECK(GetVReg(m, 0, kIntVReg, &value));
+ CHECK_EQ(value, 42u);
+ } else if (m_name.compare("testIntervalHole") == 0) {
+ found_method_ = true;
+ uint32_t value = 0;
+ if (m->IsOptimized(sizeof(void*))) {
+ CHECK_EQ(GetVReg(m, 0, kIntVReg, &value), false);
+ } else {
+ CHECK(GetVReg(m, 0, kIntVReg, &value));
+ CHECK_EQ(value, 1u);
+ }
+ }
+
+ return true;
+ }
+
+ // Value returned to Java to ensure the methods testSimpleVReg and testPairVReg
+ // have been found and tested.
+ bool found_method_ = false;
+};
+
+extern "C" JNIEXPORT void JNICALL Java_Main_doStaticNativeCallLiveVreg(JNIEnv*, jclass) {
+ ScopedObjectAccess soa(Thread::Current());
+ std::unique_ptr<Context> context(Context::Create());
+ TestVisitor visitor(soa.Self(), context.get());
+ visitor.WalkStack();
+ CHECK(visitor.found_method_);
+}
+
+} // namespace
+
+} // namespace art
diff --git a/test/466-get-live-vreg/info.txt b/test/466-get-live-vreg/info.txt
new file mode 100644
index 0000000..cbe0c9a
--- /dev/null
+++ b/test/466-get-live-vreg/info.txt
@@ -0,0 +1,3 @@
+Tests for inspecting live DEX registers. The test must
+also pass for non-debuggable, as we need to know live DEX registers
+when de-opting.
diff --git a/test/466-get-live-vreg/src/Main.java b/test/466-get-live-vreg/src/Main.java
new file mode 100644
index 0000000..3118085
--- /dev/null
+++ b/test/466-get-live-vreg/src/Main.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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 Main() {
+ }
+
+ static int testLiveArgument(int arg) {
+ doStaticNativeCallLiveVreg();
+ return arg;
+ }
+
+ static void moveArgToCalleeSave() {
+ try {
+ Thread.sleep(0);
+ } catch (Exception e) {
+ throw new Error(e);
+ }
+ }
+
+ static void testIntervalHole(int arg, boolean test) {
+ // Move the argument to callee save to ensure it is in
+ // a readable register.
+ moveArgToCalleeSave();
+ if (test) {
+ staticField1 = arg;
+ // The environment use of `arg` should not make it live.
+ doStaticNativeCallLiveVreg();
+ } else {
+ staticField2 = arg;
+ // The environment use of `arg` should not make it live.
+ doStaticNativeCallLiveVreg();
+ }
+ }
+
+ static native void doStaticNativeCallLiveVreg();
+
+ static {
+ System.loadLibrary("arttest");
+ }
+
+ public static void main(String[] args) {
+ if (testLiveArgument(42) != 42) {
+ throw new Error("Expected 42");
+ }
+
+ if (testLiveArgument(42) != 42) {
+ throw new Error("Expected 42");
+ }
+
+ testIntervalHole(1, true);
+ testIntervalHole(1, false);
+ }
+
+ static int staticField1;
+ static int staticField2;
+}