[Lldb-commits] [lldb] r187361 - Adds a DW_OP_call_frame_cfa handler when evaluating DWARF 3/4 expressions

Ashok Thirumurthi ashok.thirumurthi at intel.com
Mon Jul 29 09:05:11 PDT 2013


Author: athirumu
Date: Mon Jul 29 11:05:11 2013
New Revision: 187361

URL: http://llvm.org/viewvc/llvm-project?rev=187361&view=rev
Log:
Adds a DW_OP_call_frame_cfa handler when evaluating DWARF 3/4 expressions
in LLDB that load the canonical frame address rather than a location list.

- Handles the simple case where a CFA can be pulled from the current stack frame.
- Fixes more than one hundred failing tests with gcc 4.8!

TODO: Use UnwindPlan::GetRowForFunctionOffset if the DWARFExpression needs
to be evaluated in a context analogous to a virtual unwind (perhaps using RegisterContextLLDB).

- Also adds some comments to DWARFCallFrameInfo whenever I got confused.

Modified:
    lldb/trunk/source/Expression/DWARFExpression.cpp
    lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp

Modified: lldb/trunk/source/Expression/DWARFExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/DWARFExpression.cpp?rev=187361&r1=187360&r2=187361&view=diff
==============================================================================
--- lldb/trunk/source/Expression/DWARFExpression.cpp (original)
+++ lldb/trunk/source/Expression/DWARFExpression.cpp Mon Jul 29 11:05:11 2013
@@ -37,6 +37,7 @@
 #include "lldb/Target/Process.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/StackFrame.h"
+#include "lldb/Target/StackID.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -2627,6 +2628,37 @@ DWARFExpression::Evaluate
         case DW_OP_stack_value:
             stack.back().SetValueType(Value::eValueTypeScalar);
             break;
+
+        //----------------------------------------------------------------------
+        // OPCODE: DW_OP_call_frame_cfa
+        // OPERANDS: None
+        // DESCRIPTION: Specifies a DWARF expression that pushes the value of
+        // the canonical frame address consistent with the call frame information
+        // located in .debug_frame (or in the FDEs of the eh_frame section).
+        //----------------------------------------------------------------------
+        case DW_OP_call_frame_cfa:
+            if (frame)
+            {
+                // Note that we don't have to parse FDEs because this DWARF expression
+                // is commonly evaluated with a valid stack frame.
+                StackID id = frame->GetStackID();                
+                addr_t cfa = id.GetCallFrameAddress();
+                if (cfa != LLDB_INVALID_ADDRESS)
+                {
+                    stack.push_back(Scalar(cfa));
+                    stack.back().SetValueType (Value::eValueTypeHostAddress);
+                }
+                else
+                    if (error_ptr)
+                        error_ptr->SetErrorString ("Stack frame does not include a canonical frame address for DW_OP_call_frame_cfa opcode.");
+            }
+            else
+            {
+                if (error_ptr)
+                    error_ptr->SetErrorString ("Invalid stack frame in context for DW_OP_call_frame_cfa opcode.");
+                return false;
+            }
+            break;
         }
     }
 

Modified: lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp?rev=187361&r1=187360&r2=187361&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp (original)
+++ lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp Mon Jul 29 11:05:11 2013
@@ -155,7 +155,7 @@ DWARFCallFrameInfo::ParseCIE (const dw_o
         //    cie.offset = cie_offset;
         //    cie.length = length;
         //    cie.cieID = cieID;
-        cie_sp->ptr_encoding = DW_EH_PE_absptr;
+        cie_sp->ptr_encoding = DW_EH_PE_absptr; // default
         cie_sp->version = m_cfi_data.GetU8(&offset);
 
         for (i=0; i<CFI_AUG_MAX_SIZE; ++i)
@@ -233,6 +233,7 @@ DWARFCallFrameInfo::ParseCIE (const dw_o
                             // Data shall include a 1 byte argument that
                             // represents the pointer encoding for the address
                             // pointers used in the FDE.
+                            // Example: 0x1B == DW_EH_PE_pcrel | DW_EH_PE_sdata4 
                             cie_sp->ptr_encoding = m_cfi_data.GetU8(&offset);
                             break;
                     }





More information about the lldb-commits mailing list