aboutsummaryrefslogtreecommitdiff
path: root/source/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'source/Utility')
-rw-r--r--source/Utility/ARM64_DWARF_Registers.cpp148
-rw-r--r--source/Utility/ARM64_DWARF_Registers.h102
-rw-r--r--source/Utility/ARM64_GCC_Registers.h92
-rw-r--r--source/Utility/ARM_DWARF_Registers.cpp2
-rw-r--r--source/Utility/PseudoTerminal.cpp9
-rw-r--r--source/Utility/SharingPtr.cpp4
-rw-r--r--source/Utility/StringExtractor.cpp31
-rw-r--r--source/Utility/StringExtractor.h5
-rw-r--r--source/Utility/StringExtractorGDBRemote.cpp6
-rw-r--r--source/Utility/StringExtractorGDBRemote.h3
-rw-r--r--source/Utility/StringLexer.cpp101
-rw-r--r--source/Utility/TimeSpecTimeout.h2
12 files changed, 483 insertions, 22 deletions
diff --git a/source/Utility/ARM64_DWARF_Registers.cpp b/source/Utility/ARM64_DWARF_Registers.cpp
new file mode 100644
index 000000000000..d9b386319434
--- /dev/null
+++ b/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 &reg_info)
+{
+ ::memset (&reg_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/source/Utility/ARM64_DWARF_Registers.h b/source/Utility/ARM64_DWARF_Registers.h
new file mode 100644
index 000000000000..832f25d45b5d
--- /dev/null
+++ b/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 &reg_info);
+
+} // namespace arm64_dwarf
+
+#endif // utility_ARM64_DWARF_Registers_h_
+
diff --git a/source/Utility/ARM64_GCC_Registers.h b/source/Utility/ARM64_GCC_Registers.h
new file mode 100644
index 000000000000..2166b3bf591a
--- /dev/null
+++ b/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/source/Utility/ARM_DWARF_Registers.cpp b/source/Utility/ARM_DWARF_Registers.cpp
index 491ba040863e..64472ba1a79e 100644
--- a/source/Utility/ARM_DWARF_Registers.cpp
+++ b/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/source/Utility/PseudoTerminal.cpp b/source/Utility/PseudoTerminal.cpp
index 98d581def4c3..c906ea273005 100644
--- a/source/Utility/PseudoTerminal.cpp
+++ b/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/source/Utility/SharingPtr.cpp b/source/Utility/SharingPtr.cpp
index be237cec61c4..4083975bba7c 100644
--- a/source/Utility/SharingPtr.cpp
+++ b/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/source/Utility/StringExtractor.cpp b/source/Utility/StringExtractor.cpp
index 9d2315708821..8747853213cb 100644
--- a/source/Utility/StringExtractor.cpp
+++ b/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/source/Utility/StringExtractor.h b/source/Utility/StringExtractor.h
index 2aab3b09f47e..697499309ced 100644
--- a/source/Utility/StringExtractor.h
+++ b/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/source/Utility/StringExtractorGDBRemote.cpp b/source/Utility/StringExtractorGDBRemote.cpp
index eccb81318131..17717dbe6e20 100644
--- a/source/Utility/StringExtractorGDBRemote.cpp
+++ b/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/source/Utility/StringExtractorGDBRemote.h b/source/Utility/StringExtractorGDBRemote.h
index f8af3ca41a79..e16403c2d154 100644
--- a/source/Utility/StringExtractorGDBRemote.h
+++ b/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/source/Utility/StringLexer.cpp b/source/Utility/StringLexer.cpp
new file mode 100644
index 000000000000..bde2fc6a4202
--- /dev/null
+++ b/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/source/Utility/TimeSpecTimeout.h b/source/Utility/TimeSpecTimeout.h
index 32cdd067658c..388ccc179c17 100644
--- a/source/Utility/TimeSpecTimeout.h
+++ b/source/Utility/TimeSpecTimeout.h
@@ -76,7 +76,7 @@ public:
GetTimeSpecPtr () const
{
if (m_infinite)
- return NULL;
+ return nullptr;
return &m_timespec;
}