[Lldb-commits] [lldb] r281428 - Cleaned up the code that handles function return addresses in "frame diagnose."
Sean Callanan via lldb-commits
lldb-commits at lists.llvm.org
Tue Sep 13 17:48:19 PDT 2016
Author: spyffe
Date: Tue Sep 13 19:48:19 2016
New Revision: 281428
URL: http://llvm.org/viewvc/llvm-project?rev=281428&view=rev
Log:
Cleaned up the code that handles function return addresses in "frame diagnose."
Modified:
lldb/trunk/source/Target/StackFrame.cpp
Modified: lldb/trunk/source/Target/StackFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=281428&r1=281427&r2=281428&view=diff
==============================================================================
--- lldb/trunk/source/Target/StackFrame.cpp (original)
+++ lldb/trunk/source/Target/StackFrame.cpp Tue Sep 13 19:48:19 2016
@@ -1490,6 +1490,8 @@ lldb::ValueObjectSP DoGuessValueAt(Stack
// 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(Stack
}
}
- 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(Stack
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<Instruction::Operand, 1> operands;
if (!instruction_sp->ParseOperands(operands) || operands.size() != 1) {
continue;
@@ -1564,7 +1579,7 @@ lldb::ValueObjectSP DoGuessValueAt(Stack
}
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;
}
More information about the lldb-commits
mailing list