diff options
| author | Sean Callanan <scallanan@apple.com> | 2013-07-12 23:35:21 +0000 | 
|---|---|---|
| committer | Sean Callanan <scallanan@apple.com> | 2013-07-12 23:35:21 +0000 | 
| commit | d2a507a6e693b878f50bb1b43500d59721adc5ed (patch) | |
| tree | 4b630f90a87df9b280a1abdabfa97315e7d10bbf | |
| parent | 66bc419366b779876f7a78c7127b135d70f3b9ae (diff) | |
| download | bcm5719-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.cpp | 7 | ||||
| -rw-r--r-- | lldb/source/Expression/Materializer.cpp | 13 | 
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 | 

