diff options
4 files changed, 66 insertions, 17 deletions
diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp index 563c28a36d6..dced0224a28 100644 --- a/lldb/source/Expression/ClangUserExpression.cpp +++ b/lldb/source/Expression/ClangUserExpression.cpp @@ -296,7 +296,11 @@ ClangUserExpression::Parse (Stream &error_stream, } else { - error_stream.Printf ("error: expression can't be interpreted or run\n", num_errors); + const char *error_cstr = jit_error.AsCString(); + if (error_cstr && error_cstr[0]) + error_stream.Printf ("error: %s\n", error_cstr); + else + error_stream.Printf ("error: expression can't be interpreted or run\n", num_errors); return false; } } diff --git a/lldb/source/Expression/ClangUtilityFunction.cpp b/lldb/source/Expression/ClangUtilityFunction.cpp index 7882371ef3a..a48cf00b470 100644 --- a/lldb/source/Expression/ClangUtilityFunction.cpp +++ b/lldb/source/Expression/ClangUtilityFunction.cpp @@ -135,7 +135,11 @@ ClangUtilityFunction::Install (Stream &error_stream, } else { - error_stream.Printf ("error: expression can't be interpreted or run\n", num_errors); + const char *error_cstr = jit_error.AsCString(); + if (error_cstr && error_cstr[0]) + error_stream.Printf ("error: %s\n", error_cstr); + else + error_stream.Printf ("error: expression can't be interpreted or run\n", num_errors); return false; } } diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp index 306b427048b..d22773ed9c3 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp @@ -363,12 +363,17 @@ GDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp) ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4x;", m_thread.GetID()); response.GetStringRef().append (thread_id_cstr); } - data_sp.reset (new DataBufferHeap (response.GetStringRef().c_str(), - response.GetStringRef().size())); - return true; + const char *g_data = response.GetStringRef().c_str(); + size_t g_data_len = strspn(g_data, "0123456789abcdefABCDEF"); + if (g_data_len > 0) + { + data_sp.reset (new DataBufferHeap (g_data, g_data_len)); + return true; + } } } } + data_sp.reset(); return false; } @@ -403,10 +408,21 @@ GDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data uint32_t num_restored = 0; // We need to manually go through all of the registers and // restore them manually - DataExtractor data (G_packet + 1, // Skip the leading 'G' - G_packet_len - 1, - m_reg_data.GetByteOrder(), - m_reg_data.GetAddressByteSize()); + + response.GetStringRef().assign (G_packet, G_packet_len); + response.SetFilePos(1); // Skip the leading 'G' + DataBufferHeap buffer (m_reg_data.GetByteSize(), 0); + DataExtractor restore_data (buffer.GetBytes(), + buffer.GetByteSize(), + m_reg_data.GetByteOrder(), + m_reg_data.GetAddressByteSize()); + + const uint32_t bytes_extracted = response.GetHexBytes ((void *)restore_data.GetDataStart(), + restore_data.GetByteSize(), + '\xcc'); + + if (bytes_extracted < restore_data.GetByteSize()) + restore_data.SetData(restore_data.GetDataStart(), bytes_extracted, m_reg_data.GetByteOrder()); //ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, DataExtractor &data) const RegisterInfo *reg_info; @@ -419,15 +435,40 @@ GDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data bool write_reg = true; const uint32_t reg_byte_offset = reg_info->byte_offset; const uint32_t reg_byte_size = reg_info->byte_size; - if (m_reg_valid[reg]) + + const char *restore_src = (const char *)restore_data.PeekData(reg_byte_offset, reg_byte_size); + if (restore_src) { - const uint8_t *current_src = m_reg_data.PeekData(reg_byte_offset, reg_byte_size); - const uint8_t *restore_src = data.PeekData(reg_byte_offset, reg_byte_size); - if (current_src && restore_src) - write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0; + if (m_reg_valid[reg]) + { + const char *current_src = (const char *)m_reg_data.PeekData(reg_byte_offset, reg_byte_size); + if (current_src) + write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0; + } + + if (write_reg) + { + StreamString packet; + packet.Printf ("P%x=", reg); + packet.PutBytesAsRawHex8 (restore_src, + reg_byte_size, + lldb::endian::InlHostByteOrder(), + lldb::endian::InlHostByteOrder()); + + if (thread_suffix_supported) + packet.Printf (";thread:%4.4x;", m_thread.GetID()); + + m_reg_valid[reg] = false; + if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), + packet.GetString().size(), + response, + false)) + { + if (response.IsOKResponse()) + ++num_restored; + } + } } - if (WriteRegisterBytes(reg_info, data, reg_byte_offset)) - ++num_restored; } return num_restored > 0; } diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 0008bdbc425..58799f7011a 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -1596,7 +1596,7 @@ ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &er addr_t arg1_addr = 0; addr_t arg2_len = size; addr_t arg3_prot = PROT_NONE; - addr_t arg4_flags = MAP_ANON; + addr_t arg4_flags = MAP_ANON | MAP_PRIVATE; addr_t arg5_fd = -1; addr_t arg6_offset = 0; if (permissions & lldb::ePermissionsReadable) |

