summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2013-07-12 23:35:21 +0000
committerSean Callanan <scallanan@apple.com>2013-07-12 23:35:21 +0000
commitd2a507a6e693b878f50bb1b43500d59721adc5ed (patch)
tree4b630f90a87df9b280a1abdabfa97315e7d10bbf
parent66bc419366b779876f7a78c7127b135d70f3b9ae (diff)
downloadbcm5719-llvm-d2a507a6e693b878f50bb1b43500d59721adc5ed.tar.gz
bcm5719-llvm-d2a507a6e693b878f50bb1b43500d59721adc5ed.zip
Modified the expression parser to only try to
write to registers if they were modified in the expression. This eliminates spurious errors if the register can't be written to but the expression didn't write to it anyway. Also improved error handling for the materializer to make "couldn't materialize struct" errors more informative. <rdar://problem/14322579> llvm-svn: 186228
-rw-r--r--lldb/source/Expression/ClangUserExpression.cpp7
-rw-r--r--lldb/source/Expression/Materializer.cpp13
2 files changed, 15 insertions, 5 deletions
diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp
index 18f7a8daaa1..7f09f6fa094 100644
--- a/lldb/source/Expression/ClangUserExpression.cpp
+++ b/lldb/source/Expression/ClangUserExpression.cpp
@@ -753,8 +753,6 @@ ClangUserExpression::FinalizeJITExecution (Stream &error_stream,
lldb::addr_t function_stack_bottom,
lldb::addr_t function_stack_top)
{
- Error expr_error;
-
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
if (log)
@@ -762,7 +760,7 @@ ClangUserExpression::FinalizeJITExecution (Stream &error_stream,
if (!m_dematerializer_sp)
{
- error_stream.Printf ("Couldn't dematerialize struct : no dematerializer is present");
+ error_stream.Printf ("Couldn't apply expression side effects : no dematerializer is present");
return false;
}
@@ -772,7 +770,7 @@ ClangUserExpression::FinalizeJITExecution (Stream &error_stream,
if (!dematerialize_error.Success())
{
- error_stream.Printf ("Couldn't dematerialize struct : %s\n", expr_error.AsCString("unknown error"));
+ error_stream.Printf ("Couldn't apply expression side effects : %s\n", dematerialize_error.AsCString("unknown error"));
return false;
}
@@ -937,7 +935,6 @@ ClangUserExpression::Execute (Stream &error_stream,
}
else
{
- error_stream.Printf("Errored out in %s: Couldn't FinalizeJITExpression", __FUNCTION__);
return eExecutionSetupError;
}
}
diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp
index 6236eda1a86..8a1900ebb73 100644
--- a/lldb/source/Expression/Materializer.cpp
+++ b/lldb/source/Expression/Materializer.cpp
@@ -1164,6 +1164,8 @@ public:
return;
}
+ m_register_contents.reset(new DataBufferHeap(register_data.GetDataStart(), register_data.GetByteSize()));
+
Error write_error;
map.WriteMemory(load_addr, register_data.GetDataStart(), register_data.GetByteSize(), write_error);
@@ -1213,6 +1215,16 @@ public:
return;
}
+ if (!memcmp(register_data.GetDataStart(), m_register_contents->GetBytes(), register_data.GetByteSize()))
+ {
+ // No write required, and in particular we avoid errors if the register wasn't writable
+
+ m_register_contents.reset();
+ return;
+ }
+
+ m_register_contents.reset();
+
RegisterValue register_value (const_cast<uint8_t*>(register_data.GetDataStart()), register_data.GetByteSize(), register_data.GetByteOrder());
if (!reg_context_sp->WriteRegister(&m_register_info, register_value))
@@ -1262,6 +1274,7 @@ public:
}
private:
RegisterInfo m_register_info;
+ lldb::DataBufferSP m_register_contents;
};
uint32_t
OpenPOWER on IntegriCloud