bool ValueObjectRegisterSet::UpdateValue() { m_error.Clear(); SetValueDidChange(false); ExecutionContext exe_ctx(GetExecutionContextRef()); StackFrame *frame = exe_ctx.GetFramePtr(); if (frame == NULL) m_reg_ctx_sp.reset(); else { m_reg_ctx_sp = frame->GetRegisterContext(); if (m_reg_ctx_sp) { const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx); if (reg_set == NULL) m_reg_ctx_sp.reset(); else if (m_reg_set != reg_set) { SetValueDidChange(true); m_name.SetCString(reg_set->name); } } } if (m_reg_ctx_sp) { SetValueIsValid(true); } else { SetValueIsValid(false); m_error.SetErrorToGenericError(); m_children.Clear(); } return m_error.Success(); }
bool EmulateInstruction::WriteRegisterFrame(EmulateInstruction *instruction, void *baton, const Context &context, const RegisterInfo *reg_info, const RegisterValue ®_value) { if (baton == nullptr) return false; StackFrame *frame = (StackFrame *)baton; return frame->GetRegisterContext()->WriteRegister(reg_info, reg_value); }
bool EmulateInstruction::ReadRegisterFrame (EmulateInstruction *instruction, void *baton, const RegisterInfo *reg_info, RegisterValue ®_value) { if (!baton) return false; StackFrame *frame = (StackFrame *) baton; return frame->GetRegisterContext()->ReadRegister (reg_info, reg_value); }
SBValueList SBFrame::GetRegisters () { LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); SBValueList value_list; Mutex::Locker api_locker; ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); StackFrame *frame = NULL; Target *target = exe_ctx.GetTargetPtr(); Process *process = exe_ctx.GetProcessPtr(); if (target && process) { Process::StopLocker stop_locker; if (stop_locker.TryLock(&process->GetRunLock())) { frame = exe_ctx.GetFramePtr(); if (frame) { RegisterContextSP reg_ctx (frame->GetRegisterContext()); if (reg_ctx) { const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); } } } else { if (log) log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); } } else { if (log) log->Printf ("SBFrame::GetRegisters () => error: process is running"); } } if (log) log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get()); return value_list; }
bool ValueObjectRegisterContext::UpdateValue() { m_error.Clear(); ExecutionContext exe_ctx(GetExecutionContextRef()); StackFrame *frame = exe_ctx.GetFramePtr(); if (frame) m_reg_ctx_sp = frame->GetRegisterContext(); else m_reg_ctx_sp.reset(); if (m_reg_ctx_sp.get() == NULL) { SetValueIsValid(false); m_error.SetErrorToGenericError(); } else SetValueIsValid(true); return m_error.Success(); }
bool EmulationStateARM::LoadPseudoRegistersFromFrame (StackFrame &frame) { RegisterContext *reg_ctx = frame.GetRegisterContext().get(); bool success = true; uint32_t reg_num; for (int i = dwarf_r0; i < dwarf_r0 + 17; ++i) { reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindDWARF, i); const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); RegisterValue reg_value; if (reg_ctx->ReadRegister (reg_info, reg_value)) { m_gpr[i - dwarf_r0] = reg_value.GetAsUInt32(); } else success = false; } for (int i = dwarf_d0; i < dwarf_d0 + 32; ++i) { reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindDWARF, i); RegisterValue reg_value; const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); if (reg_ctx->ReadRegister (reg_info, reg_value)) { uint32_t idx = i - dwarf_d0; if (i < 16) m_vfp_regs.sd_regs[idx].d_reg = reg_value.GetAsUInt64(); else m_vfp_regs.d_regs[idx - 16] = reg_value.GetAsUInt64(); } else success = false; } return success; }
bool SBFrame::SetPC (addr_t new_pc) { LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); bool ret_val = false; Mutex::Locker api_locker; ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); StackFrame *frame = NULL; Target *target = exe_ctx.GetTargetPtr(); Process *process = exe_ctx.GetProcessPtr(); if (target && process) { Process::StopLocker stop_locker; if (stop_locker.TryLock(&process->GetRunLock())) { frame = exe_ctx.GetFramePtr(); if (frame) { ret_val = frame->GetRegisterContext()->SetPC (new_pc); } else { if (log) log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); } } else { if (log) log->Printf ("SBFrame::SetPC () => error: process is running"); } } if (log) log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", frame, new_pc, ret_val); return ret_val; }
addr_t SBFrame::GetFP () const { LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); addr_t addr = LLDB_INVALID_ADDRESS; Mutex::Locker api_locker; ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); StackFrame *frame = NULL; Target *target = exe_ctx.GetTargetPtr(); Process *process = exe_ctx.GetProcessPtr(); if (target && process) { Process::StopLocker stop_locker; if (stop_locker.TryLock(&process->GetRunLock())) { frame = exe_ctx.GetFramePtr(); if (frame) { addr = frame->GetRegisterContext()->GetFP(); } else { if (log) log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); } } else { if (log) log->Printf ("SBFrame::GetFP () => error: process is running"); } } if (log) log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr); return addr; }
SBValue SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) { LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); SBValue sb_value; if (name == NULL || name[0] == '\0') { if (log) log->Printf ("SBFrame::FindValue called with empty name."); return sb_value; } ValueObjectSP value_sp; Mutex::Locker api_locker; ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); StackFrame *frame = NULL; Target *target = exe_ctx.GetTargetPtr(); Process *process = exe_ctx.GetProcessPtr(); if (target && process) { Process::StopLocker stop_locker; if (stop_locker.TryLock(&process->GetRunLock())) { frame = exe_ctx.GetFramePtr(); if (frame) { switch (value_type) { case eValueTypeVariableGlobal: // global variable case eValueTypeVariableStatic: // static variable case eValueTypeVariableArgument: // function argument variables case eValueTypeVariableLocal: // function local variables { VariableList *variable_list = frame->GetVariableList(true); SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); const bool can_create = true; const bool get_parent_variables = true; const bool stop_if_block_is_inlined_function = true; if (sc.block && sc.block->AppendVariables (can_create, get_parent_variables, stop_if_block_is_inlined_function, variable_list)) { ConstString const_name(name); const uint32_t num_variables = variable_list->GetSize(); for (uint32_t i = 0; i < num_variables; ++i) { VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); if (variable_sp && variable_sp->GetScope() == value_type && variable_sp->GetName() == const_name) { value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); sb_value.SetSP (value_sp, use_dynamic); break; } } } } break; case eValueTypeRegister: // stack frame register value { RegisterContextSP reg_ctx (frame->GetRegisterContext()); if (reg_ctx) { const uint32_t num_regs = reg_ctx->GetRegisterCount(); for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); if (reg_info && ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) { value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); sb_value.SetSP (value_sp); break; } } } } break; case eValueTypeRegisterSet: // A collection of stack frame register values { RegisterContextSP reg_ctx (frame->GetRegisterContext()); if (reg_ctx) { const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); if (reg_set && ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) { value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); sb_value.SetSP (value_sp); break; } } } } break; case eValueTypeConstResult: // constant result variables { ConstString const_name(name); ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); if (expr_var_sp) { value_sp = expr_var_sp->GetValueObject(); sb_value.SetSP (value_sp, use_dynamic); } } break; default: break; } } else { if (log) log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); } } else { if (log) log->Printf ("SBFrame::FindValue () => error: process is running"); } } if (log) log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", frame, name, value_type, value_sp.get()); return sb_value; }