diff options
| author | Greg Clayton <gclayton@apple.com> | 2011-05-17 03:51:29 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2011-05-17 03:51:29 +0000 |
| commit | e6a9e439d451fa1741235e157591a7eb7b91a5e7 (patch) | |
| tree | c42a70ed40265aafadbf0c7ece2f11c14369e993 /lldb/source/Plugins | |
| parent | d495c5340d57a30a83496e6e9794b8bc746f99ad (diff) | |
| download | bcm5719-llvm-e6a9e439d451fa1741235e157591a7eb7b91a5e7.tar.gz bcm5719-llvm-e6a9e439d451fa1741235e157591a7eb7b91a5e7.zip | |
Fixed the "mmap" to work on MacOSX/darwin by supplying the correct arguemnts.
Modified ClangUserExpression and ClangUtilityFunction to display the actual
error (if one is available) that made the JIT fail instead of a canned
response.
Fixed the restoring of all register values when the 'G' packet doesn't work
to use the correct data.
llvm-svn: 131454
Diffstat (limited to 'lldb/source/Plugins')
| -rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp | 69 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 2 |
2 files changed, 56 insertions, 15 deletions
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) |

