diff options
| author | Sean Callanan <scallanan@apple.com> | 2014-03-25 22:30:19 +0000 |
|---|---|---|
| committer | Sean Callanan <scallanan@apple.com> | 2014-03-25 22:30:19 +0000 |
| commit | c4ca2c1d60cc1f7d618fcfc8eef3755ee218ba84 (patch) | |
| tree | f7e658ec69f02b28751af869a33c0054ba0b9541 | |
| parent | dd75b8556d29538dd603f7325a633ce9bf4a41a1 (diff) | |
| download | bcm5719-llvm-c4ca2c1d60cc1f7d618fcfc8eef3755ee218ba84.tar.gz bcm5719-llvm-c4ca2c1d60cc1f7d618fcfc8eef3755ee218ba84.zip | |
Made the Materializer not write back variables
if they didn't change, just like it does for
registers. This makes life easier for kernel
debugging and any other situation where values
are read-only.
<rdar://problem/16367795>
llvm-svn: 204764
| -rw-r--r-- | lldb/source/Expression/Materializer.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp index 25ffd7b4b19..70d862e3451 100644 --- a/lldb/source/Expression/Materializer.cpp +++ b/lldb/source/Expression/Materializer.cpp @@ -535,6 +535,8 @@ public: m_temporary_allocation = map.Malloc(data.GetByteSize(), byte_align, lldb::ePermissionsReadable | lldb::ePermissionsWritable, IRMemoryMap::eAllocationPolicyMirror, alloc_error); m_temporary_allocation_size = data.GetByteSize(); + m_original_data.reset(new DataBufferHeap(data.GetDataStart(), data.GetByteSize())); + if (!alloc_error.Success()) { err.SetErrorStringWithFormat("couldn't allocate a temporary region for %s: %s", m_variable_sp->GetName().AsCString(), alloc_error.AsCString()); @@ -607,14 +609,28 @@ public: return; } - Error set_error; + bool actually_write = true; - valobj_sp->SetData(data, set_error); + if (m_original_data) + { + if ((data.GetByteSize() == m_original_data->GetByteSize()) && + memcmp(m_original_data->GetBytes(), data.GetDataStart(), data.GetByteSize())) + { + actually_write = false; + } + } - if (!set_error.Success()) + Error set_error; + + if (actually_write) { - err.SetErrorStringWithFormat("couldn't write the new contents of %s back into the variable", m_variable_sp->GetName().AsCString()); - return; + valobj_sp->SetData(data, set_error); + + if (!set_error.Success()) + { + err.SetErrorStringWithFormat("couldn't write the new contents of %s back into the variable", m_variable_sp->GetName().AsCString()); + return; + } } Error free_error; @@ -627,6 +643,7 @@ public: return; } + m_original_data.reset(); m_temporary_allocation = LLDB_INVALID_ADDRESS; m_temporary_allocation_size = 0; } @@ -722,6 +739,7 @@ private: bool m_is_reference; lldb::addr_t m_temporary_allocation; size_t m_temporary_allocation_size; + lldb::DataBufferSP m_original_data; }; uint32_t |

