[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