diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Utility')
12 files changed, 483 insertions, 22 deletions
diff --git a/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.cpp b/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.cpp new file mode 100644 index 0000000..d9b3863 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.cpp @@ -0,0 +1,148 @@ +//===-- ARM64_DWARF_Registers.c ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <string.h> + +#include "ARM64_DWARF_Registers.h" + +using namespace lldb; +using namespace lldb_private; +using namespace arm64_dwarf; + +const char * +arm64_dwarf::GetRegisterName (unsigned reg_num, bool altnernate_name) +{ + if (altnernate_name) + { + switch (reg_num) + { + case fp: return "x29"; + case lr: return "x30"; + case sp: return "x31"; + default: + break; + } + return nullptr; + } + + switch (reg_num) + { + case x0: return "x0"; + case x1: return "x1"; + case x2: return "x2"; + case x3: return "x3"; + case x4: return "x4"; + case x5: return "x5"; + case x6: return "x6"; + case x7: return "x7"; + case x8: return "x8"; + case x9: return "x9"; + case x10: return "x10"; + case x11: return "x11"; + case x12: return "x12"; + case x13: return "x13"; + case x14: return "x14"; + case x15: return "x15"; + case x16: return "x16"; + case x17: return "x17"; + case x18: return "x18"; + case x19: return "x19"; + case x20: return "x20"; + case x21: return "x21"; + case x22: return "x22"; + case x23: return "x23"; + case x24: return "x24"; + case x25: return "x25"; + case x26: return "x26"; + case x27: return "x27"; + case x28: return "x28"; + case fp: return "fp"; + case lr: return "lr"; + case sp: return "sp"; + case pc: return "pc"; + case cpsr: return "cpsr"; + case v0: return "v0"; + case v1: return "v1"; + case v2: return "v2"; + case v3: return "v3"; + case v4: return "v4"; + case v5: return "v5"; + case v6: return "v6"; + case v7: return "v7"; + case v8: return "v8"; + case v9: return "v9"; + case v10: return "v10"; + case v11: return "v11"; + case v12: return "v12"; + case v13: return "v13"; + case v14: return "v14"; + case v15: return "v15"; + case v16: return "v16"; + case v17: return "v17"; + case v18: return "v18"; + case v19: return "v19"; + case v20: return "v20"; + case v21: return "v21"; + case v22: return "v22"; + case v23: return "v23"; + case v24: return "v24"; + case v25: return "v25"; + case v26: return "v26"; + case v27: return "v27"; + case v28: return "v28"; + case v29: return "v29"; + case v30: return "v30"; + case v31: return "v31"; + } + return nullptr; +} + +bool +arm64_dwarf::GetRegisterInfo (unsigned reg_num, RegisterInfo ®_info) +{ + ::memset (®_info, 0, sizeof(RegisterInfo)); + ::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds)); + + if (reg_num >= x0 && reg_num <= pc) + { + reg_info.byte_size = 8; + reg_info.format = eFormatHex; + reg_info.encoding = eEncodingUint; + } + else if (reg_num >= v0 && reg_num <= v31) + { + reg_info.byte_size = 16; + reg_info.format = eFormatVectorOfFloat32; + reg_info.encoding = eEncodingVector; + } + else if (reg_num == cpsr) + { + reg_info.byte_size = 4; + reg_info.format = eFormatHex; + reg_info.encoding = eEncodingUint; + } + else + { + return false; + } + + reg_info.name = arm64_dwarf::GetRegisterName (reg_num, false); + reg_info.alt_name = arm64_dwarf::GetRegisterName (reg_num, true); + reg_info.kinds[eRegisterKindDWARF] = reg_num; + + switch (reg_num) + { + case fp: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break; + case lr: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break; + case sp: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break; + case pc: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break; + default: break; + } + return true; +} diff --git a/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.h b/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.h new file mode 100644 index 0000000..832f25d --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Utility/ARM64_DWARF_Registers.h @@ -0,0 +1,102 @@ +//===-- ARM64_DWARF_Registers.h ---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef utility_ARM64_DWARF_Registers_h_ +#define utility_ARM64_DWARF_Registers_h_ + +#include "lldb/lldb-private.h" + +namespace arm64_dwarf { + +enum +{ + x0 = 0, + x1, + x2, + x3, + x4, + x5, + x6, + x7, + x8, + x9, + x10, + x11, + x12, + x13, + x14, + x15, + x16, + x17, + x18, + x19, + x20, + x21, + x22, + x23, + x24, + x25, + x26, + x27, + x28, + x29 = 29, fp = x29, + x30 = 30, lr = x30, + x31 = 31, sp = x31, + pc = 32, + cpsr = 33, + // 34-63 reserved + + // V0-V31 (128 bit vector registers) + v0 = 64, + v1, + v2, + v3, + v4, + v5, + v6, + v7, + v8, + v9, + v10, + v11, + v12, + v13, + v14, + v15, + v16, + v17, + v18, + v19, + v20, + v21, + v22, + v23, + v24, + v25, + v26, + v27, + v28, + v29, + v30, + v31 + + // 96-127 reserved +}; + +const char * +GetRegisterName (unsigned reg_num, bool altnernate_name); + +bool +GetRegisterInfo (unsigned reg_num, + lldb_private::RegisterInfo ®_info); + +} // namespace arm64_dwarf + +#endif // utility_ARM64_DWARF_Registers_h_ + diff --git a/contrib/llvm/tools/lldb/source/Utility/ARM64_GCC_Registers.h b/contrib/llvm/tools/lldb/source/Utility/ARM64_GCC_Registers.h new file mode 100644 index 0000000..2166b3b --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Utility/ARM64_GCC_Registers.h @@ -0,0 +1,92 @@ +//===-- ARM64_gdb_Registers.h -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef utility_ARM64_gdb_Registers_h_ +#define utility_ARM64_gdb_Registers_h_ + +namespace arm64_gcc { + +enum +{ + x0 = 0, + x1, + x2, + x3, + x4, + x5, + x6, + x7, + x8, + x9, + x10, + x11, + x12, + x13, + x14, + x15, + x16, + x17, + x18, + x19, + x20, + x21, + x22, + x23, + x24, + x25, + x26, + x27, + x28, + fp, // aka x29 + lr, // aka x30 + sp, // aka x31 aka wzr + pc, // value is 32 + cpsr +}; + +enum +{ + v0 = 64, + v1, + v2, + v3, + v4, + v5, + v6, + v7, + v8, + v9, + v10, + v11, + v12, + v13, + v14, + v15, + v16, + v17, + v18, + v19, + v20, + v21, + v22, + v23, + v24, + v25, + v26, + v27, + v28, + v29, + v30, + v31 // 95 +}; + +} + +#endif // utility_ARM64_gdb_Registers_h_ + diff --git a/contrib/llvm/tools/lldb/source/Utility/ARM_DWARF_Registers.cpp b/contrib/llvm/tools/lldb/source/Utility/ARM_DWARF_Registers.cpp index 491ba04..64472ba 100644 --- a/contrib/llvm/tools/lldb/source/Utility/ARM_DWARF_Registers.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/ARM_DWARF_Registers.cpp @@ -202,7 +202,7 @@ GetARMDWARFRegisterName (unsigned reg_num) case dwarf_q14: return "q14"; case dwarf_q15: return "q15"; } - return 0; + return nullptr; } bool diff --git a/contrib/llvm/tools/lldb/source/Utility/PseudoTerminal.cpp b/contrib/llvm/tools/lldb/source/Utility/PseudoTerminal.cpp index 98d581d..c906ea2 100644 --- a/contrib/llvm/tools/lldb/source/Utility/PseudoTerminal.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/PseudoTerminal.cpp @@ -19,6 +19,7 @@ #ifdef _WIN32 #include "lldb/Host/windows/win32.h" +typedef uint32_t pid_t; // empty functions int posix_openpt(int flag) { return 0; } @@ -47,7 +48,7 @@ PseudoTerminal::PseudoTerminal () : // Destructor // // The destructor will close the master and slave file descriptors -// if they are valid and ownwership has not been released using the +// if they are valid and ownership has not been released using the // ReleaseMasterFileDescriptor() or the ReleaseSaveFileDescriptor() // member functions. //---------------------------------------------------------------------- @@ -155,7 +156,7 @@ PseudoTerminal::OpenSlave (int oflag, char *error_str, size_t error_len) // Open the master side of a pseudo terminal const char *slave_name = GetSlaveName (error_str, error_len); - if (slave_name == NULL) + if (slave_name == nullptr) return false; m_slave_fd = ::open (slave_name, oflag); @@ -193,11 +194,11 @@ PseudoTerminal::GetSlaveName (char *error_str, size_t error_len) const { if (error_str) ::snprintf (error_str, error_len, "%s", "master file descriptor is invalid"); - return NULL; + return nullptr; } const char *slave_name = ::ptsname (m_master_fd); - if (error_str && slave_name == NULL) + if (error_str && slave_name == nullptr) ::strerror_r (errno, error_str, error_len); return slave_name; diff --git a/contrib/llvm/tools/lldb/source/Utility/SharingPtr.cpp b/contrib/llvm/tools/lldb/source/Utility/SharingPtr.cpp index be237ce..4083975 100644 --- a/contrib/llvm/tools/lldb/source/Utility/SharingPtr.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/SharingPtr.cpp @@ -18,6 +18,8 @@ #include <assert.h> #include "lldb/Host/Mutex.h" +#include "llvm/ADT/STLExtras.h" + #include <vector> class Backtrace @@ -51,7 +53,7 @@ void Backtrace::GetFrames () { void *frames[1024]; - const int count = ::backtrace (frames, sizeof(frames)/sizeof(void*)); + const int count = ::backtrace (frames, llvm::array_lengthof(frames)); if (count > 2) m_frames.assign (frames + 2, frames + (count - 2)); } diff --git a/contrib/llvm/tools/lldb/source/Utility/StringExtractor.cpp b/contrib/llvm/tools/lldb/source/Utility/StringExtractor.cpp index 9d23157..87478532 100644 --- a/contrib/llvm/tools/lldb/source/Utility/StringExtractor.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/StringExtractor.cpp @@ -63,16 +63,6 @@ xdigit_to_sint (char ch) return ch - '0'; } -static inline unsigned int -xdigit_to_uint (uint8_t ch) -{ - if (ch >= 'a' && ch <= 'f') - return 10u + ch - 'a'; - if (ch >= 'A' && ch <= 'F') - return 10u + ch - 'A'; - return ch - '0'; -} - //---------------------------------------------------------------------- // StringExtractor constructor //---------------------------------------------------------------------- @@ -165,7 +155,7 @@ StringExtractor::GetU32 (uint32_t fail_value, int base) { if (m_index < m_packet.size()) { - char *end = NULL; + char *end = nullptr; const char *start = m_packet.c_str(); const char *cstr = start + m_index; uint32_t result = ::strtoul (cstr, &end, base); @@ -184,7 +174,7 @@ StringExtractor::GetS32 (int32_t fail_value, int base) { if (m_index < m_packet.size()) { - char *end = NULL; + char *end = nullptr; const char *start = m_packet.c_str(); const char *cstr = start + m_index; int32_t result = ::strtol (cstr, &end, base); @@ -204,7 +194,7 @@ StringExtractor::GetU64 (uint64_t fail_value, int base) { if (m_index < m_packet.size()) { - char *end = NULL; + char *end = nullptr; const char *start = m_packet.c_str(); const char *cstr = start + m_index; uint64_t result = ::strtoull (cstr, &end, base); @@ -223,7 +213,7 @@ StringExtractor::GetS64 (int64_t fail_value, int base) { if (m_index < m_packet.size()) { - char *end = NULL; + char *end = nullptr; const char *start = m_packet.c_str(); const char *cstr = start + m_index; int64_t result = ::strtoll (cstr, &end, base); @@ -429,6 +419,18 @@ StringExtractor::GetHexByteString (std::string &str) } size_t +StringExtractor::GetHexByteStringFixedLength (std::string &str, uint32_t nibble_length) +{ + str.clear(); + + uint32_t nibble_count = 0; + for (const char *pch = Peek(); (nibble_count < nibble_length) && (pch != nullptr); str.append(1, GetHexU8(0, false)), pch = Peek (), nibble_count += 2) + {} + + return str.size(); +} + +size_t StringExtractor::GetHexByteStringTerminatedBy (std::string &str, char terminator) { @@ -438,6 +440,7 @@ StringExtractor::GetHexByteStringTerminatedBy (std::string &str, str.append(1, ch); if (Peek() && *Peek() == terminator) return str.size(); + str.clear(); return str.size(); } diff --git a/contrib/llvm/tools/lldb/source/Utility/StringExtractor.h b/contrib/llvm/tools/lldb/source/Utility/StringExtractor.h index 2aab3b0..6974993 100644 --- a/contrib/llvm/tools/lldb/source/Utility/StringExtractor.h +++ b/contrib/llvm/tools/lldb/source/Utility/StringExtractor.h @@ -129,6 +129,9 @@ public: GetHexByteString (std::string &str); size_t + GetHexByteStringFixedLength (std::string &str, uint32_t nibble_length); + + size_t GetHexByteStringTerminatedBy (std::string &str, char terminator); @@ -137,7 +140,7 @@ public: { if (m_index < m_packet.size()) return m_packet.c_str() + m_index; - return NULL; + return nullptr; } protected: diff --git a/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.cpp b/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.cpp index eccb813..17717db 100644 --- a/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.cpp +++ b/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.cpp @@ -92,6 +92,7 @@ StringExtractorGDBRemote::GetServerPacketType () const if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode; if (PACKET_STARTS_WITH ("QSaveRegisterState")) return eServerPacketType_QSaveRegisterState; if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR; + if (PACKET_STARTS_WITH ("QSetDetachOnError:")) return eServerPacketType_QSetDetachOnError; if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN; if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT; if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR; @@ -178,6 +179,7 @@ StringExtractorGDBRemote::GetServerPacketType () const if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest; if (PACKET_MATCHES ("qShlibInfoAddr")) return eServerPacketType_qShlibInfoAddr; if (PACKET_MATCHES ("qStepPacketSupported")) return eServerPacketType_qStepPacketSupported; + if (PACKET_STARTS_WITH ("qSupported")) return eServerPacketType_qSupported; if (PACKET_MATCHES ("qSyncThreadStateSupported")) return eServerPacketType_qSyncThreadStateSupported; break; @@ -198,6 +200,10 @@ StringExtractorGDBRemote::GetServerPacketType () const if (PACKET_STARTS_WITH ("qWatchpointSupportInfo:")) return eServerPacketType_qWatchpointSupportInfo; if (PACKET_MATCHES ("qWatchpointSupportInfo")) return eServerPacketType_qWatchpointSupportInfoSupported; break; + + case 'X': + if (PACKET_STARTS_WITH ("qXfer:auxv:read::")) return eServerPacketType_qXfer_auxv_read; + break; } break; case 'v': diff --git a/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.h b/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.h index f8af3ca..e16403c 100644 --- a/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.h +++ b/contrib/llvm/tools/lldb/source/Utility/StringExtractorGDBRemote.h @@ -62,6 +62,7 @@ public: eServerPacketType_QEnvironment, eServerPacketType_QLaunchArch, eServerPacketType_QSetDisableASLR, + eServerPacketType_QSetDetachOnError, eServerPacketType_QSetSTDIN, eServerPacketType_QSetSTDOUT, eServerPacketType_QSetSTDERR, @@ -105,12 +106,14 @@ public: eServerPacketType_qRegisterInfo, eServerPacketType_qShlibInfoAddr, eServerPacketType_qStepPacketSupported, + eServerPacketType_qSupported, eServerPacketType_qSyncThreadStateSupported, eServerPacketType_qThreadExtraInfo, eServerPacketType_qThreadStopInfo, eServerPacketType_qVAttachOrWaitSupported, eServerPacketType_qWatchpointSupportInfo, eServerPacketType_qWatchpointSupportInfoSupported, + eServerPacketType_qXfer_auxv_read, eServerPacketType_vAttach, eServerPacketType_vAttachWait, diff --git a/contrib/llvm/tools/lldb/source/Utility/StringLexer.cpp b/contrib/llvm/tools/lldb/source/Utility/StringLexer.cpp new file mode 100644 index 0000000..bde2fc6 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Utility/StringLexer.cpp @@ -0,0 +1,101 @@ +//===--------------------- StringLexer.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/StringLexer.h" + +#include <algorithm> + +using namespace lldb_utility; + +StringLexer::StringLexer (std::string s) : +m_data(s), +m_position(0), +m_putback_data() +{ } + +StringLexer::StringLexer (const StringLexer& rhs) : +m_data(rhs.m_data), +m_position(rhs.m_position), +m_putback_data(rhs.m_putback_data) +{ } + +StringLexer::Character +StringLexer::Peek () +{ + if (m_putback_data.empty()) + return m_data[m_position]; + else + return m_putback_data.front(); +} + +bool +StringLexer::NextIf (Character c) +{ + auto val = Peek(); + if (val == c) + { + Next(); + return true; + } + return false; +} + +StringLexer::Character +StringLexer::Next () +{ + auto val = Peek(); + Consume(); + return val; +} + +bool +StringLexer::HasAtLeast (Size s) +{ + auto in_m_data = m_data.size()-m_position; + auto in_putback = m_putback_data.size(); + return (in_m_data + in_putback >= s); +} + + +void +StringLexer::PutBack (Character c) +{ + m_putback_data.push_back(c); +} + +bool +StringLexer::HasAny (Character c) +{ + const auto begin(m_putback_data.begin()); + const auto end(m_putback_data.end()); + if (std::find(begin, end, c) != end) + return true; + return m_data.find(c, m_position) != std::string::npos; +} + +void +StringLexer::Consume() +{ + if (m_putback_data.empty()) + m_position++; + else + m_putback_data.pop_front(); +} + +StringLexer& +StringLexer::operator = (const StringLexer& rhs) +{ + if (this != &rhs) + { + m_data = rhs.m_data; + m_position = rhs.m_position; + m_putback_data = rhs.m_putback_data; + } + return *this; +} diff --git a/contrib/llvm/tools/lldb/source/Utility/TimeSpecTimeout.h b/contrib/llvm/tools/lldb/source/Utility/TimeSpecTimeout.h index 32cdd06..388ccc1 100644 --- a/contrib/llvm/tools/lldb/source/Utility/TimeSpecTimeout.h +++ b/contrib/llvm/tools/lldb/source/Utility/TimeSpecTimeout.h @@ -76,7 +76,7 @@ public: GetTimeSpecPtr () const { if (m_infinite) - return NULL; + return nullptr; return &m_timespec; } |