From 7cc56a1fe81475d5126785c45606dd491dec2d8c Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Fri, 24 Apr 2015 14:58:19 +0100 Subject: Debugger: Remove support for setting values in optimizing. bug:19944235 Change-Id: I3bcd56c7844847a7f0367f8ce6a72bddcd09d441 --- runtime/stack.cc | 64 ++------------------------------------------------------ runtime/stack.h | 6 ------ 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/runtime/stack.cc b/runtime/stack.cc index aa3e320..e49bc1d 100644 --- a/runtime/stack.cc +++ b/runtime/stack.cc @@ -345,7 +345,7 @@ bool StackVisitor::SetVReg(mirror::ArtMethod* m, uint16_t vreg, uint32_t new_val DCHECK(context_ != nullptr); // You can't reliably write registers without a context. DCHECK(m == GetMethod()); if (m->IsOptimized(sizeof(void*))) { - return SetVRegFromOptimizedCode(m, vreg, new_value, kind); + return false; } else { return SetVRegFromQuickCode(m, vreg, new_value, kind); } @@ -382,57 +382,6 @@ bool StackVisitor::SetVRegFromQuickCode(mirror::ArtMethod* m, uint16_t vreg, uin } } -bool StackVisitor::SetVRegFromOptimizedCode(mirror::ArtMethod* m, uint16_t vreg, uint32_t new_value, - VRegKind kind) { - const void* code_pointer = m->GetQuickOatCodePointer(sizeof(void*)); - DCHECK(code_pointer != nullptr); - uint32_t native_pc_offset = m->NativeQuickPcOffset(cur_quick_frame_pc_); - CodeInfo code_info = m->GetOptimizedCodeInfo(); - StackMap stack_map = code_info.GetStackMapForNativePcOffset(native_pc_offset); - const DexFile::CodeItem* code_item = m->GetCodeItem(); - DCHECK(code_item != nullptr) << PrettyMethod(m); // Can't be null or how would we compile - // its instructions? - uint16_t number_of_dex_registers = code_item->registers_size_; - DCHECK_LT(vreg, number_of_dex_registers); - DexRegisterMap dex_register_map = - code_info.GetDexRegisterMapOf(stack_map, number_of_dex_registers); - DexRegisterLocation::Kind location_kind = - dex_register_map.GetLocationKind(vreg, number_of_dex_registers, code_info); - uint32_t dex_pc = m->ToDexPc(cur_quick_frame_pc_, false); - switch (location_kind) { - case DexRegisterLocation::Kind::kInStack: { - const int32_t offset = - dex_register_map.GetStackOffsetInBytes(vreg, number_of_dex_registers, code_info); - uint8_t* addr = reinterpret_cast(cur_quick_frame_) + offset; - *reinterpret_cast(addr) = new_value; - return true; - } - case DexRegisterLocation::Kind::kInRegister: - case DexRegisterLocation::Kind::kInFpuRegister: { - uint32_t reg = dex_register_map.GetMachineRegister(vreg, number_of_dex_registers, code_info); - return SetRegisterIfAccessible(reg, new_value, kind); - } - case DexRegisterLocation::Kind::kConstant: - LOG(ERROR) << StringPrintf("Cannot change value of DEX register v%u used as a constant at " - "DEX pc 0x%x (native pc 0x%x) of method %s", - vreg, dex_pc, native_pc_offset, - PrettyMethod(cur_quick_frame_->AsMirrorPtr()).c_str()); - return false; - case DexRegisterLocation::Kind::kNone: - LOG(ERROR) << StringPrintf("No location for DEX register v%u at DEX pc 0x%x " - "(native pc 0x%x) of method %s", - vreg, dex_pc, native_pc_offset, - PrettyMethod(cur_quick_frame_->AsMirrorPtr()).c_str()); - return false; - default: - LOG(FATAL) << StringPrintf("Unknown location for DEX register v%u at DEX pc 0x%x " - "(native pc 0x%x) of method %s", - vreg, dex_pc, native_pc_offset, - PrettyMethod(cur_quick_frame_->AsMirrorPtr()).c_str()); - UNREACHABLE(); - } -} - 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)) { @@ -477,7 +426,7 @@ bool StackVisitor::SetVRegPair(mirror::ArtMethod* m, uint16_t vreg, uint64_t new DCHECK(context_ != nullptr); // You can't reliably write registers without a context. DCHECK(m == GetMethod()); if (m->IsOptimized(sizeof(void*))) { - return SetVRegPairFromOptimizedCode(m, vreg, new_value, kind_lo, kind_hi); + return false; } else { return SetVRegPairFromQuickCode(m, vreg, new_value, kind_lo, kind_hi); } @@ -515,15 +464,6 @@ bool StackVisitor::SetVRegPairFromQuickCode( } } -bool StackVisitor::SetVRegPairFromOptimizedCode( - mirror::ArtMethod* m, uint16_t vreg, uint64_t new_value, VRegKind kind_lo, VRegKind kind_hi) { - uint32_t low_32bits = Low32Bits(new_value); - uint32_t high_32bits = High32Bits(new_value); - bool success = SetVRegFromOptimizedCode(m, vreg, low_32bits, kind_lo); - success &= SetVRegFromOptimizedCode(m, vreg + 1, high_32bits, kind_hi); - return success; -} - 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)) { diff --git a/runtime/stack.h b/runtime/stack.h index ed9e458..e2af5ee 100644 --- a/runtime/stack.h +++ b/runtime/stack.h @@ -668,18 +668,12 @@ class StackVisitor { bool SetVRegFromQuickCode(mirror::ArtMethod* m, uint16_t vreg, uint32_t new_value, VRegKind kind) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool SetVRegFromOptimizedCode(mirror::ArtMethod* m, uint16_t vreg, uint32_t new_value, - VRegKind kind) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool SetRegisterIfAccessible(uint32_t reg, uint32_t new_value, VRegKind kind) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool SetVRegPairFromQuickCode(mirror::ArtMethod* m, uint16_t vreg, uint64_t new_value, VRegKind kind_lo, VRegKind kind_hi) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool SetVRegPairFromOptimizedCode(mirror::ArtMethod* m, uint16_t vreg, uint64_t new_value, - VRegKind kind_lo, VRegKind kind_hi) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool SetRegisterPairIfAccessible(uint32_t reg_lo, uint32_t reg_hi, uint64_t new_value, bool is_float) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); -- cgit v1.1