diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2013-11-06 16:48:53 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2013-11-06 16:48:53 +0000 |
| commit | f21a844f60ae6c74fcf1fddca32461acce3c1ee0 (patch) | |
| tree | 56d79f94966870db1cecd65a7264510a25fd1cba /source/Utility | |
| parent | 37d22554be9f5a677dad2a95b7ef22fe59c66a8a (diff) | |
Notes
Diffstat (limited to 'source/Utility')
| -rw-r--r-- | source/Utility/PseudoTerminal.cpp | 15 | ||||
| -rw-r--r-- | source/Utility/RefCounter.cpp | 25 | ||||
| -rw-r--r-- | source/Utility/SharingPtr.cpp | 12 | ||||
| -rw-r--r-- | source/Utility/StringExtractor.cpp | 78 | ||||
| -rw-r--r-- | source/Utility/StringExtractor.h | 13 | ||||
| -rw-r--r-- | source/Utility/StringExtractorGDBRemote.cpp | 45 | ||||
| -rw-r--r-- | source/Utility/StringExtractorGDBRemote.h | 19 |
7 files changed, 174 insertions, 33 deletions
diff --git a/source/Utility/PseudoTerminal.cpp b/source/Utility/PseudoTerminal.cpp index e4b444c36873a..98d581def4c38 100644 --- a/source/Utility/PseudoTerminal.cpp +++ b/source/Utility/PseudoTerminal.cpp @@ -17,6 +17,21 @@ #include <sys/ioctl.h> #endif +#ifdef _WIN32 +#include "lldb/Host/windows/win32.h" +// empty functions +int posix_openpt(int flag) { return 0; } + +int strerror_r(int errnum, char *buf, size_t buflen) { return 0; } + +int unlockpt(int fd) { return 0; } +int grantpt(int fd) { return 0; } +char *ptsname(int fd) { return 0; } + +pid_t fork(void) { return 0; } +pid_t setsid(void) { return 0; } +#endif + using namespace lldb_utility; //---------------------------------------------------------------------- diff --git a/source/Utility/RefCounter.cpp b/source/Utility/RefCounter.cpp deleted file mode 100644 index c3acedd2f056c..0000000000000 --- a/source/Utility/RefCounter.cpp +++ /dev/null @@ -1,25 +0,0 @@ -//===---------------------RefCounter.cpp ------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/Utility/RefCounter.h" - -namespace lldb_utility { - -RefCounter::RefCounter(RefCounter::value_type* ctr): -m_counter(ctr) -{ - increment(m_counter); -} - -RefCounter::~RefCounter() -{ - decrement(m_counter); -} - -} // namespace lldb_utility diff --git a/source/Utility/SharingPtr.cpp b/source/Utility/SharingPtr.cpp index f64d7e3995b82..be237cec61c40 100644 --- a/source/Utility/SharingPtr.cpp +++ b/source/Utility/SharingPtr.cpp @@ -138,13 +138,21 @@ namespace imp void shared_count::add_shared() { - increment(shared_owners_); +#ifdef _MSC_VER + _InterlockedIncrement(&shared_owners_); +#else + ++shared_owners_; +#endif } void shared_count::release_shared() { - if (decrement(shared_owners_) == -1) +#ifdef _MSC_VER + if (_InterlockedDecrement(&shared_owners_) == -1) +#else + if (--shared_owners_ == -1) +#endif { on_zero_shared(); delete this; diff --git a/source/Utility/StringExtractor.cpp b/source/Utility/StringExtractor.cpp index 2f4bcecda8f32..d4ce470d56f36 100644 --- a/source/Utility/StringExtractor.cpp +++ b/source/Utility/StringExtractor.cpp @@ -168,10 +168,68 @@ StringExtractor::GetU32 (uint32_t fail_value, int base) { char *end = NULL; const char *start = m_packet.c_str(); - const char *uint_cstr = start + m_index; - uint32_t result = ::strtoul (uint_cstr, &end, base); + const char *cstr = start + m_index; + uint32_t result = ::strtoul (cstr, &end, base); - if (end && end != uint_cstr) + if (end && end != cstr) + { + m_index = end - start; + return result; + } + } + return fail_value; +} + +int32_t +StringExtractor::GetS32 (int32_t fail_value, int base) +{ + if (m_index < m_packet.size()) + { + char *end = NULL; + const char *start = m_packet.c_str(); + const char *cstr = start + m_index; + int32_t result = ::strtol (cstr, &end, base); + + if (end && end != cstr) + { + m_index = end - start; + return result; + } + } + return fail_value; +} + + +uint64_t +StringExtractor::GetU64 (uint64_t fail_value, int base) +{ + if (m_index < m_packet.size()) + { + char *end = NULL; + const char *start = m_packet.c_str(); + const char *cstr = start + m_index; + uint64_t result = ::strtoull (cstr, &end, base); + + if (end && end != cstr) + { + m_index = end - start; + return result; + } + } + return fail_value; +} + +int64_t +StringExtractor::GetS64 (int64_t fail_value, int base) +{ + if (m_index < m_packet.size()) + { + char *end = NULL; + const char *start = m_packet.c_str(); + const char *cstr = start + m_index; + int64_t result = ::strtoll (cstr, &end, base); + + if (end && end != cstr) { m_index = end - start; return result; @@ -371,6 +429,20 @@ StringExtractor::GetHexByteString (std::string &str) return str.size(); } +size_t +StringExtractor::GetHexByteStringTerminatedBy (std::string &str, + char terminator) +{ + str.clear(); + char ch; + while ((ch = GetHexU8(0,false)) != '\0') + str.append(1, ch); + if (Peek() && *Peek() == terminator) + return str.size(); + str.clear(); + return str.size(); +} + bool StringExtractor::GetNameColonValue (std::string &name, std::string &value) { diff --git a/source/Utility/StringExtractor.h b/source/Utility/StringExtractor.h index 0ded3101fcca8..2aab3b09f47e7 100644 --- a/source/Utility/StringExtractor.h +++ b/source/Utility/StringExtractor.h @@ -101,9 +101,18 @@ public: bool GetNameColonValue (std::string &name, std::string &value); + int32_t + GetS32 (int32_t fail_value, int base = 0); + uint32_t GetU32 (uint32_t fail_value, int base = 0); + int64_t + GetS64 (int64_t fail_value, int base = 0); + + uint64_t + GetU64 (uint64_t fail_value, int base = 0); + uint32_t GetHexMaxU32 (bool little_endian, uint32_t fail_value); @@ -119,6 +128,10 @@ public: size_t GetHexByteString (std::string &str); + size_t + GetHexByteStringTerminatedBy (std::string &str, + char terminator); + const char * Peek () { diff --git a/source/Utility/StringExtractorGDBRemote.cpp b/source/Utility/StringExtractorGDBRemote.cpp index 7e06a0f59bc9e..6e32481ccc504 100644 --- a/source/Utility/StringExtractorGDBRemote.cpp +++ b/source/Utility/StringExtractorGDBRemote.cpp @@ -94,6 +94,9 @@ StringExtractorGDBRemote::GetServerPacketType () const else if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR; else if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir; break; + case 'L': + if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch; + break; } break; @@ -120,14 +123,21 @@ StringExtractorGDBRemote::GetServerPacketType () const if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo; break; + case 'K': + if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess; + break; + case 'L': - if (PACKET_MATCHES ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer; + if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer; if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess; break; case 'P': - if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID; + if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID; + if (PACKET_STARTS_WITH ("qPlatform_RunCommand:")) return eServerPacketType_qPlatform_RunCommand; + if (PACKET_STARTS_WITH ("qPlatform_IO_MkDir:")) return eServerPacketType_qPlatform_IO_MkDir; break; + case 'S': if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest; @@ -138,6 +148,21 @@ StringExtractorGDBRemote::GetServerPacketType () const break; } break; + case 'v': + if (PACKET_STARTS_WITH("vFile:")) + { + if (PACKET_STARTS_WITH("vFile:open:")) return eServerPacketType_vFile_Open; + else if (PACKET_STARTS_WITH("vFile:close:")) return eServerPacketType_vFile_Close; + else if (PACKET_STARTS_WITH("vFile:pread")) return eServerPacketType_vFile_pRead; + else if (PACKET_STARTS_WITH("vFile:pwrite")) return eServerPacketType_vFile_pWrite; + else if (PACKET_STARTS_WITH("vFile:size")) return eServerPacketType_vFile_Size; + else if (PACKET_STARTS_WITH("vFile:exists")) return eServerPacketType_vFile_Exists; + else if (PACKET_STARTS_WITH("vFile:stat")) return eServerPacketType_vFile_Stat; + else if (PACKET_STARTS_WITH("vFile:mode")) return eServerPacketType_vFile_Mode; + else if (PACKET_STARTS_WITH("vFile:MD5")) return eServerPacketType_vFile_MD5; + + } + break; } return eServerPacketType_unimplemented; } @@ -180,3 +205,19 @@ StringExtractorGDBRemote::GetError () } return 0; } + +size_t +StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str) +{ + str.clear(); + char ch; + while (GetBytesLeft()) + { + ch = GetChar(); + if (ch == 0x7d) + ch = (GetChar() ^ 0x20); + str.append(1,ch); + } + return str.size(); +} + diff --git a/source/Utility/StringExtractorGDBRemote.h b/source/Utility/StringExtractorGDBRemote.h index 5a24d894b1059..fe500ecda5d44 100644 --- a/source/Utility/StringExtractorGDBRemote.h +++ b/source/Utility/StringExtractorGDBRemote.h @@ -53,17 +53,30 @@ public: eServerPacketType_qGroupName, eServerPacketType_qHostInfo, eServerPacketType_qLaunchGDBServer, + eServerPacketType_qKillSpawnedProcess, eServerPacketType_qLaunchSuccess, eServerPacketType_qProcessInfoPID, eServerPacketType_qSpeedTest, eServerPacketType_qUserName, eServerPacketType_QEnvironment, + eServerPacketType_QLaunchArch, eServerPacketType_QSetDisableASLR, eServerPacketType_QSetSTDIN, eServerPacketType_QSetSTDOUT, eServerPacketType_QSetSTDERR, eServerPacketType_QSetWorkingDir, - eServerPacketType_QStartNoAckMode + eServerPacketType_QStartNoAckMode, + eServerPacketType_qPlatform_RunCommand, + eServerPacketType_qPlatform_IO_MkDir, + eServerPacketType_vFile_Open, + eServerPacketType_vFile_Close, + eServerPacketType_vFile_pRead, + eServerPacketType_vFile_pWrite, + eServerPacketType_vFile_Size, + eServerPacketType_vFile_Mode, + eServerPacketType_vFile_Exists, + eServerPacketType_vFile_MD5, + eServerPacketType_vFile_Stat }; ServerPacketType @@ -98,6 +111,10 @@ public: // digits. Otherwise the error encoded in XX is returned. uint8_t GetError(); + + size_t + GetEscapedBinaryData (std::string &str); + }; #endif // utility_StringExtractorGDBRemote_h_ |
