From 5085710892a0284899044c143d299fbaa726ffc9 Mon Sep 17 00:00:00 2001 From: Sean Callanan Date: Wed, 14 Sep 2016 00:48:19 +0000 Subject: [PATCH] Cleaned up the code that handles function return addresses in "frame diagnose." llvm-svn: 281428 --- lldb/source/Target/StackFrame.cpp | 51 +++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 0e32cb4..b37ac7a 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1490,6 +1490,8 @@ lldb::ValueObjectSP DoGuessValueAt(StackFrame &frame, ConstString reg, // First, check the variable list to see if anything is at the specified // location. + using namespace OperandMatchers; + Instruction::Operand op = offset ? Instruction::Operand::BuildDereference( Instruction::Operand::BuildSum( @@ -1505,22 +1507,6 @@ lldb::ValueObjectSP DoGuessValueAt(StackFrame &frame, ConstString reg, } } - bool is_in_return_register = false; - ABISP abi_sp = frame.CalculateProcess()->GetABI(); - RegisterInfo return_register_info; - - if (abi_sp) { - const char *return_register_name; - const RegisterInfo *reg_info = nullptr; - if (abi_sp->GetPointerReturnRegister(return_register_name) && - reg == ConstString(return_register_name) && - (reg_info = frame.GetRegisterContext()->GetRegisterInfoByName( - return_register_name))) { - is_in_return_register = true; - return_register_info = *reg_info; - } - } - const uint32_t current_inst = disassembler.GetInstructionList().GetIndexOfInstructionAtAddress(pc); if (current_inst == UINT32_MAX) { @@ -1537,7 +1523,36 @@ lldb::ValueObjectSP DoGuessValueAt(StackFrame &frame, ConstString reg, InstructionSP instruction_sp = disassembler.GetInstructionList().GetInstructionAtIndex(ii); - if (is_in_return_register && instruction_sp->IsCall()) { + if (instruction_sp->IsCall()) { + ABISP abi_sp = frame.CalculateProcess()->GetABI(); + if (!abi_sp) { + continue; + } + + const char *return_register_name; + if (!abi_sp->GetPointerReturnRegister(return_register_name)) { + continue; + } + + const RegisterInfo *return_register_info = + frame.GetRegisterContext()->GetRegisterInfoByName( + return_register_name); + if (!return_register_info) { + continue; + } + + int64_t offset = 0; + + if (!MatchUnaryOp(MatchOpType(Instruction::Operand::Type::Dereference), + MatchRegOp(*return_register_info))(op) && + !MatchUnaryOp( + MatchOpType(Instruction::Operand::Type::Dereference), + MatchBinaryOp(MatchOpType(Instruction::Operand::Type::Sum), + MatchRegOp(*return_register_info), + FetchImmOp(offset)))(op)) { + continue; + } + llvm::SmallVector operands; if (!instruction_sp->ParseOperands(operands) || operands.size() != 1) { continue; @@ -1564,7 +1579,7 @@ lldb::ValueObjectSP DoGuessValueAt(StackFrame &frame, ConstString reg, } CompilerType return_type = function_type.GetFunctionReturnType(); RegisterValue return_value; - if (!frame.GetRegisterContext()->ReadRegister(&return_register_info, + if (!frame.GetRegisterContext()->ReadRegister(return_register_info, return_value)) { break; } -- 2.7.4