diff options
| -rw-r--r-- | runtime/debugger.cc | 14 | ||||
| -rw-r--r-- | runtime/stack.cc | 171 | ||||
| -rw-r--r-- | runtime/stack.h | 39 | ||||
| -rw-r--r-- | test/455-set-vreg/expected.txt | 1 | ||||
| -rw-r--r-- | test/455-set-vreg/info.txt | 1 | ||||
| -rw-r--r-- | test/455-set-vreg/set_vreg_jni.cc | 96 | ||||
| -rw-r--r-- | test/455-set-vreg/src/Main.java | 70 | ||||
| -rw-r--r-- | test/Android.libarttest.mk | 1 | ||||
| -rw-r--r-- | test/Android.run-test.mk | 12 |
9 files changed, 21 insertions, 384 deletions
diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 13d0b844a6..32e77b79f0 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -2684,26 +2684,26 @@ JDWP::JdwpError Dbg::SetLocalValue(Thread* thread, StackVisitor& visitor, int sl case JDWP::JT_BOOLEAN: case JDWP::JT_BYTE: CHECK_EQ(width, 1U); - if (!visitor.SetVRegFromDebugger(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { + if (!visitor.SetVReg(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { return FailSetLocalValue(visitor, vreg, tag, static_cast<uint32_t>(value)); } break; case JDWP::JT_SHORT: case JDWP::JT_CHAR: CHECK_EQ(width, 2U); - if (!visitor.SetVRegFromDebugger(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { + if (!visitor.SetVReg(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { return FailSetLocalValue(visitor, vreg, tag, static_cast<uint32_t>(value)); } break; case JDWP::JT_INT: CHECK_EQ(width, 4U); - if (!visitor.SetVRegFromDebugger(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { + if (!visitor.SetVReg(m, vreg, static_cast<uint32_t>(value), kIntVReg)) { return FailSetLocalValue(visitor, vreg, tag, static_cast<uint32_t>(value)); } break; case JDWP::JT_FLOAT: CHECK_EQ(width, 4U); - if (!visitor.SetVRegFromDebugger(m, vreg, static_cast<uint32_t>(value), kFloatVReg)) { + if (!visitor.SetVReg(m, vreg, static_cast<uint32_t>(value), kFloatVReg)) { return FailSetLocalValue(visitor, vreg, tag, static_cast<uint32_t>(value)); } break; @@ -2721,7 +2721,7 @@ JDWP::JdwpError Dbg::SetLocalValue(Thread* thread, StackVisitor& visitor, int sl VLOG(jdwp) << tag << " object " << o << " is an invalid object"; return JDWP::ERR_INVALID_OBJECT; } - if (!visitor.SetVRegFromDebugger(m, vreg, static_cast<uint32_t>(reinterpret_cast<uintptr_t>(o)), + if (!visitor.SetVReg(m, vreg, static_cast<uint32_t>(reinterpret_cast<uintptr_t>(o)), kReferenceVReg)) { return FailSetLocalValue(visitor, vreg, tag, reinterpret_cast<uintptr_t>(o)); } @@ -2729,14 +2729,14 @@ JDWP::JdwpError Dbg::SetLocalValue(Thread* thread, StackVisitor& visitor, int sl } case JDWP::JT_DOUBLE: { CHECK_EQ(width, 8U); - if (!visitor.SetVRegPairFromDebugger(m, vreg, value, kDoubleLoVReg, kDoubleHiVReg)) { + if (!visitor.SetVRegPair(m, vreg, value, kDoubleLoVReg, kDoubleHiVReg)) { return FailSetLocalValue(visitor, vreg, tag, value); } break; } case JDWP::JT_LONG: { CHECK_EQ(width, 8U); - if (!visitor.SetVRegPairFromDebugger(m, vreg, value, kLongLoVReg, kLongHiVReg)) { + if (!visitor.SetVRegPair(m, vreg, value, kLongLoVReg, kLongHiVReg)) { return FailSetLocalValue(visitor, vreg, tag, value); } break; diff --git a/runtime/stack.cc b/runtime/stack.cc index 593fde117b..9098d38bb0 100644 --- a/runtime/stack.cc +++ b/runtime/stack.cc @@ -486,52 +486,10 @@ bool StackVisitor::GetRegisterPairIfAccessible(uint32_t reg_lo, uint32_t reg_hi, return true; } -bool StackVisitor::SetVReg(ArtMethod* m, uint16_t vreg, uint32_t new_value, +bool StackVisitor::SetVReg(ArtMethod* m, + uint16_t vreg, + uint32_t new_value, VRegKind kind) { - if (cur_quick_frame_ != nullptr) { - DCHECK(context_ != nullptr); // You can't reliably write registers without a context. - DCHECK(m == GetMethod()); - if (cur_oat_quick_method_header_->IsOptimized()) { - return false; - } else { - return SetVRegFromQuickCode(m, vreg, new_value, kind); - } - } else { - cur_shadow_frame_->SetVReg(vreg, new_value); - return true; - } -} - -bool StackVisitor::SetVRegFromQuickCode(ArtMethod* m, uint16_t vreg, uint32_t new_value, - VRegKind kind) { - DCHECK(context_ != nullptr); // You can't reliably write registers without a context. - DCHECK(m == GetMethod()); - const OatQuickMethodHeader* method_header = GetCurrentOatQuickMethodHeader(); - QuickMethodFrameInfo frame_info = method_header->GetFrameInfo(); - const VmapTable vmap_table(method_header->GetVmapTable()); - uint32_t vmap_offset; - // TODO: IsInContext stops before spotting floating point registers. - if (vmap_table.IsInContext(vreg, kind, &vmap_offset)) { - bool is_float = (kind == kFloatVReg) || (kind == kDoubleLoVReg) || (kind == kDoubleHiVReg); - uint32_t spill_mask = is_float ? frame_info.FpSpillMask() : frame_info.CoreSpillMask(); - uint32_t reg = vmap_table.ComputeRegister(spill_mask, vmap_offset, kind); - return SetRegisterIfAccessible(reg, new_value, kind); - } else { - const DexFile::CodeItem* code_item = m->GetCodeItem(); - DCHECK(code_item != nullptr) << PrettyMethod(m); // Can't be null or how would we compile - // its instructions? - uint32_t* addr = GetVRegAddrFromQuickCode( - cur_quick_frame_, code_item, frame_info.CoreSpillMask(), - frame_info.FpSpillMask(), frame_info.FrameSizeInBytes(), vreg); - *addr = new_value; - return true; - } -} - -bool StackVisitor::SetVRegFromDebugger(ArtMethod* m, - uint16_t vreg, - uint32_t new_value, - VRegKind kind) { const DexFile::CodeItem* code_item = m->GetCodeItem(); if (code_item == nullptr) { return false; @@ -556,93 +514,11 @@ bool StackVisitor::SetVRegFromDebugger(ArtMethod* m, return true; } -bool StackVisitor::SetRegisterIfAccessible(uint32_t reg, uint32_t new_value, VRegKind kind) { - const bool is_float = (kind == kFloatVReg) || (kind == kDoubleLoVReg) || (kind == kDoubleHiVReg); - if (!IsAccessibleRegister(reg, is_float)) { - return false; - } - const bool target64 = Is64BitInstructionSet(kRuntimeISA); - - // Create a new value that can hold both low 32 and high 32 bits, in - // case we are running 64 bits. - uintptr_t full_new_value = new_value; - // Deal with 32 or 64-bit wide registers in a way that builds on all targets. - if (target64) { - bool wide_lo = (kind == kLongLoVReg) || (kind == kDoubleLoVReg); - bool wide_hi = (kind == kLongHiVReg) || (kind == kDoubleHiVReg); - if (wide_lo || wide_hi) { - uintptr_t old_reg_val = GetRegister(reg, is_float); - uint64_t new_vreg_portion = static_cast<uint64_t>(new_value); - uint64_t old_reg_val_as_wide = static_cast<uint64_t>(old_reg_val); - uint64_t mask = 0xffffffff; - if (wide_lo) { - mask = mask << 32; - } else { - new_vreg_portion = new_vreg_portion << 32; - } - full_new_value = static_cast<uintptr_t>((old_reg_val_as_wide & mask) | new_vreg_portion); - } - } - SetRegister(reg, full_new_value, is_float); - return true; -} - -bool StackVisitor::SetVRegPair(ArtMethod* m, uint16_t vreg, uint64_t new_value, - VRegKind kind_lo, VRegKind kind_hi) { - if (kind_lo == kLongLoVReg) { - DCHECK_EQ(kind_hi, kLongHiVReg); - } else if (kind_lo == kDoubleLoVReg) { - DCHECK_EQ(kind_hi, kDoubleHiVReg); - } else { - LOG(FATAL) << "Expected long or double: kind_lo=" << kind_lo << ", kind_hi=" << kind_hi; - } - if (cur_quick_frame_ != nullptr) { - DCHECK(context_ != nullptr); // You can't reliably write registers without a context. - DCHECK(m == GetMethod()); - if (cur_oat_quick_method_header_->IsOptimized()) { - return false; - } else { - return SetVRegPairFromQuickCode(m, vreg, new_value, kind_lo, kind_hi); - } - } else { - DCHECK(cur_shadow_frame_ != nullptr); - cur_shadow_frame_->SetVRegLong(vreg, new_value); - return true; - } -} - -bool StackVisitor::SetVRegPairFromQuickCode( - ArtMethod* m, uint16_t vreg, uint64_t new_value, VRegKind kind_lo, VRegKind kind_hi) { - DCHECK_EQ(m, GetMethod()); - const OatQuickMethodHeader* method_header = GetCurrentOatQuickMethodHeader(); - QuickMethodFrameInfo frame_info = method_header->GetFrameInfo(); - const VmapTable vmap_table(method_header->GetVmapTable()); - uint32_t vmap_offset_lo, vmap_offset_hi; - // TODO: IsInContext stops before spotting floating point registers. - if (vmap_table.IsInContext(vreg, kind_lo, &vmap_offset_lo) && - vmap_table.IsInContext(vreg + 1, kind_hi, &vmap_offset_hi)) { - bool is_float = (kind_lo == kDoubleLoVReg); - uint32_t spill_mask = is_float ? frame_info.FpSpillMask() : frame_info.CoreSpillMask(); - uint32_t reg_lo = vmap_table.ComputeRegister(spill_mask, vmap_offset_lo, kind_lo); - uint32_t reg_hi = vmap_table.ComputeRegister(spill_mask, vmap_offset_hi, kind_hi); - return SetRegisterPairIfAccessible(reg_lo, reg_hi, new_value, is_float); - } else { - const DexFile::CodeItem* code_item = m->GetCodeItem(); - DCHECK(code_item != nullptr) << PrettyMethod(m); // Can't be null or how would we compile - // its instructions? - uint32_t* addr = GetVRegAddrFromQuickCode( - cur_quick_frame_, code_item, frame_info.CoreSpillMask(), - frame_info.FpSpillMask(), frame_info.FrameSizeInBytes(), vreg); - *reinterpret_cast<uint64_t*>(addr) = new_value; - return true; - } -} - -bool StackVisitor::SetVRegPairFromDebugger(ArtMethod* m, - uint16_t vreg, - uint64_t new_value, - VRegKind kind_lo, - VRegKind kind_hi) { +bool StackVisitor::SetVRegPair(ArtMethod* m, + uint16_t vreg, + uint64_t new_value, + VRegKind kind_lo, + VRegKind kind_hi) { if (kind_lo == kLongLoVReg) { DCHECK_EQ(kind_hi, kLongHiVReg); } else if (kind_lo == kDoubleLoVReg) { @@ -671,25 +547,6 @@ bool StackVisitor::SetVRegPairFromDebugger(ArtMethod* m, return true; } -bool StackVisitor::SetRegisterPairIfAccessible(uint32_t reg_lo, uint32_t reg_hi, - uint64_t new_value, bool is_float) { - if (!IsAccessibleRegister(reg_lo, is_float) || !IsAccessibleRegister(reg_hi, is_float)) { - return false; - } - uintptr_t new_value_lo = static_cast<uintptr_t>(new_value & 0xFFFFFFFF); - uintptr_t new_value_hi = static_cast<uintptr_t>(new_value >> 32); - bool target64 = Is64BitInstructionSet(kRuntimeISA); - // Deal with 32 or 64-bit wide registers in a way that builds on all targets. - if (target64) { - DCHECK_EQ(reg_lo, reg_hi); - SetRegister(reg_lo, new_value, is_float); - } else { - SetRegister(reg_lo, new_value_lo, is_float); - SetRegister(reg_hi, new_value_hi, is_float); - } - return true; -} - bool StackVisitor::IsAccessibleGPR(uint32_t reg) const { DCHECK(context_ != nullptr); return context_->IsAccessibleGPR(reg); @@ -707,12 +564,6 @@ uintptr_t StackVisitor::GetGPR(uint32_t reg) const { return context_->GetGPR(reg); } -void StackVisitor::SetGPR(uint32_t reg, uintptr_t value) { - DCHECK(cur_quick_frame_ != nullptr) << "This is a quick frame routine"; - DCHECK(context_ != nullptr); - context_->SetGPR(reg, value); -} - bool StackVisitor::IsAccessibleFPR(uint32_t reg) const { DCHECK(context_ != nullptr); return context_->IsAccessibleFPR(reg); @@ -724,12 +575,6 @@ uintptr_t StackVisitor::GetFPR(uint32_t reg) const { return context_->GetFPR(reg); } -void StackVisitor::SetFPR(uint32_t reg, uintptr_t value) { - DCHECK(cur_quick_frame_ != nullptr) << "This is a quick frame routine"; - DCHECK(context_ != nullptr); - context_->SetFPR(reg, value); -} - uintptr_t StackVisitor::GetReturnPc() const { uint8_t* sp = reinterpret_cast<uint8_t*>(GetCurrentQuickFrame()); DCHECK(sp != nullptr); diff --git a/runtime/stack.h b/runtime/stack.h index aa7b6160fe..a0c44cb24f 100644 --- a/runtime/stack.h +++ b/runtime/stack.h @@ -600,22 +600,18 @@ class StackVisitor { uint64_t* val) const SHARED_REQUIRES(Locks::mutator_lock_); - bool SetVReg(ArtMethod* m, uint16_t vreg, uint32_t new_value, VRegKind kind) - SHARED_REQUIRES(Locks::mutator_lock_); - // Values will be set in debugger shadow frames. Debugger will make sure deoptimization // is triggered to make the values effective. - bool SetVRegFromDebugger(ArtMethod* m, uint16_t vreg, uint32_t new_value, VRegKind kind) - SHARED_REQUIRES(Locks::mutator_lock_); - - bool SetVRegPair(ArtMethod* m, uint16_t vreg, uint64_t new_value, - VRegKind kind_lo, VRegKind kind_hi) + bool SetVReg(ArtMethod* m, uint16_t vreg, uint32_t new_value, VRegKind kind) SHARED_REQUIRES(Locks::mutator_lock_); // Values will be set in debugger shadow frames. Debugger will make sure deoptimization // is triggered to make the values effective. - bool SetVRegPairFromDebugger(ArtMethod* m, uint16_t vreg, uint64_t new_value, - VRegKind kind_lo, VRegKind kind_hi) + bool SetVRegPair(ArtMethod* m, + uint16_t vreg, + uint64_t new_value, + VRegKind kind_lo, + VRegKind kind_hi) SHARED_REQUIRES(Locks::mutator_lock_); uintptr_t* GetGPRAddress(uint32_t reg) const; @@ -749,22 +745,12 @@ class StackVisitor { DCHECK(IsAccessibleRegister(reg, is_float)); return is_float ? GetFPR(reg) : GetGPR(reg); } - void SetRegister(uint32_t reg, uintptr_t value, bool is_float) { - DCHECK(IsAccessibleRegister(reg, is_float)); - if (is_float) { - SetFPR(reg, value); - } else { - SetGPR(reg, value); - } - } bool IsAccessibleGPR(uint32_t reg) const; uintptr_t GetGPR(uint32_t reg) const; - void SetGPR(uint32_t reg, uintptr_t value); bool IsAccessibleFPR(uint32_t reg) const; uintptr_t GetFPR(uint32_t reg) const; - void SetFPR(uint32_t reg, uintptr_t value); bool GetVRegFromDebuggerShadowFrame(uint16_t vreg, VRegKind kind, uint32_t* val) const SHARED_REQUIRES(Locks::mutator_lock_); @@ -789,19 +775,6 @@ class StackVisitor { uint64_t* val) const SHARED_REQUIRES(Locks::mutator_lock_); - bool SetVRegFromQuickCode(ArtMethod* m, uint16_t vreg, uint32_t new_value, - VRegKind kind) - SHARED_REQUIRES(Locks::mutator_lock_); - bool SetRegisterIfAccessible(uint32_t reg, uint32_t new_value, VRegKind kind) - SHARED_REQUIRES(Locks::mutator_lock_); - - bool SetVRegPairFromQuickCode(ArtMethod* m, uint16_t vreg, uint64_t new_value, - VRegKind kind_lo, VRegKind kind_hi) - SHARED_REQUIRES(Locks::mutator_lock_); - bool SetRegisterPairIfAccessible(uint32_t reg_lo, uint32_t reg_hi, uint64_t new_value, - bool is_float) - SHARED_REQUIRES(Locks::mutator_lock_); - void SanityCheckFrame() const SHARED_REQUIRES(Locks::mutator_lock_); InlineInfo GetCurrentInlineInfo() const SHARED_REQUIRES(Locks::mutator_lock_); diff --git a/test/455-set-vreg/expected.txt b/test/455-set-vreg/expected.txt deleted file mode 100644 index 6a5618ebc6..0000000000 --- a/test/455-set-vreg/expected.txt +++ /dev/null @@ -1 +0,0 @@ -JNI_OnLoad called diff --git a/test/455-set-vreg/info.txt b/test/455-set-vreg/info.txt deleted file mode 100644 index e8c57b579c..0000000000 --- a/test/455-set-vreg/info.txt +++ /dev/null @@ -1 +0,0 @@ -Tests for setting DEX registers in a Java method. diff --git a/test/455-set-vreg/set_vreg_jni.cc b/test/455-set-vreg/set_vreg_jni.cc deleted file mode 100644 index 21149f67e8..0000000000 --- a/test/455-set-vreg/set_vreg_jni.cc +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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 "art_method-inl.h" -#include "jni.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, mirror::Object* this_value) - SHARED_REQUIRES(Locks::mutator_lock_) - : StackVisitor(thread, context, StackVisitor::StackWalkKind::kIncludeInlinedFrames), - this_value_(this_value) {} - - bool VisitFrame() SHARED_REQUIRES(Locks::mutator_lock_) { - ArtMethod* m = GetMethod(); - std::string m_name(m->GetName()); - - if (m_name.compare("testIntVReg") == 0) { - uint32_t value = 0; - CHECK(GetVReg(m, 1, kReferenceVReg, &value)); - CHECK_EQ(reinterpret_cast<mirror::Object*>(value), this_value_); - - CHECK(SetVReg(m, 2, 5, kIntVReg)); - CHECK(SetVReg(m, 3, 4, kIntVReg)); - CHECK(SetVReg(m, 4, 3, kIntVReg)); - CHECK(SetVReg(m, 5, 2, kIntVReg)); - CHECK(SetVReg(m, 6, 1, kIntVReg)); - } else if (m_name.compare("testLongVReg") == 0) { - uint32_t value = 0; - CHECK(GetVReg(m, 3, kReferenceVReg, &value)); - CHECK_EQ(reinterpret_cast<mirror::Object*>(value), this_value_); - - CHECK(SetVRegPair(m, 4, std::numeric_limits<int64_t>::max(), kLongLoVReg, kLongHiVReg)); - CHECK(SetVRegPair(m, 6, 4, kLongLoVReg, kLongHiVReg)); - CHECK(SetVRegPair(m, 8, 3, kLongLoVReg, kLongHiVReg)); - CHECK(SetVRegPair(m, 10, 2, kLongLoVReg, kLongHiVReg)); - CHECK(SetVRegPair(m, 12, 1, kLongLoVReg, kLongHiVReg)); - } else if (m_name.compare("testFloatVReg") == 0) { - uint32_t value = 0; - CHECK(GetVReg(m, 1, kReferenceVReg, &value)); - CHECK_EQ(reinterpret_cast<mirror::Object*>(value), this_value_); - - CHECK(SetVReg(m, 2, bit_cast<uint32_t, float>(5.0f), kFloatVReg)); - CHECK(SetVReg(m, 3, bit_cast<uint32_t, float>(4.0f), kFloatVReg)); - CHECK(SetVReg(m, 4, bit_cast<uint32_t, float>(3.0f), kFloatVReg)); - CHECK(SetVReg(m, 5, bit_cast<uint32_t, float>(2.0f), kFloatVReg)); - CHECK(SetVReg(m, 6, bit_cast<uint32_t, float>(1.0f), kFloatVReg)); - } else if (m_name.compare("testDoubleVReg") == 0) { - uint32_t value = 0; - CHECK(GetVReg(m, 3, kReferenceVReg, &value)); - CHECK_EQ(reinterpret_cast<mirror::Object*>(value), this_value_); - - CHECK(SetVRegPair(m, 4, bit_cast<uint64_t, double>(5.0), kDoubleLoVReg, kDoubleHiVReg)); - CHECK(SetVRegPair(m, 6, bit_cast<uint64_t, double>(4.0), kDoubleLoVReg, kDoubleHiVReg)); - CHECK(SetVRegPair(m, 8, bit_cast<uint64_t, double>(3.0), kDoubleLoVReg, kDoubleHiVReg)); - CHECK(SetVRegPair(m, 10, bit_cast<uint64_t, double>(2.0), kDoubleLoVReg, kDoubleHiVReg)); - CHECK(SetVRegPair(m, 12, bit_cast<uint64_t, double>(1.0), kDoubleLoVReg, kDoubleHiVReg)); - } - - return true; - } - - mirror::Object* this_value_; -}; - -extern "C" JNIEXPORT void JNICALL Java_Main_doNativeCallSetVReg(JNIEnv*, jobject value) { - ScopedObjectAccess soa(Thread::Current()); - std::unique_ptr<Context> context(Context::Create()); - TestVisitor visitor(soa.Self(), context.get(), soa.Decode<mirror::Object*>(value)); - visitor.WalkStack(); -} - -} // namespace - -} // namespace art diff --git a/test/455-set-vreg/src/Main.java b/test/455-set-vreg/src/Main.java deleted file mode 100644 index 4db9d66f94..0000000000 --- a/test/455-set-vreg/src/Main.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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() { - } - - int testIntVReg(int a, int b, int c, int d, int e) { - doNativeCallSetVReg(); - return a - b - c - d - e; - } - - long testLongVReg(long a, long b, long c, long d, long e) { - doNativeCallSetVReg(); - return a - b - c - d - e; - } - - float testFloatVReg(float a, float b, float c, float d, float e) { - doNativeCallSetVReg(); - return a - b - c - d - e; - } - - double testDoubleVReg(double a, double b, double c, double d, double e) { - doNativeCallSetVReg(); - return a - b - c - d - e; - } - - native void doNativeCallSetVReg(); - - public static void main(String[] args) { - System.loadLibrary(args[0]); - Main rm = new Main(); - int intExpected = 5 - 4 - 3 - 2 - 1; - int intResult = rm.testIntVReg(0, 0, 0, 0, 0); - if (intResult != intExpected) { - throw new Error("Expected " + intExpected + ", got " + intResult); - } - - long longExpected = Long.MAX_VALUE - 4 - 3 - 2 - 1; - long longResult = rm.testLongVReg(0, 0, 0, 0, 0); - if (longResult != longExpected) { - throw new Error("Expected " + longExpected + ", got " + longResult); - } - - float floatExpected = 5.0f - 4.0f - 3.0f - 2.0f - 1.0f; - float floatResult = rm.testFloatVReg(0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - if (floatResult != floatExpected) { - throw new Error("Expected " + floatExpected + ", got " + floatResult); - } - - double doubleExpected = 5.0 - 4.0 - 3.0 - 2.0 - 1.0; - double doubleResult = rm.testDoubleVReg(0.0, 0.0, 0.0, 0.0, 0.0); - if (doubleResult != doubleExpected) { - throw new Error("Expected " + doubleExpected + ", got " + doubleResult); - } - } -} diff --git a/test/Android.libarttest.mk b/test/Android.libarttest.mk index bffd0e0aa6..7a22e1b74a 100644 --- a/test/Android.libarttest.mk +++ b/test/Android.libarttest.mk @@ -34,7 +34,6 @@ LIBARTTEST_COMMON_SRC_FILES := \ 139-register-natives/regnative.cc \ 141-class-unload/jni_unload.cc \ 454-get-vreg/get_vreg_jni.cc \ - 455-set-vreg/set_vreg_jni.cc \ 457-regs/regs_jni.cc \ 461-get-reference-vreg/get_reference_vreg_jni.cc \ 466-get-live-vreg/get_live_vreg_jni.cc \ diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 3e97b8611e..c830ad460e 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -464,18 +464,6 @@ endif TEST_ART_BROKEN_OPTIMIZING_MIPS_RUN_TESTS := -# Known broken tests for the optimizing compiler. -TEST_ART_BROKEN_OPTIMIZING_RUN_TESTS := \ - 455-set-vreg \ - -ifneq (,$(filter optimizing,$(COMPILER_TYPES))) - ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,$(TARGET_TYPES),$(RUN_TYPES),$(PREBUILD_TYPES), \ - optimizing,$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES), \ - $(IMAGE_TYPES),$(PICTEST_TYPES),$(DEBUGGABLE_TYPES),$(TEST_ART_BROKEN_OPTIMIZING_RUN_TESTS),$(ALL_ADDRESS_SIZES)) -endif - -TEST_ART_BROKEN_OPTIMIZING_RUN_TESTS := - # Tests that should fail when the optimizing compiler compiles them non-debuggable. TEST_ART_BROKEN_OPTIMIZING_NONDEBUGGABLE_RUN_TESTS := \ 454-get-vreg \ |