Restructure the relationship between UnwindLLDB and the
RegisterContextLLDBs it contains.

Previously RegisterContextLLDB objects had a pointer to their "next"
frame down the stack.  e.g. stack starts at frame 0; frame 3 has a
pointer to frame 2.  This is used to retreive callee saved register
values.  When debugging an inferior that has blown out its own stack,
however, this could result in lldb blowing out its own stack while
recursing down to retrieve register values.

RegisterContextLLDB no longer has a pointer to its next frame; it 
has a reference to the UnwindLLDB which contains it.  When it needs
to retrieve a reg value, it asks the UnwindLLDB for that reg value
and UnwindLLDB iterates through the frames until it finds a location.

llvm-svn: 143423
diff --git a/lldb/source/Plugins/Process/Utility/UnwindLLDB.h b/lldb/source/Plugins/Process/Utility/UnwindLLDB.h
index dfd488d..ec9271b 100644
--- a/lldb/source/Plugins/Process/Utility/UnwindLLDB.h
+++ b/lldb/source/Plugins/Process/Utility/UnwindLLDB.h
@@ -18,10 +18,10 @@
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/Unwind.h"
 
-#include "RegisterContextLLDB.h"
-
 namespace lldb_private {
 
+class RegisterContextLLDB;
+
 class UnwindLLDB : public lldb_private::Unwind
 {
 public: 
@@ -29,8 +29,29 @@
     
     virtual
     ~UnwindLLDB() { }
-    
+
 protected:
+    friend class lldb_private::RegisterContextLLDB;
+
+    struct RegisterLocation {
+        enum RegisterLocationTypes
+        {
+            eRegisterNotSaved = 0,              // register was not preserved by callee.  If volatile reg, is unavailable
+            eRegisterSavedAtMemoryLocation,     // register is saved at a specific word of target mem (target_memory_location)
+            eRegisterInRegister,                // register is available in a (possible other) register (register_number)
+            eRegisterSavedAtHostMemoryLocation, // register is saved at a word in lldb's address space
+            eRegisterValueInferred              // register val was computed (and is in inferred_value)
+        };
+        int type;
+        union
+        {
+            lldb::addr_t target_memory_location;
+            uint32_t     register_number;       // in eRegisterKindLLDB register numbering system
+            void*        host_memory_location;
+            uint64_t     inferred_value;        // eRegisterValueInferred - e.g. stack pointer == cfa + offset
+        } location;
+    };
+
     void
     DoClear()
     {
@@ -48,13 +69,27 @@
     lldb::RegisterContextSP
     DoCreateRegisterContextForFrame (lldb_private::StackFrame *frame);
 
+    typedef lldb::SharedPtr<lldb_private::RegisterContextLLDB>::Type RegisterContextLLDBSharedPtr;
+
+    // Needed to retrieve the "next" frame (e.g. frame 2 needs to retrieve frame 1's RegisterContextLLDB)
+    // The RegisterContext for frame_num must already exist or this returns an empty shared pointer.
+    RegisterContextLLDBSharedPtr
+    GetRegisterContextForFrameNum (uint32_t frame_num);
+
+    // Iterate over the RegisterContextLLDB's in our m_frames vector, look for the first one that
+    // has a saved location for this reg.
+    bool
+    SearchForSavedLocationForRegister (uint32_t lldb_regnum, lldb_private::UnwindLLDB::RegisterLocation &regloc, uint32_t starting_frame_num);
+
+
 private:
+
     struct Cursor
     {
         lldb::addr_t start_pc;  // The start address of the function/symbol for this frame - current pc if unknown
         lldb::addr_t cfa;       // The canonical frame address for this stack frame
         lldb_private::SymbolContext sctx;  // A symbol context we'll contribute to & provide to the StackFrame creation
-        RegisterContextLLDB::SharedPtr reg_ctx; // These are all RegisterContextLLDB's
+        RegisterContextLLDBSharedPtr reg_ctx; // These are all RegisterContextLLDB's
 
         Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx() { }
     private: