nitesh.jain retitled this revision from "[LLDB][MIPS] Fix FPU Size Based on 
Dynamic FR/FRE bit" to "[LLDB][MIPS] Fix FPU Size Based on Dynamic FR".
nitesh.jain updated the summary for this revision.
nitesh.jain updated this revision to Diff 63201.
nitesh.jain added a comment.

Update diff as per suggestion. In case of FRE mode, FPU registers are all 64 
bit.


Repository:
  rL LLVM

http://reviews.llvm.org/D20357

Files:
  include/lldb/lldb-private-types.h
  source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
  source/Plugins/Process/Utility/DynamicRegisterInfo.h
  source/Plugins/Process/Utility/RegisterInfos_mips.h
  source/Plugins/Process/Utility/RegisterInfos_mips64.h
  source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
  source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
  source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
  source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp

Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -539,6 +539,7 @@
                 ConstString set_name;
                 std::vector<uint32_t> value_regs;
                 std::vector<uint32_t> invalidate_regs;
+                uint8_t dwarf_opcode[8];
                 RegisterInfo reg_info = { NULL,                 // Name
                     NULL,                 // Alt name
                     0,                    // byte size
@@ -553,7 +554,9 @@
                         reg_num           // native register number
                     },
                     NULL,
-                    NULL
+                    NULL,
+                    NULL,
+                    0                    // dynamic_size default value
                 };
 
                 while (response.GetNameColonValue(name, value))
@@ -638,6 +641,22 @@
                     {
                         SplitCommaSeparatedRegisterNumberString(value, invalidate_regs, 16);
                     }
+                    else if (name.compare("dynamic_size_dwarf_len") == 0)
+                    {
+                        reg_info.dynamic_size_dwarf_len = StringConvert::ToUInt32(value.c_str(), 0, 0);
+                    }
+                    else if (name.compare("dynamic_size_dwarf_expr_bytes") == 0)
+                    {
+                       uint32_t dwarf_len = reg_info.dynamic_size_dwarf_len;
+                       assert(dwarf_len > 0);
+                       StringExtractor name_extractor;
+
+                       // Swap "value" over into "name_extractor"
+                       name_extractor.GetStringRef().swap(value);
+                       uint32_t ret_val = name_extractor.GetHexBytesAvail (dwarf_opcode, dwarf_len);
+                       assert(dwarf_len == ret_val);
+                       reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode;
+                    }
                 }
 
                 reg_info.byte_offset = reg_offset;
@@ -4373,6 +4392,7 @@
         ConstString set_name;
         std::vector<uint32_t> value_regs;
         std::vector<uint32_t> invalidate_regs;
+        uint8_t dwarf_opcode[8];
         bool encoding_set = false;
         bool format_set = false;
         RegisterInfo reg_info = { NULL,                 // Name
@@ -4389,10 +4409,12 @@
                 cur_reg_num         // native register number
             },
             NULL,
-            NULL
+            NULL,
+            NULL,
+            0
         };
 
-        reg_node.ForEachAttribute([&target_info, &gdb_group, &gdb_type, &reg_name, &alt_name, &set_name, &value_regs, &invalidate_regs, &encoding_set, &format_set, &reg_info, &cur_reg_num, &reg_offset](const llvm::StringRef &name, const llvm::StringRef &value) -> bool {
+        reg_node.ForEachAttribute([&target_info, &gdb_group, &gdb_type, &reg_name, &alt_name, &set_name, &value_regs, &invalidate_regs, &encoding_set, &format_set, &reg_info, &cur_reg_num, &reg_offset, &dwarf_opcode](const llvm::StringRef &name, const llvm::StringRef &value) -> bool {
             if (name == "name")
             {
                 reg_name.SetString(value);
@@ -4480,6 +4502,21 @@
             {
                 SplitCommaSeparatedRegisterNumberString(value, invalidate_regs, 0);
             }
+            else if (name == "dynamic_size_dwarf_len")
+            {
+                reg_info.dynamic_size_dwarf_len = StringConvert::ToUInt32 (value.data(), 0, 0);
+            }
+            else if (name == "dynamic_size_dwarf_expr_bytes")
+            {
+                StringExtractor name_extractor;
+                uint32_t dwarf_len = reg_info.dynamic_size_dwarf_len;
+                assert(dwarf_len > 0);
+                std::string opcode_string = value.str();                
+                name_extractor.GetStringRef().swap(opcode_string);
+                uint32_t ret_val = name_extractor.GetHexBytesAvail (dwarf_opcode, dwarf_len);
+                assert(dwarf_len == ret_val);
+                reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode;
+            }
             else
             {
                 printf("unhandled attribute %s = %s\n", name.data(), value.data());
Index: source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
===================================================================
--- source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
+++ source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
@@ -46,6 +46,13 @@
 
     void
     HardcodeARMRegisters(bool from_scratch);
+
+    // Detect the register size dynamically.
+    uint32_t
+    UpdateDynamicRegisterSize (ExecutionContext *exe_ctx,
+                               RegisterContext *reg_ctx,
+                               const lldb_private::ArchSpec &arch,
+                               RegisterInfo* reg_info, size_t reg);
 };
 
 class GDBRemoteRegisterContext : public RegisterContext
Index: source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
+++ source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
@@ -20,6 +20,10 @@
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Utility/Utils.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Expression/DWARFExpression.h"
+#include "lldb/Core/dwarf.h"
+#include "lldb/Core/Value.h"
 // Project includes
 #include "Utility/StringExtractorGDBRemote.h"
 #include "ProcessGDBRemote.h"
@@ -89,7 +93,15 @@
 const RegisterInfo *
 GDBRemoteRegisterContext::GetRegisterInfoAtIndex (size_t reg)
 {
-    return m_reg_info.GetRegisterInfoAtIndex (reg);
+    ExecutionContext exe_ctx (CalculateThread());
+    const ArchSpec &arch = m_thread.GetProcess()->GetTarget().GetArchitecture();
+    RegisterInfo* reg_info = const_cast<RegisterInfo *>(m_reg_info.GetRegisterInfoAtIndex (reg));
+    if(reg_info->dynamic_size_dwarf_len)
+    {
+        uint8_t reg_size = m_reg_info.UpdateDynamicRegisterSize (&exe_ctx, this, arch, reg_info, reg);
+        reg_info->byte_size = reg_size;
+    }
+    return const_cast<const RegisterInfo *>(reg_info);
 }
 
 size_t
@@ -939,6 +951,47 @@
     return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num);
 }
 
+uint32_t
+GDBRemoteDynamicRegisterInfo::UpdateDynamicRegisterSize (ExecutionContext *exe_ctx,
+                                                         RegisterContext *reg_ctx,
+                                                         const lldb_private::ArchSpec &arch,
+                                                         RegisterInfo* reg_info, size_t reg)
+{
+    // In MIPS, the floating point registers size is depends on FR.
+    // if SR.26  == 1 then all floating point registers are 64 bits.
+    // else they are all 32 bits.
+
+    int evaluate_result;
+    uint8_t opcode_len = reg_info->dynamic_size_dwarf_len;
+    uint32_t addr_size =  arch.GetAddressByteSize ();
+    uint8_t* opcode_ptr = m_dynamic_reg_size_map[reg].data();
+    DataExtractor dwarf_data (opcode_ptr, opcode_len, 
+                              arch.GetByteOrder (),addr_size);
+    ModuleSP opcode_ctx;
+    DWARFExpression dwarf_expr (opcode_ctx, dwarf_data, nullptr, 0, opcode_len);
+    Value result;
+    Error error;
+    const lldb::offset_t offset = 0;
+    if(dwarf_expr.Evaluate (exe_ctx, nullptr, nullptr, reg_ctx, opcode_ctx, dwarf_data, nullptr,
+                            offset, opcode_len, eRegisterKindDWARF, nullptr, nullptr, result, &error))
+    {
+        evaluate_result = result.GetScalar().SInt(-1);
+        switch (evaluate_result)
+        {
+            case 0: return 4;break;
+            case 1: return 8;break;
+            case -1: return reg_info->byte_size; break;
+            default: assert(false && "Incorrect Dwarf Opcode bytes");
+                     break;
+        }
+        return 0;
+    }
+    else
+    {
+        printf("Error executing DwarfExpression::Evaluate %s\n", error.AsCString());
+        return reg_info->byte_size;
+    }
+}
 
 void
 GDBRemoteDynamicRegisterInfo::HardcodeARMRegisters(bool from_scratch)
Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===================================================================
--- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -1634,6 +1634,14 @@
         response.PutChar (';');
     }
 
+    if (reg_info->dynamic_size_dwarf_len > 0)
+    {
+       response.Printf("dynamic_size_dwarf_len:%" PRIu64 ";",reg_info->dynamic_size_dwarf_len);
+       response.PutCString("dynamic_size_dwarf_expr_bytes:");
+       for(uint32_t i = 0; i < reg_info->dynamic_size_dwarf_len; ++i)
+           response.PutHex8 (reg_info->dynamic_size_dwarf_expr_bytes[i]);
+       response.PutChar(';');
+    }
     return SendPacketNoLock(response.GetData(), response.GetSize());
 }
 
@@ -1829,7 +1837,10 @@
         return SendErrorResponse (0x47);
     }
 
-    if (reg_size != reg_info->byte_size)
+    // The dwarf expression are evaluate on LLDB side
+    // which may cause register size to change
+    // Hence the reg_size may not be same as reg_info->bytes_size
+    if ((reg_size != reg_info->byte_size) && (reg_info->dynamic_size_dwarf_len == 0))
     {
         return SendIllFormedResponse (packet, "P packet register size is incorrect");
     }
Index: source/Plugins/Process/Utility/RegisterInfos_mips64.h
===================================================================
--- source/Plugins/Process/Utility/RegisterInfos_mips64.h
+++ source/Plugins/Process/Utility/RegisterInfos_mips64.h
@@ -13,7 +13,7 @@
 // C++ Includes
 // Other libraries and framework includes
 #include "llvm/Support/Compiler.h"
-
+#include "lldb/Core/dwarf.h"
 // Project includes
 
 #ifdef DECLARE_REGISTER_INFOS_MIPS64_STRUCT
@@ -44,32 +44,39 @@
 #ifdef LINUX_MIPS64
     #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4) \
          { #reg, alt, sizeof(((GPR_linux_mips*)0)->reg), GPR_OFFSET(reg), eEncodingUint, \
-          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
+          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL, NULL, 0}
 #else
     #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)    \
          { #reg, alt, sizeof(((GPR_freebsd_mips*)0)->reg), GPR_OFFSET(reg), eEncodingUint, \
-          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
+          eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL, NULL, 0}
 #endif
 
 #define DEFINE_GPR_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((GPR_linux_mips*)0)->reg) / 2, GPR_OFFSET(reg), eEncodingUint, \
-      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL }
+      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips64 }, NULL, NULL, NULL, 0}
+
+const uint8_t dwarf_opcode_mips64 [] = {
+                                           llvm::dwarf::DW_OP_regx, dwarf_sr_mips64, llvm::dwarf::DW_OP_lit1,
+                                           llvm::dwarf::DW_OP_lit26, llvm::dwarf::DW_OP_shl, llvm::dwarf::DW_OP_and, 
+                                           llvm::dwarf::DW_OP_lit26, llvm::dwarf::DW_OP_shr
+                                       };
+
 
 #define DEFINE_FPR(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((FPR_linux_mips*)0)->reg), FPR_OFFSET(reg), eEncodingIEEE754,  \
-      eFormatFloat, { kind1, kind2, kind3, kind4, fpr_##reg##_mips64 }, NULL, NULL }
+      eFormatFloat, { kind1, kind2, kind3, kind4, fpr_##reg##_mips64 }, NULL, NULL, dwarf_opcode_mips64, sizeof(dwarf_opcode_mips64)}
 
 #define DEFINE_FPR_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((FPR_linux_mips*)0)->reg), FPR_OFFSET(reg), eEncodingUint,   \
-      eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips64 }, NULL, NULL }
+      eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips64 }, NULL, NULL, NULL, 0 }
 
 #define DEFINE_MSA(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingVector,   \
-      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL }
+      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL, NULL, 0}
 
 #define DEFINE_MSA_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingUint,   \
-      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL }
+      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips64 }, NULL, NULL, NULL, 0}
 
 static RegisterInfo
 g_register_infos_mips64[] =
Index: source/Plugins/Process/Utility/RegisterInfos_mips.h
===================================================================
--- source/Plugins/Process/Utility/RegisterInfos_mips.h
+++ source/Plugins/Process/Utility/RegisterInfos_mips.h
@@ -13,7 +13,7 @@
 // C++ Includes
 // Other libraries and framework includes
 #include "llvm/Support/Compiler.h"
-
+#include "lldb/Core/dwarf.h"
 // Project includes
 
 #ifdef DECLARE_REGISTER_INFOS_MIPS_STRUCT
@@ -36,23 +36,29 @@
 // Note that the size and offset will be updated by platform-specific classes.
 #define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)            \
     { #reg, alt, sizeof(((GPR_linux_mips*)NULL)->reg) / 2, GPR_OFFSET(reg), eEncodingUint,  \
-      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips }, NULL, NULL }
+      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_mips }, NULL, NULL, NULL, 0}
+
+const uint8_t dwarf_opcode_mips [] = {
+                                        llvm::dwarf::DW_OP_regx, dwarf_sr_mips, llvm::dwarf::DW_OP_lit1,
+                                        llvm::dwarf::DW_OP_lit26, llvm::dwarf::DW_OP_shl, llvm::dwarf::DW_OP_and,
+                                        llvm::dwarf::DW_OP_lit26, llvm::dwarf::DW_OP_shr
+                                     };
 
 #define DEFINE_FPR(reg, alt, kind1, kind2, kind3, kind4)           \
     { #reg, alt, sizeof(((FPR_linux_mips*)NULL)->reg), FPR_OFFSET(reg), eEncodingIEEE754,   \
-      eFormatFloat, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL }
+      eFormatFloat, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL, dwarf_opcode_mips, sizeof(dwarf_opcode_mips)}
 
 #define DEFINE_FPR_INFO(reg, alt, kind1, kind2, kind3, kind4)      \
    { #reg, alt, sizeof(((FPR_linux_mips*)NULL)->reg), FPR_OFFSET(reg), eEncodingUint,   \
-     eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL }
+     eFormatHex, { kind1, kind2, kind3, kind4, fpr_##reg##_mips }, NULL, NULL, NULL, 0 }
 
 #define DEFINE_MSA(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingVector,   \
-      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL }
+      eFormatVectorOfUInt8, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL, NULL, 0 }
 
 #define DEFINE_MSA_INFO(reg, alt, kind1, kind2, kind3, kind4)    \
     { #reg, alt, sizeof(((MSA_linux_mips*)0)->reg), MSA_OFFSET(reg), eEncodingUint, \
-      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL }
+      eFormatHex, { kind1, kind2, kind3, kind4, msa_##reg##_mips }, NULL, NULL, NULL, 0 }
 
 // RegisterKind: EH_Frame, DWARF, Generic, Procss Plugin, LLDB
 
Index: source/Plugins/Process/Utility/DynamicRegisterInfo.h
===================================================================
--- source/Plugins/Process/Utility/DynamicRegisterInfo.h
+++ source/Plugins/Process/Utility/DynamicRegisterInfo.h
@@ -81,6 +81,8 @@
     typedef std::vector <reg_num_collection> set_reg_num_collection;
     typedef std::vector <lldb_private::ConstString> name_collection;
     typedef std::map<uint32_t, reg_num_collection> reg_to_regs_map;
+    typedef std::vector <uint8_t> dwarf_opcode;
+    typedef std::map<uint32_t, dwarf_opcode> dynamic_reg_size_map;
 
     lldb_private::RegisterInfo *
     GetRegisterInfo (const lldb_private::ConstString &reg_name);
@@ -91,6 +93,7 @@
     name_collection m_set_names;
     reg_to_regs_map m_value_regs_map;
     reg_to_regs_map m_invalidate_regs_map;
+    dynamic_reg_size_map m_dynamic_reg_size_map;
     size_t m_reg_data_byte_size;   // The number of bytes required to store all registers
     bool m_finalized;
 };
Index: source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
===================================================================
--- source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
+++ source/Plugins/Process/Utility/DynamicRegisterInfo.cpp
@@ -19,7 +19,7 @@
 #include "lldb/Core/StructuredData.h"
 #include "lldb/DataFormatters/FormatManager.h"
 #include "lldb/Host/StringConvert.h"
-
+#include "lldb/Utility/StringExtractor.h"
 using namespace lldb;
 using namespace lldb_private;
 
@@ -30,6 +30,7 @@
     m_set_names (),
     m_value_regs_map (),
     m_invalidate_regs_map (),
+    m_dynamic_reg_size_map (),
     m_reg_data_byte_size (0),
     m_finalized (false)
 {
@@ -43,6 +44,7 @@
     m_set_names (),
     m_value_regs_map (),
     m_invalidate_regs_map (),
+    m_dynamic_reg_size_map (),
     m_reg_data_byte_size (0),
     m_finalized (false)
 {
@@ -292,6 +294,26 @@
 
         reg_info.byte_size = bitsize / 8;
 
+        uint8_t dynamic_size = 0;
+        reg_info_dict->GetValueForKeyAsInteger("dynamic_size_dwarf_len", dynamic_size);
+        reg_info.dynamic_size_dwarf_len = dynamic_size;
+
+        std::string dwarf_opcode_string;
+        if(reg_info_dict->GetValueForKeyAsString("dynamic_size_dwarf_expr_bytes", dwarf_opcode_string))
+        {
+            uint8_t dwarf_opcode[8];
+            uint32_t j;
+            assert(reg_info.dynamic_size_dwarf_len > 0);
+            StringExtractor name_extractor;
+
+            // Swap "dwarf_opcode_string" over into "name_extractor"
+            name_extractor.GetStringRef().swap(dwarf_opcode_string);
+            uint32_t ret_val = name_extractor.GetHexBytesAvail (dwarf_opcode, reg_info.dynamic_size_dwarf_len);
+            assert(ret_val == reg_info.dynamic_size_dwarf_len);
+            for (j = 0; j < reg_info.dynamic_size_dwarf_len; ++j)
+                 m_dynamic_reg_size_map[i].push_back(dwarf_opcode[j]);
+        }
+
         std::string format_str;
         if (reg_info_dict->GetValueForKeyAsString("format", format_str, nullptr))
         {
@@ -417,6 +439,11 @@
         for (i=0; reg_info.invalidate_regs[i] != LLDB_INVALID_REGNUM; ++i)
             m_invalidate_regs_map[reg_num].push_back(reg_info.invalidate_regs[i]);
     }
+    if (reg_info.dynamic_size_dwarf_expr_bytes)
+    {
+        for (i = 0; i < reg_info.dynamic_size_dwarf_len; ++i)
+           m_dynamic_reg_size_map[reg_num].push_back(reg_info.dynamic_size_dwarf_expr_bytes[i]);
+    }
     m_regs.push_back (reg_info);
     uint32_t set = GetRegisterSetIndexByName (set_name, true);
     assert (set < m_sets.size());
@@ -702,11 +729,12 @@
     for (size_t i=0; i<num_regs; ++i)
     {
         s.Printf("[%3" PRIu64 "] name = %-10s", (uint64_t)i, m_regs[i].name);
-        s.Printf(", size = %2u, offset = %4u, encoding = %u, format = %-10s",
+        s.Printf(", size = %2u, offset = %4u, encoding = %u, format = %-10s, dynamic_size_dwarf_len = %lu",
                  m_regs[i].byte_size,
                  m_regs[i].byte_offset,
                  m_regs[i].encoding,
-                 FormatManager::GetFormatAsCString (m_regs[i].format));
+                 FormatManager::GetFormatAsCString (m_regs[i].format),
+                 m_regs[i].dynamic_size_dwarf_len); 
         if (m_regs[i].kinds[eRegisterKindProcessPlugin] != LLDB_INVALID_REGNUM)
             s.Printf(", process plugin = %3u", m_regs[i].kinds[eRegisterKindProcessPlugin]);
         if (m_regs[i].kinds[eRegisterKindDWARF] != LLDB_INVALID_REGNUM)
Index: include/lldb/lldb-private-types.h
===================================================================
--- include/lldb/lldb-private-types.h
+++ include/lldb/lldb-private-types.h
@@ -54,6 +54,10 @@
                                    // null, all registers in this list will be invalidated when the value of this
                                    // register changes.  For example, the invalidate list for eax would be rax
                                    // ax, ah, and al.
+        const uint8_t *dynamic_size_dwarf_expr_bytes; // A DWARF expression that when evaluated gives 
+                                                      // the byte size of this register. 
+        size_t dynamic_size_dwarf_len; // The length of the DWARF expression in bytes in the 
+                                       // dynamic_size_dwarf_expr_bytes member
     };
 
     //----------------------------------------------------------------------
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to