summaryrefslogtreecommitdiff
path: root/source/Utility
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-01-02 19:26:05 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-01-02 19:26:05 +0000
commit14f1b3e8826ce43b978db93a62d1166055db5394 (patch)
tree0a00ad8d3498783fe0193f3b656bca17c4c8697d /source/Utility
parent4ee8c119c71a06dcad1e0fecc8c675e480e59337 (diff)
Notes
Diffstat (limited to 'source/Utility')
-rw-r--r--source/Utility/ARM64_DWARF_Registers.cpp316
-rw-r--r--source/Utility/ARM64_DWARF_Registers.h158
-rw-r--r--source/Utility/ARM64_ehframe_Registers.h145
-rw-r--r--source/Utility/ARM_DWARF_Registers.cpp1312
-rw-r--r--source/Utility/ARM_DWARF_Registers.h394
-rw-r--r--source/Utility/ARM_ehframe_Registers.h41
-rw-r--r--source/Utility/CMakeLists.txt3
-rw-r--r--source/Utility/ConvertEnum.cpp210
-rw-r--r--source/Utility/JSON.cpp1083
-rw-r--r--source/Utility/KQueue.cpp87
-rw-r--r--source/Utility/KQueue.h72
-rw-r--r--source/Utility/LLDBAssert.cpp35
-rw-r--r--source/Utility/ModuleCache.cpp540
-rw-r--r--source/Utility/ModuleCache.h55
-rw-r--r--source/Utility/NameMatches.cpp58
-rw-r--r--source/Utility/PseudoTerminal.cpp352
-rw-r--r--source/Utility/Range.cpp117
-rw-r--r--source/Utility/RegisterNumber.cpp208
-rw-r--r--source/Utility/SelectHelper.cpp260
-rw-r--r--source/Utility/SharingPtr.cpp193
-rw-r--r--source/Utility/StringExtractor.cpp705
-rw-r--r--source/Utility/StringExtractorGDBRemote.cpp967
-rw-r--r--source/Utility/StringExtractorGDBRemote.h367
-rw-r--r--source/Utility/StringLexer.cpp144
-rw-r--r--source/Utility/TaskPool.cpp102
-rw-r--r--source/Utility/TimeSpecTimeout.cpp48
-rw-r--r--source/Utility/TimeSpecTimeout.h90
-rw-r--r--source/Utility/UriParser.cpp105
-rw-r--r--source/Utility/UriParser.h33
29 files changed, 4123 insertions, 4077 deletions
diff --git a/source/Utility/ARM64_DWARF_Registers.cpp b/source/Utility/ARM64_DWARF_Registers.cpp
index d9b3863194342..8c2a7160346d4 100644
--- a/source/Utility/ARM64_DWARF_Registers.cpp
+++ b/source/Utility/ARM64_DWARF_Registers.cpp
@@ -1,4 +1,4 @@
-//===-- ARM64_DWARF_Registers.c ---------------------------------*- C++ -*-===//
+//===-- ARM64_DWARF_Registers.cpp -------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -15,134 +15,198 @@ 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";
+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;
+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));
- 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;
+ 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
index 832f25d45b5db..be0ea2a73fb21 100644
--- a/source/Utility/ARM64_DWARF_Registers.h
+++ b/source/Utility/ARM64_DWARF_Registers.h
@@ -13,90 +13,88 @@
#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
+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
- // 96-127 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);
+const char *GetRegisterName(unsigned reg_num, bool altnernate_name);
-} // namespace arm64_dwarf
+bool GetRegisterInfo(unsigned reg_num, lldb_private::RegisterInfo &reg_info);
-#endif // utility_ARM64_DWARF_Registers_h_
+} // namespace arm64_dwarf
+#endif // utility_ARM64_DWARF_Registers_h_
diff --git a/source/Utility/ARM64_ehframe_Registers.h b/source/Utility/ARM64_ehframe_Registers.h
index 0a5c68c63b7e6..7f49314b35391 100644
--- a/source/Utility/ARM64_ehframe_Registers.h
+++ b/source/Utility/ARM64_ehframe_Registers.h
@@ -1,4 +1,5 @@
-//===-- ARM64_ehframe_Registers.h -------------------------------------*- C++ -*-===//
+//===-- ARM64_ehframe_Registers.h -------------------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -14,82 +15,78 @@
// Should be the same as DWARF register numbers.
namespace arm64_ehframe {
-
-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
+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_ehframe_Registers_h_
-
diff --git a/source/Utility/ARM_DWARF_Registers.cpp b/source/Utility/ARM_DWARF_Registers.cpp
index 64472ba1a79ef..c1363763e92a8 100644
--- a/source/Utility/ARM_DWARF_Registers.cpp
+++ b/source/Utility/ARM_DWARF_Registers.cpp
@@ -1,4 +1,4 @@
-//===-- ARM_DWARF_Registers.c -----------------------------------*- C++ -*-===//
+//===-- ARM_DWARF_Registers.cpp ---------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -15,421 +15,911 @@
using namespace lldb;
using namespace lldb_private;
-const char *
-GetARMDWARFRegisterName (unsigned reg_num)
-{
- switch (reg_num)
- {
- case dwarf_r0: return "r0";
- case dwarf_r1: return "r1";
- case dwarf_r2: return "r2";
- case dwarf_r3: return "r3";
- case dwarf_r4: return "r4";
- case dwarf_r5: return "r5";
- case dwarf_r6: return "r6";
- case dwarf_r7: return "r7";
- case dwarf_r8: return "r8";
- case dwarf_r9: return "r9";
- case dwarf_r10: return "r10";
- case dwarf_r11: return "r11";
- case dwarf_r12: return "r12";
- case dwarf_sp: return "sp";
- case dwarf_lr: return "lr";
- case dwarf_pc: return "pc";
- case dwarf_cpsr:return "cpsr";
-
- case dwarf_s0: return "s0";
- case dwarf_s1: return "s1";
- case dwarf_s2: return "s2";
- case dwarf_s3: return "s3";
- case dwarf_s4: return "s4";
- case dwarf_s5: return "s5";
- case dwarf_s6: return "s6";
- case dwarf_s7: return "s7";
- case dwarf_s8: return "s8";
- case dwarf_s9: return "s9";
- case dwarf_s10: return "s10";
- case dwarf_s11: return "s11";
- case dwarf_s12: return "s12";
- case dwarf_s13: return "s13";
- case dwarf_s14: return "s14";
- case dwarf_s15: return "s15";
- case dwarf_s16: return "s16";
- case dwarf_s17: return "s17";
- case dwarf_s18: return "s18";
- case dwarf_s19: return "s19";
- case dwarf_s20: return "s20";
- case dwarf_s21: return "s21";
- case dwarf_s22: return "s22";
- case dwarf_s23: return "s23";
- case dwarf_s24: return "s24";
- case dwarf_s25: return "s25";
- case dwarf_s26: return "s26";
- case dwarf_s27: return "s27";
- case dwarf_s28: return "s28";
- case dwarf_s29: return "s29";
- case dwarf_s30: return "s30";
- case dwarf_s31: return "s31";
-
- // FPA Registers 0-7
- case dwarf_f0: return "f0";
- case dwarf_f1: return "f1";
- case dwarf_f2: return "f2";
- case dwarf_f3: return "f3";
- case dwarf_f4: return "f4";
- case dwarf_f5: return "f5";
- case dwarf_f6: return "f6";
- case dwarf_f7: return "f7";
-
- // Intel wireless MMX general purpose registers 0 - 7
- // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
- case dwarf_wCGR0: return "wCGR0/ACC0";
- case dwarf_wCGR1: return "wCGR1/ACC1";
- case dwarf_wCGR2: return "wCGR2/ACC2";
- case dwarf_wCGR3: return "wCGR3/ACC3";
- case dwarf_wCGR4: return "wCGR4/ACC4";
- case dwarf_wCGR5: return "wCGR5/ACC5";
- case dwarf_wCGR6: return "wCGR6/ACC6";
- case dwarf_wCGR7: return "wCGR7/ACC7";
-
- // Intel wireless MMX data registers 0 - 15
- case dwarf_wR0: return "wR0";
- case dwarf_wR1: return "wR1";
- case dwarf_wR2: return "wR2";
- case dwarf_wR3: return "wR3";
- case dwarf_wR4: return "wR4";
- case dwarf_wR5: return "wR5";
- case dwarf_wR6: return "wR6";
- case dwarf_wR7: return "wR7";
- case dwarf_wR8: return "wR8";
- case dwarf_wR9: return "wR9";
- case dwarf_wR10: return "wR10";
- case dwarf_wR11: return "wR11";
- case dwarf_wR12: return "wR12";
- case dwarf_wR13: return "wR13";
- case dwarf_wR14: return "wR14";
- case dwarf_wR15: return "wR15";
-
- case dwarf_spsr: return "spsr";
- case dwarf_spsr_fiq: return "spsr_fiq";
- case dwarf_spsr_irq: return "spsr_irq";
- case dwarf_spsr_abt: return "spsr_abt";
- case dwarf_spsr_und: return "spsr_und";
- case dwarf_spsr_svc: return "spsr_svc";
-
- case dwarf_r8_usr: return "r8_usr";
- case dwarf_r9_usr: return "r9_usr";
- case dwarf_r10_usr: return "r10_usr";
- case dwarf_r11_usr: return "r11_usr";
- case dwarf_r12_usr: return "r12_usr";
- case dwarf_r13_usr: return "r13_usr";
- case dwarf_r14_usr: return "r14_usr";
- case dwarf_r8_fiq: return "r8_fiq";
- case dwarf_r9_fiq: return "r9_fiq";
- case dwarf_r10_fiq: return "r10_fiq";
- case dwarf_r11_fiq: return "r11_fiq";
- case dwarf_r12_fiq: return "r12_fiq";
- case dwarf_r13_fiq: return "r13_fiq";
- case dwarf_r14_fiq: return "r14_fiq";
- case dwarf_r13_irq: return "r13_irq";
- case dwarf_r14_irq: return "r14_irq";
- case dwarf_r13_abt: return "r13_abt";
- case dwarf_r14_abt: return "r14_abt";
- case dwarf_r13_und: return "r13_und";
- case dwarf_r14_und: return "r14_und";
- case dwarf_r13_svc: return "r13_svc";
- case dwarf_r14_svc: return "r14_svc";
-
- // Intel wireless MMX control register in co-processor 0 - 7
- case dwarf_wC0: return "wC0";
- case dwarf_wC1: return "wC1";
- case dwarf_wC2: return "wC2";
- case dwarf_wC3: return "wC3";
- case dwarf_wC4: return "wC4";
- case dwarf_wC5: return "wC5";
- case dwarf_wC6: return "wC6";
- case dwarf_wC7: return "wC7";
-
- // VFP-v3/Neon
- case dwarf_d0: return "d0";
- case dwarf_d1: return "d1";
- case dwarf_d2: return "d2";
- case dwarf_d3: return "d3";
- case dwarf_d4: return "d4";
- case dwarf_d5: return "d5";
- case dwarf_d6: return "d6";
- case dwarf_d7: return "d7";
- case dwarf_d8: return "d8";
- case dwarf_d9: return "d9";
- case dwarf_d10: return "d10";
- case dwarf_d11: return "d11";
- case dwarf_d12: return "d12";
- case dwarf_d13: return "d13";
- case dwarf_d14: return "d14";
- case dwarf_d15: return "d15";
- case dwarf_d16: return "d16";
- case dwarf_d17: return "d17";
- case dwarf_d18: return "d18";
- case dwarf_d19: return "d19";
- case dwarf_d20: return "d20";
- case dwarf_d21: return "d21";
- case dwarf_d22: return "d22";
- case dwarf_d23: return "d23";
- case dwarf_d24: return "d24";
- case dwarf_d25: return "d25";
- case dwarf_d26: return "d26";
- case dwarf_d27: return "d27";
- case dwarf_d28: return "d28";
- case dwarf_d29: return "d29";
- case dwarf_d30: return "d30";
- case dwarf_d31: return "d31";
+const char *GetARMDWARFRegisterName(unsigned reg_num) {
+ switch (reg_num) {
+ case dwarf_r0:
+ return "r0";
+ case dwarf_r1:
+ return "r1";
+ case dwarf_r2:
+ return "r2";
+ case dwarf_r3:
+ return "r3";
+ case dwarf_r4:
+ return "r4";
+ case dwarf_r5:
+ return "r5";
+ case dwarf_r6:
+ return "r6";
+ case dwarf_r7:
+ return "r7";
+ case dwarf_r8:
+ return "r8";
+ case dwarf_r9:
+ return "r9";
+ case dwarf_r10:
+ return "r10";
+ case dwarf_r11:
+ return "r11";
+ case dwarf_r12:
+ return "r12";
+ case dwarf_sp:
+ return "sp";
+ case dwarf_lr:
+ return "lr";
+ case dwarf_pc:
+ return "pc";
+ case dwarf_cpsr:
+ return "cpsr";
- // NEON 128-bit vector registers (overlays the d registers)
- case dwarf_q0: return "q0";
- case dwarf_q1: return "q1";
- case dwarf_q2: return "q2";
- case dwarf_q3: return "q3";
- case dwarf_q4: return "q4";
- case dwarf_q5: return "q5";
- case dwarf_q6: return "q6";
- case dwarf_q7: return "q7";
- case dwarf_q8: return "q8";
- case dwarf_q9: return "q9";
- case dwarf_q10: return "q10";
- case dwarf_q11: return "q11";
- case dwarf_q12: return "q12";
- case dwarf_q13: return "q13";
- case dwarf_q14: return "q14";
- case dwarf_q15: return "q15";
- }
- return nullptr;
+ case dwarf_s0:
+ return "s0";
+ case dwarf_s1:
+ return "s1";
+ case dwarf_s2:
+ return "s2";
+ case dwarf_s3:
+ return "s3";
+ case dwarf_s4:
+ return "s4";
+ case dwarf_s5:
+ return "s5";
+ case dwarf_s6:
+ return "s6";
+ case dwarf_s7:
+ return "s7";
+ case dwarf_s8:
+ return "s8";
+ case dwarf_s9:
+ return "s9";
+ case dwarf_s10:
+ return "s10";
+ case dwarf_s11:
+ return "s11";
+ case dwarf_s12:
+ return "s12";
+ case dwarf_s13:
+ return "s13";
+ case dwarf_s14:
+ return "s14";
+ case dwarf_s15:
+ return "s15";
+ case dwarf_s16:
+ return "s16";
+ case dwarf_s17:
+ return "s17";
+ case dwarf_s18:
+ return "s18";
+ case dwarf_s19:
+ return "s19";
+ case dwarf_s20:
+ return "s20";
+ case dwarf_s21:
+ return "s21";
+ case dwarf_s22:
+ return "s22";
+ case dwarf_s23:
+ return "s23";
+ case dwarf_s24:
+ return "s24";
+ case dwarf_s25:
+ return "s25";
+ case dwarf_s26:
+ return "s26";
+ case dwarf_s27:
+ return "s27";
+ case dwarf_s28:
+ return "s28";
+ case dwarf_s29:
+ return "s29";
+ case dwarf_s30:
+ return "s30";
+ case dwarf_s31:
+ return "s31";
+
+ // FPA Registers 0-7
+ case dwarf_f0:
+ return "f0";
+ case dwarf_f1:
+ return "f1";
+ case dwarf_f2:
+ return "f2";
+ case dwarf_f3:
+ return "f3";
+ case dwarf_f4:
+ return "f4";
+ case dwarf_f5:
+ return "f5";
+ case dwarf_f6:
+ return "f6";
+ case dwarf_f7:
+ return "f7";
+
+ // Intel wireless MMX general purpose registers 0 - 7
+ // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
+ case dwarf_wCGR0:
+ return "wCGR0/ACC0";
+ case dwarf_wCGR1:
+ return "wCGR1/ACC1";
+ case dwarf_wCGR2:
+ return "wCGR2/ACC2";
+ case dwarf_wCGR3:
+ return "wCGR3/ACC3";
+ case dwarf_wCGR4:
+ return "wCGR4/ACC4";
+ case dwarf_wCGR5:
+ return "wCGR5/ACC5";
+ case dwarf_wCGR6:
+ return "wCGR6/ACC6";
+ case dwarf_wCGR7:
+ return "wCGR7/ACC7";
+
+ // Intel wireless MMX data registers 0 - 15
+ case dwarf_wR0:
+ return "wR0";
+ case dwarf_wR1:
+ return "wR1";
+ case dwarf_wR2:
+ return "wR2";
+ case dwarf_wR3:
+ return "wR3";
+ case dwarf_wR4:
+ return "wR4";
+ case dwarf_wR5:
+ return "wR5";
+ case dwarf_wR6:
+ return "wR6";
+ case dwarf_wR7:
+ return "wR7";
+ case dwarf_wR8:
+ return "wR8";
+ case dwarf_wR9:
+ return "wR9";
+ case dwarf_wR10:
+ return "wR10";
+ case dwarf_wR11:
+ return "wR11";
+ case dwarf_wR12:
+ return "wR12";
+ case dwarf_wR13:
+ return "wR13";
+ case dwarf_wR14:
+ return "wR14";
+ case dwarf_wR15:
+ return "wR15";
+
+ case dwarf_spsr:
+ return "spsr";
+ case dwarf_spsr_fiq:
+ return "spsr_fiq";
+ case dwarf_spsr_irq:
+ return "spsr_irq";
+ case dwarf_spsr_abt:
+ return "spsr_abt";
+ case dwarf_spsr_und:
+ return "spsr_und";
+ case dwarf_spsr_svc:
+ return "spsr_svc";
+
+ case dwarf_r8_usr:
+ return "r8_usr";
+ case dwarf_r9_usr:
+ return "r9_usr";
+ case dwarf_r10_usr:
+ return "r10_usr";
+ case dwarf_r11_usr:
+ return "r11_usr";
+ case dwarf_r12_usr:
+ return "r12_usr";
+ case dwarf_r13_usr:
+ return "r13_usr";
+ case dwarf_r14_usr:
+ return "r14_usr";
+ case dwarf_r8_fiq:
+ return "r8_fiq";
+ case dwarf_r9_fiq:
+ return "r9_fiq";
+ case dwarf_r10_fiq:
+ return "r10_fiq";
+ case dwarf_r11_fiq:
+ return "r11_fiq";
+ case dwarf_r12_fiq:
+ return "r12_fiq";
+ case dwarf_r13_fiq:
+ return "r13_fiq";
+ case dwarf_r14_fiq:
+ return "r14_fiq";
+ case dwarf_r13_irq:
+ return "r13_irq";
+ case dwarf_r14_irq:
+ return "r14_irq";
+ case dwarf_r13_abt:
+ return "r13_abt";
+ case dwarf_r14_abt:
+ return "r14_abt";
+ case dwarf_r13_und:
+ return "r13_und";
+ case dwarf_r14_und:
+ return "r14_und";
+ case dwarf_r13_svc:
+ return "r13_svc";
+ case dwarf_r14_svc:
+ return "r14_svc";
+
+ // Intel wireless MMX control register in co-processor 0 - 7
+ case dwarf_wC0:
+ return "wC0";
+ case dwarf_wC1:
+ return "wC1";
+ case dwarf_wC2:
+ return "wC2";
+ case dwarf_wC3:
+ return "wC3";
+ case dwarf_wC4:
+ return "wC4";
+ case dwarf_wC5:
+ return "wC5";
+ case dwarf_wC6:
+ return "wC6";
+ case dwarf_wC7:
+ return "wC7";
+
+ // VFP-v3/Neon
+ case dwarf_d0:
+ return "d0";
+ case dwarf_d1:
+ return "d1";
+ case dwarf_d2:
+ return "d2";
+ case dwarf_d3:
+ return "d3";
+ case dwarf_d4:
+ return "d4";
+ case dwarf_d5:
+ return "d5";
+ case dwarf_d6:
+ return "d6";
+ case dwarf_d7:
+ return "d7";
+ case dwarf_d8:
+ return "d8";
+ case dwarf_d9:
+ return "d9";
+ case dwarf_d10:
+ return "d10";
+ case dwarf_d11:
+ return "d11";
+ case dwarf_d12:
+ return "d12";
+ case dwarf_d13:
+ return "d13";
+ case dwarf_d14:
+ return "d14";
+ case dwarf_d15:
+ return "d15";
+ case dwarf_d16:
+ return "d16";
+ case dwarf_d17:
+ return "d17";
+ case dwarf_d18:
+ return "d18";
+ case dwarf_d19:
+ return "d19";
+ case dwarf_d20:
+ return "d20";
+ case dwarf_d21:
+ return "d21";
+ case dwarf_d22:
+ return "d22";
+ case dwarf_d23:
+ return "d23";
+ case dwarf_d24:
+ return "d24";
+ case dwarf_d25:
+ return "d25";
+ case dwarf_d26:
+ return "d26";
+ case dwarf_d27:
+ return "d27";
+ case dwarf_d28:
+ return "d28";
+ case dwarf_d29:
+ return "d29";
+ case dwarf_d30:
+ return "d30";
+ case dwarf_d31:
+ return "d31";
+
+ // NEON 128-bit vector registers (overlays the d registers)
+ case dwarf_q0:
+ return "q0";
+ case dwarf_q1:
+ return "q1";
+ case dwarf_q2:
+ return "q2";
+ case dwarf_q3:
+ return "q3";
+ case dwarf_q4:
+ return "q4";
+ case dwarf_q5:
+ return "q5";
+ case dwarf_q6:
+ return "q6";
+ case dwarf_q7:
+ return "q7";
+ case dwarf_q8:
+ return "q8";
+ case dwarf_q9:
+ return "q9";
+ case dwarf_q10:
+ return "q10";
+ case dwarf_q11:
+ return "q11";
+ case dwarf_q12:
+ return "q12";
+ case dwarf_q13:
+ return "q13";
+ case dwarf_q14:
+ return "q14";
+ case dwarf_q15:
+ return "q15";
+ }
+ return nullptr;
}
-bool
-GetARMDWARFRegisterInfo (unsigned reg_num, RegisterInfo &reg_info)
-{
- ::memset (&reg_info, 0, sizeof(RegisterInfo));
- ::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds));
+bool GetARMDWARFRegisterInfo(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 >= dwarf_q0 && reg_num <= dwarf_q15) {
+ reg_info.byte_size = 16;
+ reg_info.format = eFormatVectorOfUInt8;
+ reg_info.encoding = eEncodingVector;
+ }
+
+ if (reg_num >= dwarf_d0 && reg_num <= dwarf_d31) {
+ reg_info.byte_size = 8;
+ reg_info.format = eFormatFloat;
+ reg_info.encoding = eEncodingIEEE754;
+ } else if (reg_num >= dwarf_s0 && reg_num <= dwarf_s31) {
+ reg_info.byte_size = 4;
+ reg_info.format = eFormatFloat;
+ reg_info.encoding = eEncodingIEEE754;
+ } else if (reg_num >= dwarf_f0 && reg_num <= dwarf_f7) {
+ reg_info.byte_size = 12;
+ reg_info.format = eFormatFloat;
+ reg_info.encoding = eEncodingIEEE754;
+ } else {
+ reg_info.byte_size = 4;
+ reg_info.format = eFormatHex;
+ reg_info.encoding = eEncodingUint;
+ }
+
+ reg_info.kinds[eRegisterKindDWARF] = reg_num;
+
+ switch (reg_num) {
+ case dwarf_r0:
+ reg_info.name = "r0";
+ break;
+ case dwarf_r1:
+ reg_info.name = "r1";
+ break;
+ case dwarf_r2:
+ reg_info.name = "r2";
+ break;
+ case dwarf_r3:
+ reg_info.name = "r3";
+ break;
+ case dwarf_r4:
+ reg_info.name = "r4";
+ break;
+ case dwarf_r5:
+ reg_info.name = "r5";
+ break;
+ case dwarf_r6:
+ reg_info.name = "r6";
+ break;
+ case dwarf_r7:
+ reg_info.name = "r7";
+ reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP;
+ break;
+ case dwarf_r8:
+ reg_info.name = "r8";
+ break;
+ case dwarf_r9:
+ reg_info.name = "r9";
+ break;
+ case dwarf_r10:
+ reg_info.name = "r10";
+ break;
+ case dwarf_r11:
+ reg_info.name = "r11";
+ break;
+ case dwarf_r12:
+ reg_info.name = "r12";
+ break;
+ case dwarf_sp:
+ reg_info.name = "sp";
+ reg_info.alt_name = "r13";
+ reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP;
+ break;
+ case dwarf_lr:
+ reg_info.name = "lr";
+ reg_info.alt_name = "r14";
+ reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA;
+ break;
+ case dwarf_pc:
+ reg_info.name = "pc";
+ reg_info.alt_name = "r15";
+ reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;
+ break;
+ case dwarf_cpsr:
+ reg_info.name = "cpsr";
+ reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS;
+ break;
+
+ case dwarf_s0:
+ reg_info.name = "s0";
+ break;
+ case dwarf_s1:
+ reg_info.name = "s1";
+ break;
+ case dwarf_s2:
+ reg_info.name = "s2";
+ break;
+ case dwarf_s3:
+ reg_info.name = "s3";
+ break;
+ case dwarf_s4:
+ reg_info.name = "s4";
+ break;
+ case dwarf_s5:
+ reg_info.name = "s5";
+ break;
+ case dwarf_s6:
+ reg_info.name = "s6";
+ break;
+ case dwarf_s7:
+ reg_info.name = "s7";
+ break;
+ case dwarf_s8:
+ reg_info.name = "s8";
+ break;
+ case dwarf_s9:
+ reg_info.name = "s9";
+ break;
+ case dwarf_s10:
+ reg_info.name = "s10";
+ break;
+ case dwarf_s11:
+ reg_info.name = "s11";
+ break;
+ case dwarf_s12:
+ reg_info.name = "s12";
+ break;
+ case dwarf_s13:
+ reg_info.name = "s13";
+ break;
+ case dwarf_s14:
+ reg_info.name = "s14";
+ break;
+ case dwarf_s15:
+ reg_info.name = "s15";
+ break;
+ case dwarf_s16:
+ reg_info.name = "s16";
+ break;
+ case dwarf_s17:
+ reg_info.name = "s17";
+ break;
+ case dwarf_s18:
+ reg_info.name = "s18";
+ break;
+ case dwarf_s19:
+ reg_info.name = "s19";
+ break;
+ case dwarf_s20:
+ reg_info.name = "s20";
+ break;
+ case dwarf_s21:
+ reg_info.name = "s21";
+ break;
+ case dwarf_s22:
+ reg_info.name = "s22";
+ break;
+ case dwarf_s23:
+ reg_info.name = "s23";
+ break;
+ case dwarf_s24:
+ reg_info.name = "s24";
+ break;
+ case dwarf_s25:
+ reg_info.name = "s25";
+ break;
+ case dwarf_s26:
+ reg_info.name = "s26";
+ break;
+ case dwarf_s27:
+ reg_info.name = "s27";
+ break;
+ case dwarf_s28:
+ reg_info.name = "s28";
+ break;
+ case dwarf_s29:
+ reg_info.name = "s29";
+ break;
+ case dwarf_s30:
+ reg_info.name = "s30";
+ break;
+ case dwarf_s31:
+ reg_info.name = "s31";
+ break;
+
+ // FPA Registers 0-7
+ case dwarf_f0:
+ reg_info.name = "f0";
+ break;
+ case dwarf_f1:
+ reg_info.name = "f1";
+ break;
+ case dwarf_f2:
+ reg_info.name = "f2";
+ break;
+ case dwarf_f3:
+ reg_info.name = "f3";
+ break;
+ case dwarf_f4:
+ reg_info.name = "f4";
+ break;
+ case dwarf_f5:
+ reg_info.name = "f5";
+ break;
+ case dwarf_f6:
+ reg_info.name = "f6";
+ break;
+ case dwarf_f7:
+ reg_info.name = "f7";
+ break;
+
+ // Intel wireless MMX general purpose registers 0 - 7
+ // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
+ case dwarf_wCGR0:
+ reg_info.name = "wCGR0/ACC0";
+ break;
+ case dwarf_wCGR1:
+ reg_info.name = "wCGR1/ACC1";
+ break;
+ case dwarf_wCGR2:
+ reg_info.name = "wCGR2/ACC2";
+ break;
+ case dwarf_wCGR3:
+ reg_info.name = "wCGR3/ACC3";
+ break;
+ case dwarf_wCGR4:
+ reg_info.name = "wCGR4/ACC4";
+ break;
+ case dwarf_wCGR5:
+ reg_info.name = "wCGR5/ACC5";
+ break;
+ case dwarf_wCGR6:
+ reg_info.name = "wCGR6/ACC6";
+ break;
+ case dwarf_wCGR7:
+ reg_info.name = "wCGR7/ACC7";
+ break;
+
+ // Intel wireless MMX data registers 0 - 15
+ case dwarf_wR0:
+ reg_info.name = "wR0";
+ break;
+ case dwarf_wR1:
+ reg_info.name = "wR1";
+ break;
+ case dwarf_wR2:
+ reg_info.name = "wR2";
+ break;
+ case dwarf_wR3:
+ reg_info.name = "wR3";
+ break;
+ case dwarf_wR4:
+ reg_info.name = "wR4";
+ break;
+ case dwarf_wR5:
+ reg_info.name = "wR5";
+ break;
+ case dwarf_wR6:
+ reg_info.name = "wR6";
+ break;
+ case dwarf_wR7:
+ reg_info.name = "wR7";
+ break;
+ case dwarf_wR8:
+ reg_info.name = "wR8";
+ break;
+ case dwarf_wR9:
+ reg_info.name = "wR9";
+ break;
+ case dwarf_wR10:
+ reg_info.name = "wR10";
+ break;
+ case dwarf_wR11:
+ reg_info.name = "wR11";
+ break;
+ case dwarf_wR12:
+ reg_info.name = "wR12";
+ break;
+ case dwarf_wR13:
+ reg_info.name = "wR13";
+ break;
+ case dwarf_wR14:
+ reg_info.name = "wR14";
+ break;
+ case dwarf_wR15:
+ reg_info.name = "wR15";
+ break;
+
+ case dwarf_spsr:
+ reg_info.name = "spsr";
+ break;
+ case dwarf_spsr_fiq:
+ reg_info.name = "spsr_fiq";
+ break;
+ case dwarf_spsr_irq:
+ reg_info.name = "spsr_irq";
+ break;
+ case dwarf_spsr_abt:
+ reg_info.name = "spsr_abt";
+ break;
+ case dwarf_spsr_und:
+ reg_info.name = "spsr_und";
+ break;
+ case dwarf_spsr_svc:
+ reg_info.name = "spsr_svc";
+ break;
+
+ case dwarf_r8_usr:
+ reg_info.name = "r8_usr";
+ break;
+ case dwarf_r9_usr:
+ reg_info.name = "r9_usr";
+ break;
+ case dwarf_r10_usr:
+ reg_info.name = "r10_usr";
+ break;
+ case dwarf_r11_usr:
+ reg_info.name = "r11_usr";
+ break;
+ case dwarf_r12_usr:
+ reg_info.name = "r12_usr";
+ break;
+ case dwarf_r13_usr:
+ reg_info.name = "r13_usr";
+ break;
+ case dwarf_r14_usr:
+ reg_info.name = "r14_usr";
+ break;
+ case dwarf_r8_fiq:
+ reg_info.name = "r8_fiq";
+ break;
+ case dwarf_r9_fiq:
+ reg_info.name = "r9_fiq";
+ break;
+ case dwarf_r10_fiq:
+ reg_info.name = "r10_fiq";
+ break;
+ case dwarf_r11_fiq:
+ reg_info.name = "r11_fiq";
+ break;
+ case dwarf_r12_fiq:
+ reg_info.name = "r12_fiq";
+ break;
+ case dwarf_r13_fiq:
+ reg_info.name = "r13_fiq";
+ break;
+ case dwarf_r14_fiq:
+ reg_info.name = "r14_fiq";
+ break;
+ case dwarf_r13_irq:
+ reg_info.name = "r13_irq";
+ break;
+ case dwarf_r14_irq:
+ reg_info.name = "r14_irq";
+ break;
+ case dwarf_r13_abt:
+ reg_info.name = "r13_abt";
+ break;
+ case dwarf_r14_abt:
+ reg_info.name = "r14_abt";
+ break;
+ case dwarf_r13_und:
+ reg_info.name = "r13_und";
+ break;
+ case dwarf_r14_und:
+ reg_info.name = "r14_und";
+ break;
+ case dwarf_r13_svc:
+ reg_info.name = "r13_svc";
+ break;
+ case dwarf_r14_svc:
+ reg_info.name = "r14_svc";
+ break;
- if (reg_num >= dwarf_q0 && reg_num <= dwarf_q15)
- {
- reg_info.byte_size = 16;
- reg_info.format = eFormatVectorOfUInt8;
- reg_info.encoding = eEncodingVector;
- }
-
- if (reg_num >= dwarf_d0 && reg_num <= dwarf_d31)
- {
- reg_info.byte_size = 8;
- reg_info.format = eFormatFloat;
- reg_info.encoding = eEncodingIEEE754;
- }
- else if (reg_num >= dwarf_s0 && reg_num <= dwarf_s31)
- {
- reg_info.byte_size = 4;
- reg_info.format = eFormatFloat;
- reg_info.encoding = eEncodingIEEE754;
- }
- else if (reg_num >= dwarf_f0 && reg_num <= dwarf_f7)
- {
- reg_info.byte_size = 12;
- reg_info.format = eFormatFloat;
- reg_info.encoding = eEncodingIEEE754;
- }
- else
- {
- reg_info.byte_size = 4;
- reg_info.format = eFormatHex;
- reg_info.encoding = eEncodingUint;
- }
-
- reg_info.kinds[eRegisterKindDWARF] = reg_num;
+ // Intel wireless MMX control register in co-processor 0 - 7
+ case dwarf_wC0:
+ reg_info.name = "wC0";
+ break;
+ case dwarf_wC1:
+ reg_info.name = "wC1";
+ break;
+ case dwarf_wC2:
+ reg_info.name = "wC2";
+ break;
+ case dwarf_wC3:
+ reg_info.name = "wC3";
+ break;
+ case dwarf_wC4:
+ reg_info.name = "wC4";
+ break;
+ case dwarf_wC5:
+ reg_info.name = "wC5";
+ break;
+ case dwarf_wC6:
+ reg_info.name = "wC6";
+ break;
+ case dwarf_wC7:
+ reg_info.name = "wC7";
+ break;
- switch (reg_num)
- {
- case dwarf_r0: reg_info.name = "r0"; break;
- case dwarf_r1: reg_info.name = "r1"; break;
- case dwarf_r2: reg_info.name = "r2"; break;
- case dwarf_r3: reg_info.name = "r3"; break;
- case dwarf_r4: reg_info.name = "r4"; break;
- case dwarf_r5: reg_info.name = "r5"; break;
- case dwarf_r6: reg_info.name = "r6"; break;
- case dwarf_r7: reg_info.name = "r7"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break;
- case dwarf_r8: reg_info.name = "r8"; break;
- case dwarf_r9: reg_info.name = "r9"; break;
- case dwarf_r10: reg_info.name = "r10"; break;
- case dwarf_r11: reg_info.name = "r11"; break;
- case dwarf_r12: reg_info.name = "r12"; break;
- case dwarf_sp: reg_info.name = "sp"; reg_info.alt_name = "r13"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break;
- case dwarf_lr: reg_info.name = "lr"; reg_info.alt_name = "r14"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break;
- case dwarf_pc: reg_info.name = "pc"; reg_info.alt_name = "r15"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break;
- case dwarf_cpsr:reg_info.name = "cpsr"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; break;
-
- case dwarf_s0: reg_info.name = "s0"; break;
- case dwarf_s1: reg_info.name = "s1"; break;
- case dwarf_s2: reg_info.name = "s2"; break;
- case dwarf_s3: reg_info.name = "s3"; break;
- case dwarf_s4: reg_info.name = "s4"; break;
- case dwarf_s5: reg_info.name = "s5"; break;
- case dwarf_s6: reg_info.name = "s6"; break;
- case dwarf_s7: reg_info.name = "s7"; break;
- case dwarf_s8: reg_info.name = "s8"; break;
- case dwarf_s9: reg_info.name = "s9"; break;
- case dwarf_s10: reg_info.name = "s10"; break;
- case dwarf_s11: reg_info.name = "s11"; break;
- case dwarf_s12: reg_info.name = "s12"; break;
- case dwarf_s13: reg_info.name = "s13"; break;
- case dwarf_s14: reg_info.name = "s14"; break;
- case dwarf_s15: reg_info.name = "s15"; break;
- case dwarf_s16: reg_info.name = "s16"; break;
- case dwarf_s17: reg_info.name = "s17"; break;
- case dwarf_s18: reg_info.name = "s18"; break;
- case dwarf_s19: reg_info.name = "s19"; break;
- case dwarf_s20: reg_info.name = "s20"; break;
- case dwarf_s21: reg_info.name = "s21"; break;
- case dwarf_s22: reg_info.name = "s22"; break;
- case dwarf_s23: reg_info.name = "s23"; break;
- case dwarf_s24: reg_info.name = "s24"; break;
- case dwarf_s25: reg_info.name = "s25"; break;
- case dwarf_s26: reg_info.name = "s26"; break;
- case dwarf_s27: reg_info.name = "s27"; break;
- case dwarf_s28: reg_info.name = "s28"; break;
- case dwarf_s29: reg_info.name = "s29"; break;
- case dwarf_s30: reg_info.name = "s30"; break;
- case dwarf_s31: reg_info.name = "s31"; break;
-
- // FPA Registers 0-7
- case dwarf_f0: reg_info.name = "f0"; break;
- case dwarf_f1: reg_info.name = "f1"; break;
- case dwarf_f2: reg_info.name = "f2"; break;
- case dwarf_f3: reg_info.name = "f3"; break;
- case dwarf_f4: reg_info.name = "f4"; break;
- case dwarf_f5: reg_info.name = "f5"; break;
- case dwarf_f6: reg_info.name = "f6"; break;
- case dwarf_f7: reg_info.name = "f7"; break;
-
- // Intel wireless MMX general purpose registers 0 - 7
- // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
- case dwarf_wCGR0: reg_info.name = "wCGR0/ACC0"; break;
- case dwarf_wCGR1: reg_info.name = "wCGR1/ACC1"; break;
- case dwarf_wCGR2: reg_info.name = "wCGR2/ACC2"; break;
- case dwarf_wCGR3: reg_info.name = "wCGR3/ACC3"; break;
- case dwarf_wCGR4: reg_info.name = "wCGR4/ACC4"; break;
- case dwarf_wCGR5: reg_info.name = "wCGR5/ACC5"; break;
- case dwarf_wCGR6: reg_info.name = "wCGR6/ACC6"; break;
- case dwarf_wCGR7: reg_info.name = "wCGR7/ACC7"; break;
-
- // Intel wireless MMX data registers 0 - 15
- case dwarf_wR0: reg_info.name = "wR0"; break;
- case dwarf_wR1: reg_info.name = "wR1"; break;
- case dwarf_wR2: reg_info.name = "wR2"; break;
- case dwarf_wR3: reg_info.name = "wR3"; break;
- case dwarf_wR4: reg_info.name = "wR4"; break;
- case dwarf_wR5: reg_info.name = "wR5"; break;
- case dwarf_wR6: reg_info.name = "wR6"; break;
- case dwarf_wR7: reg_info.name = "wR7"; break;
- case dwarf_wR8: reg_info.name = "wR8"; break;
- case dwarf_wR9: reg_info.name = "wR9"; break;
- case dwarf_wR10: reg_info.name = "wR10"; break;
- case dwarf_wR11: reg_info.name = "wR11"; break;
- case dwarf_wR12: reg_info.name = "wR12"; break;
- case dwarf_wR13: reg_info.name = "wR13"; break;
- case dwarf_wR14: reg_info.name = "wR14"; break;
- case dwarf_wR15: reg_info.name = "wR15"; break;
-
- case dwarf_spsr: reg_info.name = "spsr"; break;
- case dwarf_spsr_fiq: reg_info.name = "spsr_fiq"; break;
- case dwarf_spsr_irq: reg_info.name = "spsr_irq"; break;
- case dwarf_spsr_abt: reg_info.name = "spsr_abt"; break;
- case dwarf_spsr_und: reg_info.name = "spsr_und"; break;
- case dwarf_spsr_svc: reg_info.name = "spsr_svc"; break;
-
- case dwarf_r8_usr: reg_info.name = "r8_usr"; break;
- case dwarf_r9_usr: reg_info.name = "r9_usr"; break;
- case dwarf_r10_usr: reg_info.name = "r10_usr"; break;
- case dwarf_r11_usr: reg_info.name = "r11_usr"; break;
- case dwarf_r12_usr: reg_info.name = "r12_usr"; break;
- case dwarf_r13_usr: reg_info.name = "r13_usr"; break;
- case dwarf_r14_usr: reg_info.name = "r14_usr"; break;
- case dwarf_r8_fiq: reg_info.name = "r8_fiq"; break;
- case dwarf_r9_fiq: reg_info.name = "r9_fiq"; break;
- case dwarf_r10_fiq: reg_info.name = "r10_fiq"; break;
- case dwarf_r11_fiq: reg_info.name = "r11_fiq"; break;
- case dwarf_r12_fiq: reg_info.name = "r12_fiq"; break;
- case dwarf_r13_fiq: reg_info.name = "r13_fiq"; break;
- case dwarf_r14_fiq: reg_info.name = "r14_fiq"; break;
- case dwarf_r13_irq: reg_info.name = "r13_irq"; break;
- case dwarf_r14_irq: reg_info.name = "r14_irq"; break;
- case dwarf_r13_abt: reg_info.name = "r13_abt"; break;
- case dwarf_r14_abt: reg_info.name = "r14_abt"; break;
- case dwarf_r13_und: reg_info.name = "r13_und"; break;
- case dwarf_r14_und: reg_info.name = "r14_und"; break;
- case dwarf_r13_svc: reg_info.name = "r13_svc"; break;
- case dwarf_r14_svc: reg_info.name = "r14_svc"; break;
-
- // Intel wireless MMX control register in co-processor 0 - 7
- case dwarf_wC0: reg_info.name = "wC0"; break;
- case dwarf_wC1: reg_info.name = "wC1"; break;
- case dwarf_wC2: reg_info.name = "wC2"; break;
- case dwarf_wC3: reg_info.name = "wC3"; break;
- case dwarf_wC4: reg_info.name = "wC4"; break;
- case dwarf_wC5: reg_info.name = "wC5"; break;
- case dwarf_wC6: reg_info.name = "wC6"; break;
- case dwarf_wC7: reg_info.name = "wC7"; break;
-
- // VFP-v3/Neon
- case dwarf_d0: reg_info.name = "d0"; break;
- case dwarf_d1: reg_info.name = "d1"; break;
- case dwarf_d2: reg_info.name = "d2"; break;
- case dwarf_d3: reg_info.name = "d3"; break;
- case dwarf_d4: reg_info.name = "d4"; break;
- case dwarf_d5: reg_info.name = "d5"; break;
- case dwarf_d6: reg_info.name = "d6"; break;
- case dwarf_d7: reg_info.name = "d7"; break;
- case dwarf_d8: reg_info.name = "d8"; break;
- case dwarf_d9: reg_info.name = "d9"; break;
- case dwarf_d10: reg_info.name = "d10"; break;
- case dwarf_d11: reg_info.name = "d11"; break;
- case dwarf_d12: reg_info.name = "d12"; break;
- case dwarf_d13: reg_info.name = "d13"; break;
- case dwarf_d14: reg_info.name = "d14"; break;
- case dwarf_d15: reg_info.name = "d15"; break;
- case dwarf_d16: reg_info.name = "d16"; break;
- case dwarf_d17: reg_info.name = "d17"; break;
- case dwarf_d18: reg_info.name = "d18"; break;
- case dwarf_d19: reg_info.name = "d19"; break;
- case dwarf_d20: reg_info.name = "d20"; break;
- case dwarf_d21: reg_info.name = "d21"; break;
- case dwarf_d22: reg_info.name = "d22"; break;
- case dwarf_d23: reg_info.name = "d23"; break;
- case dwarf_d24: reg_info.name = "d24"; break;
- case dwarf_d25: reg_info.name = "d25"; break;
- case dwarf_d26: reg_info.name = "d26"; break;
- case dwarf_d27: reg_info.name = "d27"; break;
- case dwarf_d28: reg_info.name = "d28"; break;
- case dwarf_d29: reg_info.name = "d29"; break;
- case dwarf_d30: reg_info.name = "d30"; break;
- case dwarf_d31: reg_info.name = "d31"; break;
+ // VFP-v3/Neon
+ case dwarf_d0:
+ reg_info.name = "d0";
+ break;
+ case dwarf_d1:
+ reg_info.name = "d1";
+ break;
+ case dwarf_d2:
+ reg_info.name = "d2";
+ break;
+ case dwarf_d3:
+ reg_info.name = "d3";
+ break;
+ case dwarf_d4:
+ reg_info.name = "d4";
+ break;
+ case dwarf_d5:
+ reg_info.name = "d5";
+ break;
+ case dwarf_d6:
+ reg_info.name = "d6";
+ break;
+ case dwarf_d7:
+ reg_info.name = "d7";
+ break;
+ case dwarf_d8:
+ reg_info.name = "d8";
+ break;
+ case dwarf_d9:
+ reg_info.name = "d9";
+ break;
+ case dwarf_d10:
+ reg_info.name = "d10";
+ break;
+ case dwarf_d11:
+ reg_info.name = "d11";
+ break;
+ case dwarf_d12:
+ reg_info.name = "d12";
+ break;
+ case dwarf_d13:
+ reg_info.name = "d13";
+ break;
+ case dwarf_d14:
+ reg_info.name = "d14";
+ break;
+ case dwarf_d15:
+ reg_info.name = "d15";
+ break;
+ case dwarf_d16:
+ reg_info.name = "d16";
+ break;
+ case dwarf_d17:
+ reg_info.name = "d17";
+ break;
+ case dwarf_d18:
+ reg_info.name = "d18";
+ break;
+ case dwarf_d19:
+ reg_info.name = "d19";
+ break;
+ case dwarf_d20:
+ reg_info.name = "d20";
+ break;
+ case dwarf_d21:
+ reg_info.name = "d21";
+ break;
+ case dwarf_d22:
+ reg_info.name = "d22";
+ break;
+ case dwarf_d23:
+ reg_info.name = "d23";
+ break;
+ case dwarf_d24:
+ reg_info.name = "d24";
+ break;
+ case dwarf_d25:
+ reg_info.name = "d25";
+ break;
+ case dwarf_d26:
+ reg_info.name = "d26";
+ break;
+ case dwarf_d27:
+ reg_info.name = "d27";
+ break;
+ case dwarf_d28:
+ reg_info.name = "d28";
+ break;
+ case dwarf_d29:
+ reg_info.name = "d29";
+ break;
+ case dwarf_d30:
+ reg_info.name = "d30";
+ break;
+ case dwarf_d31:
+ reg_info.name = "d31";
+ break;
- // NEON 128-bit vector registers (overlays the d registers)
- case dwarf_q0: reg_info.name = "q0"; break;
- case dwarf_q1: reg_info.name = "q1"; break;
- case dwarf_q2: reg_info.name = "q2"; break;
- case dwarf_q3: reg_info.name = "q3"; break;
- case dwarf_q4: reg_info.name = "q4"; break;
- case dwarf_q5: reg_info.name = "q5"; break;
- case dwarf_q6: reg_info.name = "q6"; break;
- case dwarf_q7: reg_info.name = "q7"; break;
- case dwarf_q8: reg_info.name = "q8"; break;
- case dwarf_q9: reg_info.name = "q9"; break;
- case dwarf_q10: reg_info.name = "q10"; break;
- case dwarf_q11: reg_info.name = "q11"; break;
- case dwarf_q12: reg_info.name = "q12"; break;
- case dwarf_q13: reg_info.name = "q13"; break;
- case dwarf_q14: reg_info.name = "q14"; break;
- case dwarf_q15: reg_info.name = "q15"; break;
+ // NEON 128-bit vector registers (overlays the d registers)
+ case dwarf_q0:
+ reg_info.name = "q0";
+ break;
+ case dwarf_q1:
+ reg_info.name = "q1";
+ break;
+ case dwarf_q2:
+ reg_info.name = "q2";
+ break;
+ case dwarf_q3:
+ reg_info.name = "q3";
+ break;
+ case dwarf_q4:
+ reg_info.name = "q4";
+ break;
+ case dwarf_q5:
+ reg_info.name = "q5";
+ break;
+ case dwarf_q6:
+ reg_info.name = "q6";
+ break;
+ case dwarf_q7:
+ reg_info.name = "q7";
+ break;
+ case dwarf_q8:
+ reg_info.name = "q8";
+ break;
+ case dwarf_q9:
+ reg_info.name = "q9";
+ break;
+ case dwarf_q10:
+ reg_info.name = "q10";
+ break;
+ case dwarf_q11:
+ reg_info.name = "q11";
+ break;
+ case dwarf_q12:
+ reg_info.name = "q12";
+ break;
+ case dwarf_q13:
+ reg_info.name = "q13";
+ break;
+ case dwarf_q14:
+ reg_info.name = "q14";
+ break;
+ case dwarf_q15:
+ reg_info.name = "q15";
+ break;
- default: return false;
- }
- return true;
+ default:
+ return false;
+ }
+ return true;
}
diff --git a/source/Utility/ARM_DWARF_Registers.h b/source/Utility/ARM_DWARF_Registers.h
index 6850d3e80f119..9b226c113ce62 100644
--- a/source/Utility/ARM_DWARF_Registers.h
+++ b/source/Utility/ARM_DWARF_Registers.h
@@ -12,206 +12,202 @@
#include "lldb/lldb-private.h"
-enum
-{
- dwarf_r0 = 0,
- dwarf_r1,
- dwarf_r2,
- dwarf_r3,
- dwarf_r4,
- dwarf_r5,
- dwarf_r6,
- dwarf_r7,
- dwarf_r8,
- dwarf_r9,
- dwarf_r10,
- dwarf_r11,
- dwarf_r12,
- dwarf_sp,
- dwarf_lr,
- dwarf_pc,
- dwarf_cpsr,
-
- dwarf_s0 = 64,
- dwarf_s1,
- dwarf_s2,
- dwarf_s3,
- dwarf_s4,
- dwarf_s5,
- dwarf_s6,
- dwarf_s7,
- dwarf_s8,
- dwarf_s9,
- dwarf_s10,
- dwarf_s11,
- dwarf_s12,
- dwarf_s13,
- dwarf_s14,
- dwarf_s15,
- dwarf_s16,
- dwarf_s17,
- dwarf_s18,
- dwarf_s19,
- dwarf_s20,
- dwarf_s21,
- dwarf_s22,
- dwarf_s23,
- dwarf_s24,
- dwarf_s25,
- dwarf_s26,
- dwarf_s27,
- dwarf_s28,
- dwarf_s29,
- dwarf_s30,
- dwarf_s31,
-
- // FPA Registers 0-7
- dwarf_f0 = 96,
- dwarf_f1,
- dwarf_f2,
- dwarf_f3,
- dwarf_f4,
- dwarf_f5,
- dwarf_f6,
- dwarf_f7,
-
- // Intel wireless MMX general purpose registers 0 - 7
- dwarf_wCGR0 = 104,
- dwarf_wCGR1,
- dwarf_wCGR2,
- dwarf_wCGR3,
- dwarf_wCGR4,
- dwarf_wCGR5,
- dwarf_wCGR6,
- dwarf_wCGR7,
-
- // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
- dwarf_ACC0 = 104,
- dwarf_ACC1,
- dwarf_ACC2,
- dwarf_ACC3,
- dwarf_ACC4,
- dwarf_ACC5,
- dwarf_ACC6,
- dwarf_ACC7,
-
- // Intel wireless MMX data registers 0 - 15
- dwarf_wR0 = 112,
- dwarf_wR1,
- dwarf_wR2,
- dwarf_wR3,
- dwarf_wR4,
- dwarf_wR5,
- dwarf_wR6,
- dwarf_wR7,
- dwarf_wR8,
- dwarf_wR9,
- dwarf_wR10,
- dwarf_wR11,
- dwarf_wR12,
- dwarf_wR13,
- dwarf_wR14,
- dwarf_wR15,
-
- dwarf_spsr = 128,
- dwarf_spsr_fiq,
- dwarf_spsr_irq,
- dwarf_spsr_abt,
- dwarf_spsr_und,
- dwarf_spsr_svc,
-
- dwarf_r8_usr = 144,
- dwarf_r9_usr,
- dwarf_r10_usr,
- dwarf_r11_usr,
- dwarf_r12_usr,
- dwarf_r13_usr,
- dwarf_r14_usr,
- dwarf_r8_fiq,
- dwarf_r9_fiq,
- dwarf_r10_fiq,
- dwarf_r11_fiq,
- dwarf_r12_fiq,
- dwarf_r13_fiq,
- dwarf_r14_fiq,
- dwarf_r13_irq,
- dwarf_r14_irq,
- dwarf_r13_abt,
- dwarf_r14_abt,
- dwarf_r13_und,
- dwarf_r14_und,
- dwarf_r13_svc,
- dwarf_r14_svc,
-
- // Intel wireless MMX control register in co-processor 0 - 7
- dwarf_wC0 = 192,
- dwarf_wC1,
- dwarf_wC2,
- dwarf_wC3,
- dwarf_wC4,
- dwarf_wC5,
- dwarf_wC6,
- dwarf_wC7,
-
- // VFP-v3/Neon
- dwarf_d0 = 256,
- dwarf_d1,
- dwarf_d2,
- dwarf_d3,
- dwarf_d4,
- dwarf_d5,
- dwarf_d6,
- dwarf_d7,
- dwarf_d8,
- dwarf_d9,
- dwarf_d10,
- dwarf_d11,
- dwarf_d12,
- dwarf_d13,
- dwarf_d14,
- dwarf_d15,
- dwarf_d16,
- dwarf_d17,
- dwarf_d18,
- dwarf_d19,
- dwarf_d20,
- dwarf_d21,
- dwarf_d22,
- dwarf_d23,
- dwarf_d24,
- dwarf_d25,
- dwarf_d26,
- dwarf_d27,
- dwarf_d28,
- dwarf_d29,
- dwarf_d30,
- dwarf_d31,
-
- // Neon quadword registers
- dwarf_q0 = 288,
- dwarf_q1,
- dwarf_q2,
- dwarf_q3,
- dwarf_q4,
- dwarf_q5,
- dwarf_q6,
- dwarf_q7,
- dwarf_q8,
- dwarf_q9,
- dwarf_q10,
- dwarf_q11,
- dwarf_q12,
- dwarf_q13,
- dwarf_q14,
- dwarf_q15
+enum {
+ dwarf_r0 = 0,
+ dwarf_r1,
+ dwarf_r2,
+ dwarf_r3,
+ dwarf_r4,
+ dwarf_r5,
+ dwarf_r6,
+ dwarf_r7,
+ dwarf_r8,
+ dwarf_r9,
+ dwarf_r10,
+ dwarf_r11,
+ dwarf_r12,
+ dwarf_sp,
+ dwarf_lr,
+ dwarf_pc,
+ dwarf_cpsr,
+
+ dwarf_s0 = 64,
+ dwarf_s1,
+ dwarf_s2,
+ dwarf_s3,
+ dwarf_s4,
+ dwarf_s5,
+ dwarf_s6,
+ dwarf_s7,
+ dwarf_s8,
+ dwarf_s9,
+ dwarf_s10,
+ dwarf_s11,
+ dwarf_s12,
+ dwarf_s13,
+ dwarf_s14,
+ dwarf_s15,
+ dwarf_s16,
+ dwarf_s17,
+ dwarf_s18,
+ dwarf_s19,
+ dwarf_s20,
+ dwarf_s21,
+ dwarf_s22,
+ dwarf_s23,
+ dwarf_s24,
+ dwarf_s25,
+ dwarf_s26,
+ dwarf_s27,
+ dwarf_s28,
+ dwarf_s29,
+ dwarf_s30,
+ dwarf_s31,
+
+ // FPA Registers 0-7
+ dwarf_f0 = 96,
+ dwarf_f1,
+ dwarf_f2,
+ dwarf_f3,
+ dwarf_f4,
+ dwarf_f5,
+ dwarf_f6,
+ dwarf_f7,
+
+ // Intel wireless MMX general purpose registers 0 - 7
+ dwarf_wCGR0 = 104,
+ dwarf_wCGR1,
+ dwarf_wCGR2,
+ dwarf_wCGR3,
+ dwarf_wCGR4,
+ dwarf_wCGR5,
+ dwarf_wCGR6,
+ dwarf_wCGR7,
+
+ // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
+ dwarf_ACC0 = 104,
+ dwarf_ACC1,
+ dwarf_ACC2,
+ dwarf_ACC3,
+ dwarf_ACC4,
+ dwarf_ACC5,
+ dwarf_ACC6,
+ dwarf_ACC7,
+
+ // Intel wireless MMX data registers 0 - 15
+ dwarf_wR0 = 112,
+ dwarf_wR1,
+ dwarf_wR2,
+ dwarf_wR3,
+ dwarf_wR4,
+ dwarf_wR5,
+ dwarf_wR6,
+ dwarf_wR7,
+ dwarf_wR8,
+ dwarf_wR9,
+ dwarf_wR10,
+ dwarf_wR11,
+ dwarf_wR12,
+ dwarf_wR13,
+ dwarf_wR14,
+ dwarf_wR15,
+
+ dwarf_spsr = 128,
+ dwarf_spsr_fiq,
+ dwarf_spsr_irq,
+ dwarf_spsr_abt,
+ dwarf_spsr_und,
+ dwarf_spsr_svc,
+
+ dwarf_r8_usr = 144,
+ dwarf_r9_usr,
+ dwarf_r10_usr,
+ dwarf_r11_usr,
+ dwarf_r12_usr,
+ dwarf_r13_usr,
+ dwarf_r14_usr,
+ dwarf_r8_fiq,
+ dwarf_r9_fiq,
+ dwarf_r10_fiq,
+ dwarf_r11_fiq,
+ dwarf_r12_fiq,
+ dwarf_r13_fiq,
+ dwarf_r14_fiq,
+ dwarf_r13_irq,
+ dwarf_r14_irq,
+ dwarf_r13_abt,
+ dwarf_r14_abt,
+ dwarf_r13_und,
+ dwarf_r14_und,
+ dwarf_r13_svc,
+ dwarf_r14_svc,
+
+ // Intel wireless MMX control register in co-processor 0 - 7
+ dwarf_wC0 = 192,
+ dwarf_wC1,
+ dwarf_wC2,
+ dwarf_wC3,
+ dwarf_wC4,
+ dwarf_wC5,
+ dwarf_wC6,
+ dwarf_wC7,
+
+ // VFP-v3/Neon
+ dwarf_d0 = 256,
+ dwarf_d1,
+ dwarf_d2,
+ dwarf_d3,
+ dwarf_d4,
+ dwarf_d5,
+ dwarf_d6,
+ dwarf_d7,
+ dwarf_d8,
+ dwarf_d9,
+ dwarf_d10,
+ dwarf_d11,
+ dwarf_d12,
+ dwarf_d13,
+ dwarf_d14,
+ dwarf_d15,
+ dwarf_d16,
+ dwarf_d17,
+ dwarf_d18,
+ dwarf_d19,
+ dwarf_d20,
+ dwarf_d21,
+ dwarf_d22,
+ dwarf_d23,
+ dwarf_d24,
+ dwarf_d25,
+ dwarf_d26,
+ dwarf_d27,
+ dwarf_d28,
+ dwarf_d29,
+ dwarf_d30,
+ dwarf_d31,
+
+ // Neon quadword registers
+ dwarf_q0 = 288,
+ dwarf_q1,
+ dwarf_q2,
+ dwarf_q3,
+ dwarf_q4,
+ dwarf_q5,
+ dwarf_q6,
+ dwarf_q7,
+ dwarf_q8,
+ dwarf_q9,
+ dwarf_q10,
+ dwarf_q11,
+ dwarf_q12,
+ dwarf_q13,
+ dwarf_q14,
+ dwarf_q15
};
-const char *
-GetARMDWARFRegisterName (unsigned reg_num);
-
-bool
-GetARMDWARFRegisterInfo (unsigned reg_num,
- lldb_private::RegisterInfo &reg_info);
+const char *GetARMDWARFRegisterName(unsigned reg_num);
-#endif // utility_ARM_DWARF_Registers_h_
+bool GetARMDWARFRegisterInfo(unsigned reg_num,
+ lldb_private::RegisterInfo &reg_info);
+#endif // utility_ARM_DWARF_Registers_h_
diff --git a/source/Utility/ARM_ehframe_Registers.h b/source/Utility/ARM_ehframe_Registers.h
index 7d4951d6ce89d..2a4242314d526 100644
--- a/source/Utility/ARM_ehframe_Registers.h
+++ b/source/Utility/ARM_ehframe_Registers.h
@@ -1,4 +1,5 @@
-//===-- ARM_ehframe_Registers.h -------------------------------------*- C++ -*-===//
+//===-- ARM_ehframe_Registers.h -------------------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -13,26 +14,24 @@
// The register numbers used in the eh_frame unwind information.
// Should be the same as DWARF register numbers.
-enum
-{
- ehframe_r0 = 0,
- ehframe_r1,
- ehframe_r2,
- ehframe_r3,
- ehframe_r4,
- ehframe_r5,
- ehframe_r6,
- ehframe_r7,
- ehframe_r8,
- ehframe_r9,
- ehframe_r10,
- ehframe_r11,
- ehframe_r12,
- ehframe_sp,
- ehframe_lr,
- ehframe_pc,
- ehframe_cpsr
+enum {
+ ehframe_r0 = 0,
+ ehframe_r1,
+ ehframe_r2,
+ ehframe_r3,
+ ehframe_r4,
+ ehframe_r5,
+ ehframe_r6,
+ ehframe_r7,
+ ehframe_r8,
+ ehframe_r9,
+ ehframe_r10,
+ ehframe_r11,
+ ehframe_r12,
+ ehframe_sp,
+ ehframe_lr,
+ ehframe_pc,
+ ehframe_cpsr
};
#endif // utility_ARM_ehframe_Registers_h_
-
diff --git a/source/Utility/CMakeLists.txt b/source/Utility/CMakeLists.txt
index aa4ad0301352a..9cddcc02cc587 100644
--- a/source/Utility/CMakeLists.txt
+++ b/source/Utility/CMakeLists.txt
@@ -3,18 +3,17 @@ add_lldb_library(lldbUtility
ARM64_DWARF_Registers.cpp
ConvertEnum.cpp
JSON.cpp
- KQueue.cpp
LLDBAssert.cpp
ModuleCache.cpp
NameMatches.cpp
PseudoTerminal.cpp
Range.cpp
RegisterNumber.cpp
+ SelectHelper.cpp
SharingPtr.cpp
StringExtractor.cpp
StringExtractorGDBRemote.cpp
StringLexer.cpp
TaskPool.cpp
- TimeSpecTimeout.cpp
UriParser.cpp
)
diff --git a/source/Utility/ConvertEnum.cpp b/source/Utility/ConvertEnum.cpp
index 99515631db250..bb0484ef5200a 100644
--- a/source/Utility/ConvertEnum.cpp
+++ b/source/Utility/ConvertEnum.cpp
@@ -11,114 +11,108 @@
using namespace lldb;
using namespace lldb_private;
-const char *
-lldb_private::GetVoteAsCString(Vote vote)
-{
- switch (vote)
- {
- case eVoteNo:
- return "no";
- case eVoteNoOpinion:
- return "no opinion";
- case eVoteYes:
- return "yes";
- }
- return "invalid";
+const char *lldb_private::GetVoteAsCString(Vote vote) {
+ switch (vote) {
+ case eVoteNo:
+ return "no";
+ case eVoteNoOpinion:
+ return "no opinion";
+ case eVoteYes:
+ return "yes";
+ }
+ return "invalid";
}
-const char *
-lldb_private::GetSectionTypeAsCString(lldb::SectionType sect_type)
-{
- switch (sect_type)
- {
- case eSectionTypeInvalid:
- return "invalid";
- case eSectionTypeCode:
- return "code";
- case eSectionTypeContainer:
- return "container";
- case eSectionTypeData:
- return "data";
- case eSectionTypeDataCString:
- return "data-cstr";
- case eSectionTypeDataCStringPointers:
- return "data-cstr-ptr";
- case eSectionTypeDataSymbolAddress:
- return "data-symbol-addr";
- case eSectionTypeData4:
- return "data-4-byte";
- case eSectionTypeData8:
- return "data-8-byte";
- case eSectionTypeData16:
- return "data-16-byte";
- case eSectionTypeDataPointers:
- return "data-ptrs";
- case eSectionTypeDebug:
- return "debug";
- case eSectionTypeZeroFill:
- return "zero-fill";
- case eSectionTypeDataObjCMessageRefs:
- return "objc-message-refs";
- case eSectionTypeDataObjCCFStrings:
- return "objc-cfstrings";
- case eSectionTypeDWARFDebugAbbrev:
- return "dwarf-abbrev";
- case eSectionTypeDWARFDebugAddr:
- return "dwarf-addr";
- case eSectionTypeDWARFDebugAranges:
- return "dwarf-aranges";
- case eSectionTypeDWARFDebugFrame:
- return "dwarf-frame";
- case eSectionTypeDWARFDebugInfo:
- return "dwarf-info";
- case eSectionTypeDWARFDebugLine:
- return "dwarf-line";
- case eSectionTypeDWARFDebugLoc:
- return "dwarf-loc";
- case eSectionTypeDWARFDebugMacInfo:
- return "dwarf-macinfo";
- case eSectionTypeDWARFDebugMacro:
- return "dwarf-macro";
- case eSectionTypeDWARFDebugPubNames:
- return "dwarf-pubnames";
- case eSectionTypeDWARFDebugPubTypes:
- return "dwarf-pubtypes";
- case eSectionTypeDWARFDebugRanges:
- return "dwarf-ranges";
- case eSectionTypeDWARFDebugStr:
- return "dwarf-str";
- case eSectionTypeDWARFDebugStrOffsets:
- return "dwarf-str-offsets";
- case eSectionTypeELFSymbolTable:
- return "elf-symbol-table";
- case eSectionTypeELFDynamicSymbols:
- return "elf-dynamic-symbols";
- case eSectionTypeELFRelocationEntries:
- return "elf-relocation-entries";
- case eSectionTypeELFDynamicLinkInfo:
- return "elf-dynamic-link-info";
- case eSectionTypeDWARFAppleNames:
- return "apple-names";
- case eSectionTypeDWARFAppleTypes:
- return "apple-types";
- case eSectionTypeDWARFAppleNamespaces:
- return "apple-namespaces";
- case eSectionTypeDWARFAppleObjC:
- return "apple-objc";
- case eSectionTypeEHFrame:
- return "eh-frame";
- case eSectionTypeARMexidx:
- return "ARM.exidx";
- case eSectionTypeARMextab:
- return "ARM.extab";
- case eSectionTypeCompactUnwind:
- return "compact-unwind";
- case eSectionTypeGoSymtab:
- return "go-symtab";
- case eSectionTypeAbsoluteAddress:
- return "absolute";
- case eSectionTypeOther:
- return "regular";
- }
- return "unknown";
+const char *lldb_private::GetSectionTypeAsCString(lldb::SectionType sect_type) {
+ switch (sect_type) {
+ case eSectionTypeInvalid:
+ return "invalid";
+ case eSectionTypeCode:
+ return "code";
+ case eSectionTypeContainer:
+ return "container";
+ case eSectionTypeData:
+ return "data";
+ case eSectionTypeDataCString:
+ return "data-cstr";
+ case eSectionTypeDataCStringPointers:
+ return "data-cstr-ptr";
+ case eSectionTypeDataSymbolAddress:
+ return "data-symbol-addr";
+ case eSectionTypeData4:
+ return "data-4-byte";
+ case eSectionTypeData8:
+ return "data-8-byte";
+ case eSectionTypeData16:
+ return "data-16-byte";
+ case eSectionTypeDataPointers:
+ return "data-ptrs";
+ case eSectionTypeDebug:
+ return "debug";
+ case eSectionTypeZeroFill:
+ return "zero-fill";
+ case eSectionTypeDataObjCMessageRefs:
+ return "objc-message-refs";
+ case eSectionTypeDataObjCCFStrings:
+ return "objc-cfstrings";
+ case eSectionTypeDWARFDebugAbbrev:
+ return "dwarf-abbrev";
+ case eSectionTypeDWARFDebugAddr:
+ return "dwarf-addr";
+ case eSectionTypeDWARFDebugAranges:
+ return "dwarf-aranges";
+ case eSectionTypeDWARFDebugFrame:
+ return "dwarf-frame";
+ case eSectionTypeDWARFDebugInfo:
+ return "dwarf-info";
+ case eSectionTypeDWARFDebugLine:
+ return "dwarf-line";
+ case eSectionTypeDWARFDebugLoc:
+ return "dwarf-loc";
+ case eSectionTypeDWARFDebugMacInfo:
+ return "dwarf-macinfo";
+ case eSectionTypeDWARFDebugMacro:
+ return "dwarf-macro";
+ case eSectionTypeDWARFDebugPubNames:
+ return "dwarf-pubnames";
+ case eSectionTypeDWARFDebugPubTypes:
+ return "dwarf-pubtypes";
+ case eSectionTypeDWARFDebugRanges:
+ return "dwarf-ranges";
+ case eSectionTypeDWARFDebugStr:
+ return "dwarf-str";
+ case eSectionTypeDWARFDebugStrOffsets:
+ return "dwarf-str-offsets";
+ case eSectionTypeELFSymbolTable:
+ return "elf-symbol-table";
+ case eSectionTypeELFDynamicSymbols:
+ return "elf-dynamic-symbols";
+ case eSectionTypeELFRelocationEntries:
+ return "elf-relocation-entries";
+ case eSectionTypeELFDynamicLinkInfo:
+ return "elf-dynamic-link-info";
+ case eSectionTypeDWARFAppleNames:
+ return "apple-names";
+ case eSectionTypeDWARFAppleTypes:
+ return "apple-types";
+ case eSectionTypeDWARFAppleNamespaces:
+ return "apple-namespaces";
+ case eSectionTypeDWARFAppleObjC:
+ return "apple-objc";
+ case eSectionTypeEHFrame:
+ return "eh-frame";
+ case eSectionTypeARMexidx:
+ return "ARM.exidx";
+ case eSectionTypeARMextab:
+ return "ARM.extab";
+ case eSectionTypeCompactUnwind:
+ return "compact-unwind";
+ case eSectionTypeGoSymtab:
+ return "go-symtab";
+ case eSectionTypeAbsoluteAddress:
+ return "absolute";
+ case eSectionTypeOther:
+ return "regular";
+ }
+ return "unknown";
}
diff --git a/source/Utility/JSON.cpp b/source/Utility/JSON.cpp
index 7ad3232c564d8..5b809c5d2e1df 100644
--- a/source/Utility/JSON.cpp
+++ b/source/Utility/JSON.cpp
@@ -9,685 +9,542 @@
#include "lldb/Utility/JSON.h"
-#include <limits.h>
#include "lldb/Core/StreamString.h"
#include "lldb/Host/StringConvert.h"
#include "llvm/Support/ErrorHandling.h"
+#include <limits.h>
using namespace lldb_private;
-std::string
-JSONString::json_string_quote_metachars (const std::string &s)
-{
- if (s.find('"') == std::string::npos)
- return s;
-
- std::string output;
- const size_t s_size = s.size();
- const char *s_chars = s.c_str();
- for (size_t i = 0; i < s_size; i++)
- {
- unsigned char ch = *(s_chars + i);
- if (ch == '"')
- {
- output.push_back ('\\');
- }
- output.push_back (ch);
+std::string JSONString::json_string_quote_metachars(const std::string &s) {
+ if (s.find('"') == std::string::npos)
+ return s;
+
+ std::string output;
+ const size_t s_size = s.size();
+ const char *s_chars = s.c_str();
+ for (size_t i = 0; i < s_size; i++) {
+ unsigned char ch = *(s_chars + i);
+ if (ch == '"') {
+ output.push_back('\\');
}
- return output;
+ output.push_back(ch);
+ }
+ return output;
}
-JSONString::JSONString () :
- JSONValue(JSONValue::Kind::String),
- m_data()
-{
-}
+JSONString::JSONString() : JSONValue(JSONValue::Kind::String), m_data() {}
-JSONString::JSONString (const char* s) :
- JSONValue(JSONValue::Kind::String),
- m_data(s ? s : "")
-{
-}
+JSONString::JSONString(const char *s)
+ : JSONValue(JSONValue::Kind::String), m_data(s ? s : "") {}
-JSONString::JSONString (const std::string& s) :
- JSONValue(JSONValue::Kind::String),
- m_data(s)
-{
-}
+JSONString::JSONString(const std::string &s)
+ : JSONValue(JSONValue::Kind::String), m_data(s) {}
-void
-JSONString::Write (Stream& s)
-{
- s.Printf("\"%s\"", json_string_quote_metachars(m_data).c_str());
+void JSONString::Write(Stream &s) {
+ s.Printf("\"%s\"", json_string_quote_metachars(m_data).c_str());
}
-uint64_t
-JSONNumber::GetAsUnsigned() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return m_data.m_unsigned;
- case DataType::Signed:
- return (uint64_t)m_data.m_signed;
- case DataType::Double:
- return (uint64_t)m_data.m_double;
- }
- llvm_unreachable("Unhandled data type");
+uint64_t JSONNumber::GetAsUnsigned() const {
+ switch (m_data_type) {
+ case DataType::Unsigned:
+ return m_data.m_unsigned;
+ case DataType::Signed:
+ return (uint64_t)m_data.m_signed;
+ case DataType::Double:
+ return (uint64_t)m_data.m_double;
+ }
+ llvm_unreachable("Unhandled data type");
}
-int64_t
-JSONNumber::GetAsSigned() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return (int64_t)m_data.m_unsigned;
- case DataType::Signed:
- return m_data.m_signed;
- case DataType::Double:
- return (int64_t)m_data.m_double;
- }
- llvm_unreachable("Unhandled data type");
+int64_t JSONNumber::GetAsSigned() const {
+ switch (m_data_type) {
+ case DataType::Unsigned:
+ return (int64_t)m_data.m_unsigned;
+ case DataType::Signed:
+ return m_data.m_signed;
+ case DataType::Double:
+ return (int64_t)m_data.m_double;
+ }
+ llvm_unreachable("Unhandled data type");
}
-double
-JSONNumber::GetAsDouble() const
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- return (double)m_data.m_unsigned;
- case DataType::Signed:
- return (double)m_data.m_signed;
- case DataType::Double:
- return m_data.m_double;
- }
- llvm_unreachable("Unhandled data type");
+double JSONNumber::GetAsDouble() const {
+ switch (m_data_type) {
+ case DataType::Unsigned:
+ return (double)m_data.m_unsigned;
+ case DataType::Signed:
+ return (double)m_data.m_signed;
+ case DataType::Double:
+ return m_data.m_double;
+ }
+ llvm_unreachable("Unhandled data type");
}
-void
-JSONNumber::Write (Stream& s)
-{
- switch (m_data_type)
- {
- case DataType::Unsigned:
- s.Printf("%" PRIu64, m_data.m_unsigned);
- break;
- case DataType::Signed:
- s.Printf("%" PRId64, m_data.m_signed);
- break;
- case DataType::Double:
- s.Printf("%g", m_data.m_double);
- break;
- }
+void JSONNumber::Write(Stream &s) {
+ switch (m_data_type) {
+ case DataType::Unsigned:
+ s.Printf("%" PRIu64, m_data.m_unsigned);
+ break;
+ case DataType::Signed:
+ s.Printf("%" PRId64, m_data.m_signed);
+ break;
+ case DataType::Double:
+ s.Printf("%g", m_data.m_double);
+ break;
+ }
}
-JSONTrue::JSONTrue () :
- JSONValue(JSONValue::Kind::True)
-{
-}
+JSONTrue::JSONTrue() : JSONValue(JSONValue::Kind::True) {}
-void
-JSONTrue::Write(Stream& s)
-{
- s.Printf("true");
-}
+void JSONTrue::Write(Stream &s) { s.Printf("true"); }
-JSONFalse::JSONFalse () :
- JSONValue(JSONValue::Kind::False)
-{
-}
+JSONFalse::JSONFalse() : JSONValue(JSONValue::Kind::False) {}
-void
-JSONFalse::Write(Stream& s)
-{
- s.Printf("false");
-}
+void JSONFalse::Write(Stream &s) { s.Printf("false"); }
-JSONNull::JSONNull () :
- JSONValue(JSONValue::Kind::Null)
-{
-}
+JSONNull::JSONNull() : JSONValue(JSONValue::Kind::Null) {}
-void
-JSONNull::Write(Stream& s)
-{
- s.Printf("null");
-}
+void JSONNull::Write(Stream &s) { s.Printf("null"); }
-JSONObject::JSONObject () :
- JSONValue(JSONValue::Kind::Object)
-{
-}
+JSONObject::JSONObject() : JSONValue(JSONValue::Kind::Object) {}
-void
-JSONObject::Write (Stream& s)
-{
- bool first = true;
- s.PutChar('{');
- auto iter = m_elements.begin(), end = m_elements.end();
- for (;iter != end; iter++)
- {
- if (first)
- first = false;
- else
- s.PutChar(',');
- JSONString key(iter->first);
- JSONValue::SP value(iter->second);
- key.Write(s);
- s.PutChar(':');
- value->Write(s);
- }
- s.PutChar('}');
+void JSONObject::Write(Stream &s) {
+ bool first = true;
+ s.PutChar('{');
+ auto iter = m_elements.begin(), end = m_elements.end();
+ for (; iter != end; iter++) {
+ if (first)
+ first = false;
+ else
+ s.PutChar(',');
+ JSONString key(iter->first);
+ JSONValue::SP value(iter->second);
+ key.Write(s);
+ s.PutChar(':');
+ value->Write(s);
+ }
+ s.PutChar('}');
}
-bool
-JSONObject::SetObject (const std::string& key,
- JSONValue::SP value)
-{
- if (key.empty() || nullptr == value.get())
- return false;
- m_elements[key] = value;
- return true;
+bool JSONObject::SetObject(const std::string &key, JSONValue::SP value) {
+ if (key.empty() || nullptr == value.get())
+ return false;
+ m_elements[key] = value;
+ return true;
}
-JSONValue::SP
-JSONObject::GetObject (const std::string& key)
-{
- auto iter = m_elements.find(key), end = m_elements.end();
- if (iter == end)
- return JSONValue::SP();
- return iter->second;
+JSONValue::SP JSONObject::GetObject(const std::string &key) {
+ auto iter = m_elements.find(key), end = m_elements.end();
+ if (iter == end)
+ return JSONValue::SP();
+ return iter->second;
}
-JSONArray::JSONArray () :
- JSONValue(JSONValue::Kind::Array)
-{
+JSONArray::JSONArray() : JSONValue(JSONValue::Kind::Array) {}
+
+void JSONArray::Write(Stream &s) {
+ bool first = true;
+ s.PutChar('[');
+ auto iter = m_elements.begin(), end = m_elements.end();
+ for (; iter != end; iter++) {
+ if (first)
+ first = false;
+ else
+ s.PutChar(',');
+ (*iter)->Write(s);
+ }
+ s.PutChar(']');
}
-void
-JSONArray::Write (Stream& s)
-{
- bool first = true;
- s.PutChar('[');
- auto iter = m_elements.begin(), end = m_elements.end();
- for (;iter != end; iter++)
- {
- if (first)
- first = false;
- else
- s.PutChar(',');
- (*iter)->Write(s);
- }
- s.PutChar(']');
-}
-
-bool
-JSONArray::SetObject (Index i,
- JSONValue::SP value)
-{
- if (value.get() == nullptr)
- return false;
- if (i < m_elements.size())
- {
- m_elements[i] = value;
- return true;
- }
- if (i == m_elements.size())
- {
- m_elements.push_back(value);
- return true;
- }
+bool JSONArray::SetObject(Index i, JSONValue::SP value) {
+ if (value.get() == nullptr)
return false;
-}
-
-bool
-JSONArray::AppendObject (JSONValue::SP value)
-{
- if (value.get() == nullptr)
- return false;
+ if (i < m_elements.size()) {
+ m_elements[i] = value;
+ return true;
+ }
+ if (i == m_elements.size()) {
m_elements.push_back(value);
return true;
+ }
+ return false;
}
-JSONValue::SP
-JSONArray::GetObject (Index i)
-{
- if (i < m_elements.size())
- return m_elements[i];
- return JSONValue::SP();
+bool JSONArray::AppendObject(JSONValue::SP value) {
+ if (value.get() == nullptr)
+ return false;
+ m_elements.push_back(value);
+ return true;
}
-JSONArray::Size
-JSONArray::GetNumElements ()
-{
- return m_elements.size();
+JSONValue::SP JSONArray::GetObject(Index i) {
+ if (i < m_elements.size())
+ return m_elements[i];
+ return JSONValue::SP();
}
+JSONArray::Size JSONArray::GetNumElements() { return m_elements.size(); }
+
+JSONParser::JSONParser(const char *cstr) : StringExtractor(cstr) {}
+
+JSONParser::Token JSONParser::GetToken(std::string &value) {
+ StreamString error;
+
+ value.clear();
+ SkipSpaces();
+ const uint64_t start_index = m_index;
+ const char ch = GetChar();
+ switch (ch) {
+ case '{':
+ return Token::ObjectStart;
+ case '}':
+ return Token::ObjectEnd;
+ case '[':
+ return Token::ArrayStart;
+ case ']':
+ return Token::ArrayEnd;
+ case ',':
+ return Token::Comma;
+ case ':':
+ return Token::Colon;
+ case '\0':
+ return Token::EndOfFile;
+ case 't':
+ if (GetChar() == 'r')
+ if (GetChar() == 'u')
+ if (GetChar() == 'e')
+ return Token::True;
+ break;
+
+ case 'f':
+ if (GetChar() == 'a')
+ if (GetChar() == 'l')
+ if (GetChar() == 's')
+ if (GetChar() == 'e')
+ return Token::False;
+ break;
+
+ case 'n':
+ if (GetChar() == 'u')
+ if (GetChar() == 'l')
+ if (GetChar() == 'l')
+ return Token::Null;
+ break;
+
+ case '"': {
+ while (1) {
+ bool was_escaped = false;
+ int escaped_ch = GetEscapedChar(was_escaped);
+ if (escaped_ch == -1) {
+ error.Printf(
+ "error: an error occurred getting a character from offset %" PRIu64,
+ start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
+
+ } else {
+ const bool is_end_quote = escaped_ch == '"';
+ const bool is_null = escaped_ch == 0;
+ if (was_escaped || (!is_end_quote && !is_null)) {
+ if (CHAR_MIN <= escaped_ch && escaped_ch <= CHAR_MAX) {
+ value.append(1, (char)escaped_ch);
+ } else {
+ error.Printf("error: wide character support is needed for unicode "
+ "character 0x%4.4x at offset %" PRIu64,
+ escaped_ch, start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
+ }
+ } else if (is_end_quote) {
+ return Token::String;
+ } else if (is_null) {
+ value = "error: missing end quote for string";
+ return Token::Error;
+ }
+ }
+ }
+ } break;
+
+ case '-':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9': {
+ bool done = false;
+ bool got_decimal_point = false;
+ uint64_t exp_index = 0;
+ bool got_int_digits = (ch >= '0') && (ch <= '9');
+ bool got_frac_digits = false;
+ bool got_exp_digits = false;
+ while (!done) {
+ const char next_ch = PeekChar();
+ switch (next_ch) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (exp_index != 0) {
+ got_exp_digits = true;
+ } else if (got_decimal_point) {
+ got_frac_digits = true;
+ } else {
+ got_int_digits = true;
+ }
+ ++m_index; // Skip this character
+ break;
+
+ case '.':
+ if (got_decimal_point) {
+ error.Printf("error: extra decimal point found at offset %" PRIu64,
+ start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
+ } else {
+ got_decimal_point = true;
+ ++m_index; // Skip this character
+ }
+ break;
+
+ case 'e':
+ case 'E':
+ if (exp_index != 0) {
+ error.Printf(
+ "error: extra exponent character found at offset %" PRIu64,
+ start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
+ } else {
+ exp_index = m_index;
+ ++m_index; // Skip this character
+ }
+ break;
+
+ case '+':
+ case '-':
+ // The '+' and '-' can only come after an exponent character...
+ if (exp_index == m_index - 1) {
+ ++m_index; // Skip the exponent sign character
+ } else {
+ error.Printf("error: unexpected %c character at offset %" PRIu64,
+ next_ch, start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
+ }
+ break;
-JSONParser::JSONParser (const char *cstr) :
- StringExtractor(cstr)
-{
-}
-
-JSONParser::Token
-JSONParser::GetToken (std::string &value)
-{
- StreamString error;
-
- value.clear();
- SkipSpaces ();
- const uint64_t start_index = m_index;
- const char ch = GetChar();
- switch (ch)
- {
- case '{': return Token::ObjectStart;
- case '}': return Token::ObjectEnd;
- case '[': return Token::ArrayStart;
- case ']': return Token::ArrayEnd;
- case ',': return Token::Comma;
- case ':': return Token::Colon;
- case '\0': return Token::EndOfFile;
- case 't':
- if (GetChar() == 'r')
- if (GetChar() == 'u')
- if (GetChar() == 'e')
- return Token::True;
- break;
-
- case 'f':
- if (GetChar() == 'a')
- if (GetChar() == 'l')
- if (GetChar() == 's')
- if (GetChar() == 'e')
- return Token::False;
- break;
-
- case 'n':
- if (GetChar() == 'u')
- if (GetChar() == 'l')
- if (GetChar() == 'l')
- return Token::Null;
- break;
-
- case '"':
- {
- while (1)
- {
- bool was_escaped = false;
- int escaped_ch = GetEscapedChar(was_escaped);
- if (escaped_ch == -1)
- {
- error.Printf("error: an error occurred getting a character from offset %" PRIu64, start_index);
- value = std::move(error.GetString());
- return Token::Error;
-
- }
- else
- {
- const bool is_end_quote = escaped_ch == '"';
- const bool is_null = escaped_ch == 0;
- if (was_escaped || (!is_end_quote && !is_null))
- {
- if (CHAR_MIN <= escaped_ch && escaped_ch <= CHAR_MAX)
- {
- value.append(1, (char)escaped_ch);
- }
- else
- {
- error.Printf("error: wide character support is needed for unicode character 0x%4.4x at offset %" PRIu64, escaped_ch, start_index);
- value = std::move(error.GetString());
- return Token::Error;
- }
- }
- else if (is_end_quote)
- {
- return Token::String;
- }
- else if (is_null)
- {
- value = "error: missing end quote for string";
- return Token::Error;
- }
- }
- }
- }
- break;
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- bool done = false;
- bool got_decimal_point = false;
- uint64_t exp_index = 0;
- bool got_int_digits = (ch >= '0') && (ch <= '9');
- bool got_frac_digits = false;
- bool got_exp_digits = false;
- while (!done)
- {
- const char next_ch = PeekChar();
- switch (next_ch)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (exp_index != 0)
- {
- got_exp_digits = true;
- }
- else if (got_decimal_point)
- {
- got_frac_digits = true;
- }
- else
- {
- got_int_digits = true;
- }
- ++m_index; // Skip this character
- break;
-
- case '.':
- if (got_decimal_point)
- {
- error.Printf("error: extra decimal point found at offset %" PRIu64, start_index);
- value = std::move(error.GetString());
- return Token::Error;
- }
- else
- {
- got_decimal_point = true;
- ++m_index; // Skip this character
- }
- break;
-
- case 'e':
- case 'E':
- if (exp_index != 0)
- {
- error.Printf("error: extra exponent character found at offset %" PRIu64, start_index);
- value = std::move(error.GetString());
- return Token::Error;
- }
- else
- {
- exp_index = m_index;
- ++m_index; // Skip this character
- }
- break;
-
- case '+':
- case '-':
- // The '+' and '-' can only come after an exponent character...
- if (exp_index == m_index - 1)
- {
- ++m_index; // Skip the exponent sign character
- }
- else
- {
- error.Printf("error: unexpected %c character at offset %" PRIu64, next_ch, start_index);
- value = std::move(error.GetString());
- return Token::Error;
- }
- break;
-
- default:
- done = true;
- break;
- }
- }
-
- if (m_index > start_index)
- {
- value = m_packet.substr(start_index, m_index - start_index);
- if (got_decimal_point)
- {
- if (exp_index != 0)
- {
- // We have an exponent, make sure we got exponent digits
- if (got_exp_digits)
- {
- return Token::Float;
- }
- else
- {
- error.Printf("error: got exponent character but no exponent digits at offset in float value \"%s\"", value.c_str());
- value = std::move(error.GetString());
- return Token::Error;
- }
- }
- else
- {
- // No exponent, but we need at least one decimal after the decimal point
- if (got_frac_digits)
- {
- return Token::Float;
- }
- else
- {
- error.Printf("error: no digits after decimal point \"%s\"", value.c_str());
- value = std::move(error.GetString());
- return Token::Error;
- }
- }
- }
- else
- {
- // No decimal point
- if (got_int_digits)
- {
- // We need at least some integer digits to make an integer
- return Token::Integer;
- }
- else
- {
- error.Printf("error: no digits negate sign \"%s\"", value.c_str());
- value = std::move(error.GetString());
- return Token::Error;
- }
- }
- }
- else
- {
- error.Printf("error: invalid number found at offset %" PRIu64, start_index);
- value = std::move(error.GetString());
- return Token::Error;
- }
- }
- break;
- default:
- break;
+ default:
+ done = true;
+ break;
+ }
}
- error.Printf("error: failed to parse token at offset %" PRIu64 " (around character '%c')", start_index, ch);
- value = std::move(error.GetString());
- return Token::Error;
-}
-int
-JSONParser::GetEscapedChar(bool &was_escaped)
-{
- was_escaped = false;
- const char ch = GetChar();
- if (ch == '\\')
- {
- was_escaped = true;
- const char ch2 = GetChar();
- switch (ch2)
- {
- case '"':
- case '\\':
- case '/':
- default:
- break;
-
- case 'b': return '\b';
- case 'f': return '\f';
- case 'n': return '\n';
- case 'r': return '\r';
- case 't': return '\t';
- case 'u':
- {
- const int hi_byte = DecodeHexU8();
- const int lo_byte = DecodeHexU8();
- if (hi_byte >=0 && lo_byte >= 0)
- return hi_byte << 8 | lo_byte;
- return -1;
- }
- break;
+ if (m_index > start_index) {
+ value = m_packet.substr(start_index, m_index - start_index);
+ if (got_decimal_point) {
+ if (exp_index != 0) {
+ // We have an exponent, make sure we got exponent digits
+ if (got_exp_digits) {
+ return Token::Float;
+ } else {
+ error.Printf("error: got exponent character but no exponent digits "
+ "at offset in float value \"%s\"",
+ value.c_str());
+ value = std::move(error.GetString());
+ return Token::Error;
+ }
+ } else {
+ // No exponent, but we need at least one decimal after the decimal
+ // point
+ if (got_frac_digits) {
+ return Token::Float;
+ } else {
+ error.Printf("error: no digits after decimal point \"%s\"",
+ value.c_str());
+ value = std::move(error.GetString());
+ return Token::Error;
+ }
+ }
+ } else {
+ // No decimal point
+ if (got_int_digits) {
+ // We need at least some integer digits to make an integer
+ return Token::Integer;
+ } else {
+ error.Printf("error: no digits negate sign \"%s\"", value.c_str());
+ value = std::move(error.GetString());
+ return Token::Error;
}
- return ch2;
+ }
+ } else {
+ error.Printf("error: invalid number found at offset %" PRIu64,
+ start_index);
+ value = std::move(error.GetString());
+ return Token::Error;
}
- return ch;
+ } break;
+ default:
+ break;
+ }
+ error.Printf("error: failed to parse token at offset %" PRIu64
+ " (around character '%c')",
+ start_index, ch);
+ value = std::move(error.GetString());
+ return Token::Error;
}
-JSONValue::SP
-JSONParser::ParseJSONObject ()
-{
- // The "JSONParser::Token::ObjectStart" token should have already been consumed
- // by the time this function is called
- std::unique_ptr<JSONObject> dict_up(new JSONObject());
-
- std::string value;
- std::string key;
- while (1)
- {
- JSONParser::Token token = GetToken(value);
-
- if (token == JSONParser::Token::String)
- {
- key.swap(value);
- token = GetToken(value);
- if (token == JSONParser::Token::Colon)
- {
- JSONValue::SP value_sp = ParseJSONValue();
- if (value_sp)
- dict_up->SetObject(key, value_sp);
- else
- break;
- }
- }
- else if (token == JSONParser::Token::ObjectEnd)
- {
- return JSONValue::SP(dict_up.release());
- }
- else if (token == JSONParser::Token::Comma)
- {
- continue;
- }
- else
- {
- break;
- }
+int JSONParser::GetEscapedChar(bool &was_escaped) {
+ was_escaped = false;
+ const char ch = GetChar();
+ if (ch == '\\') {
+ was_escaped = true;
+ const char ch2 = GetChar();
+ switch (ch2) {
+ case '"':
+ case '\\':
+ case '/':
+ default:
+ break;
+
+ case 'b':
+ return '\b';
+ case 'f':
+ return '\f';
+ case 'n':
+ return '\n';
+ case 'r':
+ return '\r';
+ case 't':
+ return '\t';
+ case 'u': {
+ const int hi_byte = DecodeHexU8();
+ const int lo_byte = DecodeHexU8();
+ if (hi_byte >= 0 && lo_byte >= 0)
+ return hi_byte << 8 | lo_byte;
+ return -1;
+ } break;
}
- return JSONValue::SP();
+ return ch2;
+ }
+ return ch;
}
-JSONValue::SP
-JSONParser::ParseJSONArray ()
-{
- // The "JSONParser::Token::ObjectStart" token should have already been consumed
- // by the time this function is called
- std::unique_ptr<JSONArray> array_up(new JSONArray());
-
- std::string value;
- std::string key;
- while (1)
- {
+JSONValue::SP JSONParser::ParseJSONObject() {
+ // The "JSONParser::Token::ObjectStart" token should have already been
+ // consumed
+ // by the time this function is called
+ std::unique_ptr<JSONObject> dict_up(new JSONObject());
+
+ std::string value;
+ std::string key;
+ while (1) {
+ JSONParser::Token token = GetToken(value);
+
+ if (token == JSONParser::Token::String) {
+ key.swap(value);
+ token = GetToken(value);
+ if (token == JSONParser::Token::Colon) {
JSONValue::SP value_sp = ParseJSONValue();
if (value_sp)
- array_up->AppendObject(value_sp);
+ dict_up->SetObject(key, value_sp);
else
- break;
+ break;
+ }
+ } else if (token == JSONParser::Token::ObjectEnd) {
+ return JSONValue::SP(dict_up.release());
+ } else if (token == JSONParser::Token::Comma) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ return JSONValue::SP();
+}
- JSONParser::Token token = GetToken(value);
- if (token == JSONParser::Token::Comma)
- {
- continue;
- }
- else if (token == JSONParser::Token::ArrayEnd)
- {
- return JSONValue::SP(array_up.release());
- }
- else
- {
- break;
- }
+JSONValue::SP JSONParser::ParseJSONArray() {
+ // The "JSONParser::Token::ObjectStart" token should have already been
+ // consumed
+ // by the time this function is called
+ std::unique_ptr<JSONArray> array_up(new JSONArray());
+
+ std::string value;
+ std::string key;
+ while (1) {
+ JSONValue::SP value_sp = ParseJSONValue();
+ if (value_sp)
+ array_up->AppendObject(value_sp);
+ else
+ break;
+
+ JSONParser::Token token = GetToken(value);
+ if (token == JSONParser::Token::Comma) {
+ continue;
+ } else if (token == JSONParser::Token::ArrayEnd) {
+ return JSONValue::SP(array_up.release());
+ } else {
+ break;
}
- return JSONValue::SP();
+ }
+ return JSONValue::SP();
}
-JSONValue::SP
-JSONParser::ParseJSONValue ()
-{
- std::string value;
- const JSONParser::Token token = GetToken(value);
- switch (token)
- {
- case JSONParser::Token::ObjectStart:
- return ParseJSONObject();
-
- case JSONParser::Token::ArrayStart:
- return ParseJSONArray();
-
- case JSONParser::Token::Integer:
- {
- if (value.front() == '-')
- {
- bool success = false;
- int64_t sval = StringConvert::ToSInt64(value.c_str(), 0, 0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(sval));
- }
- else
- {
- bool success = false;
- uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(uval));
- }
- }
- break;
-
- case JSONParser::Token::Float:
- {
- bool success = false;
- double val = StringConvert::ToDouble(value.c_str(), 0.0, &success);
- if (success)
- return JSONValue::SP(new JSONNumber(val));
- }
- break;
+JSONValue::SP JSONParser::ParseJSONValue() {
+ std::string value;
+ const JSONParser::Token token = GetToken(value);
+ switch (token) {
+ case JSONParser::Token::ObjectStart:
+ return ParseJSONObject();
+
+ case JSONParser::Token::ArrayStart:
+ return ParseJSONArray();
+
+ case JSONParser::Token::Integer: {
+ if (value.front() == '-') {
+ bool success = false;
+ int64_t sval = StringConvert::ToSInt64(value.c_str(), 0, 0, &success);
+ if (success)
+ return JSONValue::SP(new JSONNumber(sval));
+ } else {
+ bool success = false;
+ uint64_t uval = StringConvert::ToUInt64(value.c_str(), 0, 0, &success);
+ if (success)
+ return JSONValue::SP(new JSONNumber(uval));
+ }
+ } break;
- case JSONParser::Token::String:
- return JSONValue::SP(new JSONString(value));
+ case JSONParser::Token::Float: {
+ bool success = false;
+ double val = StringConvert::ToDouble(value.c_str(), 0.0, &success);
+ if (success)
+ return JSONValue::SP(new JSONNumber(val));
+ } break;
- case JSONParser::Token::True:
- return JSONValue::SP(new JSONTrue());
+ case JSONParser::Token::String:
+ return JSONValue::SP(new JSONString(value));
- case JSONParser::Token::False:
- return JSONValue::SP(new JSONFalse());
+ case JSONParser::Token::True:
+ return JSONValue::SP(new JSONTrue());
- case JSONParser::Token::Null:
- return JSONValue::SP(new JSONNull());
+ case JSONParser::Token::False:
+ return JSONValue::SP(new JSONFalse());
- default:
- break;
- }
- return JSONValue::SP();
-
+ case JSONParser::Token::Null:
+ return JSONValue::SP(new JSONNull());
+
+ default:
+ break;
+ }
+ return JSONValue::SP();
}
diff --git a/source/Utility/KQueue.cpp b/source/Utility/KQueue.cpp
deleted file mode 100644
index c0aace4489519..0000000000000
--- a/source/Utility/KQueue.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-//===--------------------- KQueue.cpp ---------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "KQueue.h"
-
-#ifdef LLDB_USE_KQUEUES
-
-#include "lldb/Core/Error.h"
-
-#include "Utility/TimeSpecTimeout.h"
-
-using namespace lldb_private;
-
-int
-KQueue::GetFD (bool can_create)
-{
- if (!IsValid () && can_create)
- m_fd = kqueue();
- return m_fd;
-}
-
-int
-KQueue::Close ()
-{
- const int fd = m_fd;
- if (fd >= 0)
- {
- m_fd = -1;
- return close(fd);
- }
- return 0;
-}
-
-int
-KQueue::WaitForEvents (struct kevent *events, int num_events, Error &error, uint32_t timeout_usec)
-{
- const int fd_kqueue = GetFD(false);
- if (fd_kqueue >= 0)
- {
- TimeSpecTimeout timeout;
- const struct timespec *timeout_ptr = timeout.SetRelativeTimeoutMircoSeconds32 (timeout_usec);
- int result = ::kevent(fd_kqueue, NULL, 0, events, num_events, timeout_ptr);
- if (result == -1)
- error.SetErrorToErrno();
- else
- error.Clear();
- return result;
- }
- else
- {
- error.SetErrorString("invalid kqueue fd");
- }
- return 0;
-}
-
-bool
-KQueue::AddFDEvent (int fd, bool read, bool write, bool vnode)
-{
- const int fd_kqueue = GetFD(true);
- if (fd_kqueue >= 0)
- {
- struct kevent event;
- event.ident = fd;
- event.filter = 0;
- if (read)
- event.filter |= EVFILT_READ;
- if (write)
- event.filter |= EVFILT_WRITE;
- if (vnode)
- event.filter |= EVFILT_VNODE;
- event.flags = EV_ADD | EV_CLEAR;
- event.fflags = 0;
- event.data = 0;
- event.udata = NULL;
- int err = ::kevent(fd_kqueue, &event, 1, NULL, 0, NULL);
- return err == 0;
- }
- return false;
-}
-
-#endif
diff --git a/source/Utility/KQueue.h b/source/Utility/KQueue.h
deleted file mode 100644
index c5680aaa6314e..0000000000000
--- a/source/Utility/KQueue.h
+++ /dev/null
@@ -1,72 +0,0 @@
-//===--------------------- KQueue.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_KQueue_h_
-#define utility_KQueue_h_
-
-#if defined(__APPLE__)
-#define LLDB_USE_KQUEUES
-#endif
-
-#ifdef LLDB_USE_KQUEUES
-
-#include <sys/types.h>
-#include <sys/event.h>
-#include <sys/time.h>
-
-#include "lldb/lldb-defines.h"
-
-namespace lldb_private {
-
-class KQueue
-{
-public:
- KQueue() :
- m_fd(-1)
- {
- }
-
- ~KQueue()
- {
- Close();
- }
-
- bool
- IsValid () const
- {
- return m_fd >= 0;
- }
-
- int
- GetFD (bool can_create);
-
- int
- Close ();
-
- bool
- AddFDEvent (int fd,
- bool read,
- bool write,
- bool vnode);
-
- int
- WaitForEvents (struct kevent *events,
- int num_events,
- Error &error,
- uint32_t timeout_usec = UINT32_MAX); // UINT32_MAX means infinite timeout
-
-protected:
- int m_fd; // The kqueue fd
-};
-
-} // namespace lldb_private
-
-#endif // #ifdef LLDB_USE_KQUEUES
-
-#endif // #ifndef utility_KQueue_h_
diff --git a/source/Utility/LLDBAssert.cpp b/source/Utility/LLDBAssert.cpp
index 68aa872c83cfd..6f35dcd32f4a0 100644
--- a/source/Utility/LLDBAssert.cpp
+++ b/source/Utility/LLDBAssert.cpp
@@ -1,4 +1,5 @@
-//===--------------------- LLDBAssert.cpp --------------------------*- C++ -*-===//
+//===--------------------- LLDBAssert.cpp --------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -10,27 +11,23 @@
#include "lldb/Utility/LLDBAssert.h"
#include "llvm/Support/Format.h"
-#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Signals.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
using namespace lldb_private;
-void
-lldb_private::lldb_assert (bool expression,
- const char* expr_text,
- const char* func,
- const char* file,
- unsigned int line)
-{
- if (expression)
- ;
- else
- {
- errs() << format("Assertion failed: (%s), function %s, file %s, line %u\n",
- expr_text, func, file, line);
- errs() << "backtrace leading to the failure:\n";
- llvm::sys::PrintStackTrace(errs());
- errs() << "please file a bug report against lldb reporting this failure log, and as many details as possible\n";
- }
+void lldb_private::lldb_assert(bool expression, const char *expr_text,
+ const char *func, const char *file,
+ unsigned int line) {
+ if (expression)
+ ;
+ else {
+ errs() << format("Assertion failed: (%s), function %s, file %s, line %u\n",
+ expr_text, func, file, line);
+ errs() << "backtrace leading to the failure:\n";
+ llvm::sys::PrintStackTrace(errs());
+ errs() << "please file a bug report against lldb reporting this failure "
+ "log, and as many details as possible\n";
+ }
}
diff --git a/source/Utility/ModuleCache.cpp b/source/Utility/ModuleCache.cpp
index 92520f768b3f3..889cd8f946672 100644
--- a/source/Utility/ModuleCache.cpp
+++ b/source/Utility/ModuleCache.cpp
@@ -28,311 +28,309 @@ using namespace lldb_private;
namespace {
-const char* kModulesSubdir = ".cache";
-const char* kLockDirName = ".lock";
-const char* kTempFileName = ".temp";
-const char* kTempSymFileName = ".symtemp";
-const char* kSymFileExtension = ".sym";
-const char* kFSIllegalChars = "\\/:*?\"<>|";
-
-std::string
-GetEscapedHostname(const char* hostname)
-{
- std::string result(hostname);
- size_t size = result.size();
- for (size_t i = 0; i < size; ++i)
- {
- if ((result[i] >=1 && result[i] <= 31) ||
- strchr(kFSIllegalChars, result[i]) != nullptr)
- result[i] = '_';
- }
- return result;
+const char *kModulesSubdir = ".cache";
+const char *kLockDirName = ".lock";
+const char *kTempFileName = ".temp";
+const char *kTempSymFileName = ".symtemp";
+const char *kSymFileExtension = ".sym";
+const char *kFSIllegalChars = "\\/:*?\"<>|";
+
+std::string GetEscapedHostname(const char *hostname) {
+ if (hostname == nullptr)
+ hostname = "unknown";
+ std::string result(hostname);
+ size_t size = result.size();
+ for (size_t i = 0; i < size; ++i) {
+ if ((result[i] >= 1 && result[i] <= 31) ||
+ strchr(kFSIllegalChars, result[i]) != nullptr)
+ result[i] = '_';
+ }
+ return result;
}
-class ModuleLock
-{
+class ModuleLock {
private:
- File m_file;
- std::unique_ptr<lldb_private::LockFile> m_lock;
- FileSpec m_file_spec;
+ File m_file;
+ std::unique_ptr<lldb_private::LockFile> m_lock;
+ FileSpec m_file_spec;
public:
- ModuleLock (const FileSpec &root_dir_spec, const UUID &uuid, Error& error);
- void Delete ();
+ ModuleLock(const FileSpec &root_dir_spec, const UUID &uuid, Error &error);
+ void Delete();
};
-FileSpec
-JoinPath (const FileSpec &path1, const char* path2)
-{
- FileSpec result_spec (path1);
- result_spec.AppendPathComponent (path2);
- return result_spec;
+FileSpec JoinPath(const FileSpec &path1, const char *path2) {
+ FileSpec result_spec(path1);
+ result_spec.AppendPathComponent(path2);
+ return result_spec;
}
-Error
-MakeDirectory (const FileSpec &dir_path)
-{
- if (dir_path.Exists ())
- {
- if (!dir_path.IsDirectory ())
- return Error ("Invalid existing path");
+Error MakeDirectory(const FileSpec &dir_path) {
+ if (dir_path.Exists()) {
+ if (!dir_path.IsDirectory())
+ return Error("Invalid existing path");
- return Error ();
- }
+ return Error();
+ }
- return FileSystem::MakeDirectory(dir_path, eFilePermissionsDirectoryDefault);
+ return FileSystem::MakeDirectory(dir_path, eFilePermissionsDirectoryDefault);
}
-FileSpec
-GetModuleDirectory (const FileSpec &root_dir_spec, const UUID &uuid)
-{
- const auto modules_dir_spec = JoinPath (root_dir_spec, kModulesSubdir);
- return JoinPath (modules_dir_spec, uuid.GetAsString ().c_str ());
+FileSpec GetModuleDirectory(const FileSpec &root_dir_spec, const UUID &uuid) {
+ const auto modules_dir_spec = JoinPath(root_dir_spec, kModulesSubdir);
+ return JoinPath(modules_dir_spec, uuid.GetAsString().c_str());
}
-FileSpec
-GetSymbolFileSpec(const FileSpec& module_file_spec)
-{
- return FileSpec((module_file_spec.GetPath() + kSymFileExtension).c_str(), false);
+FileSpec GetSymbolFileSpec(const FileSpec &module_file_spec) {
+ return FileSpec(module_file_spec.GetPath() + kSymFileExtension, false);
}
-void
-DeleteExistingModule (const FileSpec &root_dir_spec, const FileSpec &sysroot_module_path_spec)
-{
- Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_MODULES));
- UUID module_uuid;
- {
- auto module_sp = std::make_shared<Module>(ModuleSpec (sysroot_module_path_spec));
- module_uuid = module_sp->GetUUID ();
- }
-
- if (!module_uuid.IsValid ())
- return;
-
- Error error;
- ModuleLock lock (root_dir_spec, module_uuid, error);
- if (error.Fail ())
- {
- if (log)
- log->Printf ("Failed to lock module %s: %s",
- module_uuid.GetAsString ().c_str (),
- error.AsCString ());
- }
-
- auto link_count = FileSystem::GetHardlinkCount (sysroot_module_path_spec);
- if (link_count == -1)
- return;
-
- if (link_count > 2) // module is referred by other hosts.
- return;
-
- const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_uuid);
- FileSystem::DeleteDirectory (module_spec_dir, true);
- lock.Delete();
+void DeleteExistingModule(const FileSpec &root_dir_spec,
+ const FileSpec &sysroot_module_path_spec) {
+ Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
+ UUID module_uuid;
+ {
+ auto module_sp =
+ std::make_shared<Module>(ModuleSpec(sysroot_module_path_spec));
+ module_uuid = module_sp->GetUUID();
+ }
+
+ if (!module_uuid.IsValid())
+ return;
+
+ Error error;
+ ModuleLock lock(root_dir_spec, module_uuid, error);
+ if (error.Fail()) {
+ if (log)
+ log->Printf("Failed to lock module %s: %s",
+ module_uuid.GetAsString().c_str(), error.AsCString());
+ }
+
+ auto link_count = FileSystem::GetHardlinkCount(sysroot_module_path_spec);
+ if (link_count == -1)
+ return;
+
+ if (link_count > 2) // module is referred by other hosts.
+ return;
+
+ const auto module_spec_dir = GetModuleDirectory(root_dir_spec, module_uuid);
+ FileSystem::DeleteDirectory(module_spec_dir, true);
+ lock.Delete();
}
-void
-DecrementRefExistingModule (const FileSpec &root_dir_spec, const FileSpec &sysroot_module_path_spec)
-{
- // Remove $platform/.cache/$uuid folder if nobody else references it.
- DeleteExistingModule (root_dir_spec, sysroot_module_path_spec);
+void DecrementRefExistingModule(const FileSpec &root_dir_spec,
+ const FileSpec &sysroot_module_path_spec) {
+ // Remove $platform/.cache/$uuid folder if nobody else references it.
+ DeleteExistingModule(root_dir_spec, sysroot_module_path_spec);
- // Remove sysroot link.
- FileSystem::Unlink (sysroot_module_path_spec);
+ // Remove sysroot link.
+ FileSystem::Unlink(sysroot_module_path_spec);
- FileSpec symfile_spec = GetSymbolFileSpec (sysroot_module_path_spec);
- if (symfile_spec.Exists ()) // delete module's symbol file if exists.
- FileSystem::Unlink (symfile_spec);
+ FileSpec symfile_spec = GetSymbolFileSpec(sysroot_module_path_spec);
+ if (symfile_spec.Exists()) // delete module's symbol file if exists.
+ FileSystem::Unlink(symfile_spec);
}
-Error
-CreateHostSysRootModuleLink (const FileSpec &root_dir_spec, const char *hostname,
- const FileSpec &platform_module_spec,
- const FileSpec &local_module_spec,
- bool delete_existing)
-{
- const auto sysroot_module_path_spec = JoinPath (
- JoinPath (root_dir_spec, hostname), platform_module_spec.GetPath ().c_str ());
- if (sysroot_module_path_spec.Exists())
- {
- if (!delete_existing)
- return Error ();
-
- DecrementRefExistingModule (root_dir_spec, sysroot_module_path_spec);
- }
-
- const auto error = MakeDirectory (FileSpec (sysroot_module_path_spec.GetDirectory ().AsCString (), false));
- if (error.Fail ())
- return error;
-
- return FileSystem::Hardlink(sysroot_module_path_spec, local_module_spec);
+Error CreateHostSysRootModuleLink(const FileSpec &root_dir_spec,
+ const char *hostname,
+ const FileSpec &platform_module_spec,
+ const FileSpec &local_module_spec,
+ bool delete_existing) {
+ const auto sysroot_module_path_spec =
+ JoinPath(JoinPath(root_dir_spec, hostname),
+ platform_module_spec.GetPath().c_str());
+ if (sysroot_module_path_spec.Exists()) {
+ if (!delete_existing)
+ return Error();
+
+ DecrementRefExistingModule(root_dir_spec, sysroot_module_path_spec);
+ }
+
+ const auto error = MakeDirectory(
+ FileSpec(sysroot_module_path_spec.GetDirectory().AsCString(), false));
+ if (error.Fail())
+ return error;
+
+ return FileSystem::Hardlink(sysroot_module_path_spec, local_module_spec);
}
-} // namespace
-
-ModuleLock::ModuleLock (const FileSpec &root_dir_spec, const UUID &uuid, Error& error)
-{
- const auto lock_dir_spec = JoinPath (root_dir_spec, kLockDirName);
- error = MakeDirectory (lock_dir_spec);
- if (error.Fail ())
- return;
-
- m_file_spec = JoinPath (lock_dir_spec, uuid.GetAsString ().c_str ());
- m_file.Open (m_file_spec.GetCString (),
- File::eOpenOptionWrite | File::eOpenOptionCanCreate | File::eOpenOptionCloseOnExec);
- if (!m_file)
- {
- error.SetErrorToErrno ();
- return;
- }
-
- m_lock.reset (new lldb_private::LockFile (m_file.GetDescriptor ()));
- error = m_lock->WriteLock (0, 1);
- if (error.Fail ())
- error.SetErrorStringWithFormat ("Failed to lock file: %s", error.AsCString ());
+} // namespace
+
+ModuleLock::ModuleLock(const FileSpec &root_dir_spec, const UUID &uuid,
+ Error &error) {
+ const auto lock_dir_spec = JoinPath(root_dir_spec, kLockDirName);
+ error = MakeDirectory(lock_dir_spec);
+ if (error.Fail())
+ return;
+
+ m_file_spec = JoinPath(lock_dir_spec, uuid.GetAsString().c_str());
+ m_file.Open(m_file_spec.GetCString(), File::eOpenOptionWrite |
+ File::eOpenOptionCanCreate |
+ File::eOpenOptionCloseOnExec);
+ if (!m_file) {
+ error.SetErrorToErrno();
+ return;
+ }
+
+ m_lock.reset(new lldb_private::LockFile(m_file.GetDescriptor()));
+ error = m_lock->WriteLock(0, 1);
+ if (error.Fail())
+ error.SetErrorStringWithFormat("Failed to lock file: %s",
+ error.AsCString());
}
-void ModuleLock::Delete ()
-{
- if (!m_file)
- return;
+void ModuleLock::Delete() {
+ if (!m_file)
+ return;
- m_file.Close ();
- FileSystem::Unlink (m_file_spec);
+ m_file.Close();
+ FileSystem::Unlink(m_file_spec);
}
/////////////////////////////////////////////////////////////////////////
-Error
-ModuleCache::Put (const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- const FileSpec &tmp_file,
- const FileSpec &target_file)
-{
- const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ());
- const auto module_file_path = JoinPath (module_spec_dir, target_file.GetFilename ().AsCString ());
-
- const auto tmp_file_path = tmp_file.GetPath ();
- const auto err_code = llvm::sys::fs::rename (tmp_file_path.c_str (), module_file_path.GetPath ().c_str ());
- if (err_code)
- return Error ("Failed to rename file %s to %s: %s",
- tmp_file_path.c_str (), module_file_path.GetPath ().c_str (), err_code.message ().c_str ());
-
- const auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, target_file, module_file_path, true);
- if (error.Fail ())
- return Error ("Failed to create link to %s: %s", module_file_path.GetPath ().c_str (), error.AsCString ());
- return Error ();
+Error ModuleCache::Put(const FileSpec &root_dir_spec, const char *hostname,
+ const ModuleSpec &module_spec, const FileSpec &tmp_file,
+ const FileSpec &target_file) {
+ const auto module_spec_dir =
+ GetModuleDirectory(root_dir_spec, module_spec.GetUUID());
+ const auto module_file_path =
+ JoinPath(module_spec_dir, target_file.GetFilename().AsCString());
+
+ const auto tmp_file_path = tmp_file.GetPath();
+ const auto err_code =
+ llvm::sys::fs::rename(tmp_file_path, module_file_path.GetPath());
+ if (err_code)
+ return Error("Failed to rename file %s to %s: %s", tmp_file_path.c_str(),
+ module_file_path.GetPath().c_str(),
+ err_code.message().c_str());
+
+ const auto error = CreateHostSysRootModuleLink(
+ root_dir_spec, hostname, target_file, module_file_path, true);
+ if (error.Fail())
+ return Error("Failed to create link to %s: %s",
+ module_file_path.GetPath().c_str(), error.AsCString());
+ return Error();
}
-Error
-ModuleCache::Get (const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- ModuleSP &cached_module_sp,
- bool *did_create_ptr)
-{
- const auto find_it = m_loaded_modules.find (module_spec.GetUUID ().GetAsString());
- if (find_it != m_loaded_modules.end ())
- {
- cached_module_sp = (*find_it).second.lock ();
- if (cached_module_sp)
- return Error ();
- m_loaded_modules.erase (find_it);
- }
-
- const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ());
- const auto module_file_path = JoinPath (module_spec_dir, module_spec.GetFileSpec ().GetFilename ().AsCString ());
-
- if (!module_file_path.Exists ())
- return Error ("Module %s not found", module_file_path.GetPath ().c_str ());
- if (module_file_path.GetByteSize () != module_spec.GetObjectSize ())
- return Error ("Module %s has invalid file size", module_file_path.GetPath ().c_str ());
-
- // We may have already cached module but downloaded from an another host - in this case let's create a link to it.
- auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname, module_spec.GetFileSpec(), module_file_path, false);
- if (error.Fail ())
- return Error ("Failed to create link to %s: %s", module_file_path.GetPath().c_str(), error.AsCString());
-
- auto cached_module_spec (module_spec);
- cached_module_spec.GetUUID ().Clear (); // Clear UUID since it may contain md5 content hash instead of real UUID.
- cached_module_spec.GetFileSpec () = module_file_path;
- cached_module_spec.GetPlatformFileSpec () = module_spec.GetFileSpec ();
-
- error = ModuleList::GetSharedModule(cached_module_spec,
- cached_module_sp,
- nullptr,
- nullptr,
- did_create_ptr,
- false);
- if (error.Fail())
- return error;
-
- FileSpec symfile_spec = GetSymbolFileSpec(cached_module_sp->GetFileSpec ());
- if (symfile_spec.Exists ())
- cached_module_sp->SetSymbolFileFileSpec (symfile_spec);
-
- m_loaded_modules.insert (std::make_pair (module_spec.GetUUID ().GetAsString (), cached_module_sp));
-
- return Error ();
+Error ModuleCache::Get(const FileSpec &root_dir_spec, const char *hostname,
+ const ModuleSpec &module_spec,
+ ModuleSP &cached_module_sp, bool *did_create_ptr) {
+ const auto find_it =
+ m_loaded_modules.find(module_spec.GetUUID().GetAsString());
+ if (find_it != m_loaded_modules.end()) {
+ cached_module_sp = (*find_it).second.lock();
+ if (cached_module_sp)
+ return Error();
+ m_loaded_modules.erase(find_it);
+ }
+
+ const auto module_spec_dir =
+ GetModuleDirectory(root_dir_spec, module_spec.GetUUID());
+ const auto module_file_path = JoinPath(
+ module_spec_dir, module_spec.GetFileSpec().GetFilename().AsCString());
+
+ if (!module_file_path.Exists())
+ return Error("Module %s not found", module_file_path.GetPath().c_str());
+ if (module_file_path.GetByteSize() != module_spec.GetObjectSize())
+ return Error("Module %s has invalid file size",
+ module_file_path.GetPath().c_str());
+
+ // We may have already cached module but downloaded from an another host - in
+ // this case let's create a link to it.
+ auto error = CreateHostSysRootModuleLink(root_dir_spec, hostname,
+ module_spec.GetFileSpec(),
+ module_file_path, false);
+ if (error.Fail())
+ return Error("Failed to create link to %s: %s",
+ module_file_path.GetPath().c_str(), error.AsCString());
+
+ auto cached_module_spec(module_spec);
+ cached_module_spec.GetUUID().Clear(); // Clear UUID since it may contain md5
+ // content hash instead of real UUID.
+ cached_module_spec.GetFileSpec() = module_file_path;
+ cached_module_spec.GetPlatformFileSpec() = module_spec.GetFileSpec();
+
+ error = ModuleList::GetSharedModule(cached_module_spec, cached_module_sp,
+ nullptr, nullptr, did_create_ptr, false);
+ if (error.Fail())
+ return error;
+
+ FileSpec symfile_spec = GetSymbolFileSpec(cached_module_sp->GetFileSpec());
+ if (symfile_spec.Exists())
+ cached_module_sp->SetSymbolFileFileSpec(symfile_spec);
+
+ m_loaded_modules.insert(
+ std::make_pair(module_spec.GetUUID().GetAsString(), cached_module_sp));
+
+ return Error();
}
-Error
-ModuleCache::GetAndPut (const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- const ModuleDownloader &module_downloader,
- const SymfileDownloader &symfile_downloader,
- lldb::ModuleSP &cached_module_sp,
- bool *did_create_ptr)
-{
- const auto module_spec_dir = GetModuleDirectory (root_dir_spec, module_spec.GetUUID ());
- auto error = MakeDirectory (module_spec_dir);
- if (error.Fail ())
- return error;
-
- ModuleLock lock (root_dir_spec, module_spec.GetUUID (), error);
- if (error.Fail ())
- return Error("Failed to lock module %s: %s", module_spec.GetUUID ().GetAsString().c_str(), error.AsCString ());
-
- const auto escaped_hostname(GetEscapedHostname(hostname));
- // Check local cache for a module.
- error = Get (root_dir_spec, escaped_hostname.c_str(), module_spec, cached_module_sp, did_create_ptr);
- if (error.Success ())
- return error;
-
- const auto tmp_download_file_spec = JoinPath (module_spec_dir, kTempFileName);
- error = module_downloader (module_spec, tmp_download_file_spec);
- llvm::FileRemover tmp_file_remover (tmp_download_file_spec.GetPath ().c_str ());
- if (error.Fail ())
- return Error("Failed to download module: %s", error.AsCString ());
-
- // Put downloaded file into local module cache.
- error = Put (root_dir_spec, escaped_hostname.c_str(), module_spec, tmp_download_file_spec, module_spec.GetFileSpec ());
- if (error.Fail ())
- return Error ("Failed to put module into cache: %s", error.AsCString ());
-
- tmp_file_remover.releaseFile ();
- error = Get (root_dir_spec, escaped_hostname.c_str(), module_spec, cached_module_sp, did_create_ptr);
- if (error.Fail ())
- return error;
-
- // Fetching a symbol file for the module
- const auto tmp_download_sym_file_spec = JoinPath (module_spec_dir, kTempSymFileName);
- error = symfile_downloader (cached_module_sp, tmp_download_sym_file_spec);
- llvm::FileRemover tmp_symfile_remover (tmp_download_sym_file_spec.GetPath ().c_str ());
- if (error.Fail ())
- // Failed to download a symfile but fetching the module was successful. The module might
- // contain the neccessary symbols and the debugging is also possible without a symfile.
- return Error ();
-
- error = Put (root_dir_spec, escaped_hostname.c_str(), module_spec, tmp_download_sym_file_spec, GetSymbolFileSpec(module_spec.GetFileSpec ()));
- if (error.Fail ())
- return Error ("Failed to put symbol file into cache: %s", error.AsCString ());
-
- tmp_symfile_remover.releaseFile();
-
- FileSpec symfile_spec = GetSymbolFileSpec (cached_module_sp->GetFileSpec ());
- cached_module_sp->SetSymbolFileFileSpec (symfile_spec);
- return Error ();
+Error ModuleCache::GetAndPut(const FileSpec &root_dir_spec,
+ const char *hostname,
+ const ModuleSpec &module_spec,
+ const ModuleDownloader &module_downloader,
+ const SymfileDownloader &symfile_downloader,
+ lldb::ModuleSP &cached_module_sp,
+ bool *did_create_ptr) {
+ const auto module_spec_dir =
+ GetModuleDirectory(root_dir_spec, module_spec.GetUUID());
+ auto error = MakeDirectory(module_spec_dir);
+ if (error.Fail())
+ return error;
+
+ ModuleLock lock(root_dir_spec, module_spec.GetUUID(), error);
+ if (error.Fail())
+ return Error("Failed to lock module %s: %s",
+ module_spec.GetUUID().GetAsString().c_str(),
+ error.AsCString());
+
+ const auto escaped_hostname(GetEscapedHostname(hostname));
+ // Check local cache for a module.
+ error = Get(root_dir_spec, escaped_hostname.c_str(), module_spec,
+ cached_module_sp, did_create_ptr);
+ if (error.Success())
+ return error;
+
+ const auto tmp_download_file_spec = JoinPath(module_spec_dir, kTempFileName);
+ error = module_downloader(module_spec, tmp_download_file_spec);
+ llvm::FileRemover tmp_file_remover(tmp_download_file_spec.GetPath());
+ if (error.Fail())
+ return Error("Failed to download module: %s", error.AsCString());
+
+ // Put downloaded file into local module cache.
+ error = Put(root_dir_spec, escaped_hostname.c_str(), module_spec,
+ tmp_download_file_spec, module_spec.GetFileSpec());
+ if (error.Fail())
+ return Error("Failed to put module into cache: %s", error.AsCString());
+
+ tmp_file_remover.releaseFile();
+ error = Get(root_dir_spec, escaped_hostname.c_str(), module_spec,
+ cached_module_sp, did_create_ptr);
+ if (error.Fail())
+ return error;
+
+ // Fetching a symbol file for the module
+ const auto tmp_download_sym_file_spec =
+ JoinPath(module_spec_dir, kTempSymFileName);
+ error = symfile_downloader(cached_module_sp, tmp_download_sym_file_spec);
+ llvm::FileRemover tmp_symfile_remover(tmp_download_sym_file_spec.GetPath());
+ if (error.Fail())
+ // Failed to download a symfile but fetching the module was successful. The
+ // module might
+ // contain the necessary symbols and the debugging is also possible without
+ // a symfile.
+ return Error();
+
+ error = Put(root_dir_spec, escaped_hostname.c_str(), module_spec,
+ tmp_download_sym_file_spec,
+ GetSymbolFileSpec(module_spec.GetFileSpec()));
+ if (error.Fail())
+ return Error("Failed to put symbol file into cache: %s", error.AsCString());
+
+ tmp_symfile_remover.releaseFile();
+
+ FileSpec symfile_spec = GetSymbolFileSpec(cached_module_sp->GetFileSpec());
+ cached_module_sp->SetSymbolFileFileSpec(symfile_spec);
+ return Error();
}
diff --git a/source/Utility/ModuleCache.h b/source/Utility/ModuleCache.h
index bb9b308304b66..6faa5ffb18162 100644
--- a/source/Utility/ModuleCache.h
+++ b/source/Utility/ModuleCache.h
@@ -10,8 +10,8 @@
#ifndef utility_ModuleCache_h_
#define utility_ModuleCache_h_
-#include "lldb/lldb-types.h"
#include "lldb/lldb-forward.h"
+#include "lldb/lldb-types.h"
#include "lldb/Core/Error.h"
#include "lldb/Host/File.h"
@@ -32,50 +32,45 @@ class UUID;
///
/// Caches locally modules that are downloaded from remote targets.
/// Each cached module maintains 2 views:
-/// - UUID view: /${CACHE_ROOT}/${PLATFORM_NAME}/.cache/${UUID}/${MODULE_FILENAME}
-/// - Sysroot view: /${CACHE_ROOT}/${PLATFORM_NAME}/${HOSTNAME}/${MODULE_FULL_FILEPATH}
+/// - UUID view:
+/// /${CACHE_ROOT}/${PLATFORM_NAME}/.cache/${UUID}/${MODULE_FILENAME}
+/// - Sysroot view:
+/// /${CACHE_ROOT}/${PLATFORM_NAME}/${HOSTNAME}/${MODULE_FULL_FILEPATH}
///
/// UUID views stores a real module file, whereas Sysroot view holds a symbolic
/// link to UUID-view file.
///
/// Example:
-/// UUID view : /tmp/lldb/remote-linux/.cache/30C94DC6-6A1F-E951-80C3-D68D2B89E576-D5AE213C/libc.so.6
+/// UUID view :
+/// /tmp/lldb/remote-linux/.cache/30C94DC6-6A1F-E951-80C3-D68D2B89E576-D5AE213C/libc.so.6
/// Sysroot view: /tmp/lldb/remote-linux/ubuntu/lib/x86_64-linux-gnu/libc.so.6
//----------------------------------------------------------------------
-class ModuleCache
-{
+class ModuleCache {
public:
- using ModuleDownloader = std::function<Error (const ModuleSpec&, const FileSpec&)>;
- using SymfileDownloader = std::function<Error (const lldb::ModuleSP&, const FileSpec&)>;
+ using ModuleDownloader =
+ std::function<Error(const ModuleSpec &, const FileSpec &)>;
+ using SymfileDownloader =
+ std::function<Error(const lldb::ModuleSP &, const FileSpec &)>;
- Error
- GetAndPut(const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- const ModuleDownloader &module_downloader,
- const SymfileDownloader &symfile_downloader,
- lldb::ModuleSP &cached_module_sp,
- bool *did_create_ptr);
+ Error GetAndPut(const FileSpec &root_dir_spec, const char *hostname,
+ const ModuleSpec &module_spec,
+ const ModuleDownloader &module_downloader,
+ const SymfileDownloader &symfile_downloader,
+ lldb::ModuleSP &cached_module_sp, bool *did_create_ptr);
private:
- Error
- Put (const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- const FileSpec &tmp_file,
- const FileSpec &target_file);
+ Error Put(const FileSpec &root_dir_spec, const char *hostname,
+ const ModuleSpec &module_spec, const FileSpec &tmp_file,
+ const FileSpec &target_file);
- Error
- Get (const FileSpec &root_dir_spec,
- const char *hostname,
- const ModuleSpec &module_spec,
- lldb::ModuleSP &cached_module_sp,
- bool *did_create_ptr);
+ Error Get(const FileSpec &root_dir_spec, const char *hostname,
+ const ModuleSpec &module_spec, lldb::ModuleSP &cached_module_sp,
+ bool *did_create_ptr);
- std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules;
+ std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules;
};
} // namespace lldb_private
-#endif // utility_ModuleCache_h_
+#endif // utility_ModuleCache_h_
diff --git a/source/Utility/NameMatches.cpp b/source/Utility/NameMatches.cpp
index e10c47e4fd9b2..7b733d24eba2e 100644
--- a/source/Utility/NameMatches.cpp
+++ b/source/Utility/NameMatches.cpp
@@ -6,45 +6,39 @@
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
-#include "lldb/Core/RegularExpression.h"
#include "lldb/Utility/NameMatches.h"
+#include "lldb/Core/RegularExpression.h"
#include "llvm/ADT/StringRef.h"
using namespace lldb_private;
-bool
-lldb_private::NameMatches(const char *name, NameMatchType match_type, const char *match)
-{
- if (match_type == eNameMatchIgnore)
- return true;
+bool lldb_private::NameMatches(llvm::StringRef name, NameMatchType match_type,
+ llvm::StringRef match) {
+ if (match_type == eNameMatchIgnore)
+ return true;
- if (name == match)
- return true;
+ if (name == match)
+ return true;
- if (name && match)
- {
- llvm::StringRef name_sref(name);
- llvm::StringRef match_sref(match);
- switch (match_type)
- {
- case eNameMatchIgnore: // This case cannot occur: tested before
- return true;
- case eNameMatchEquals:
- return name_sref == match_sref;
- case eNameMatchContains:
- return name_sref.find(match_sref) != llvm::StringRef::npos;
- case eNameMatchStartsWith:
- return name_sref.startswith(match_sref);
- case eNameMatchEndsWith:
- return name_sref.endswith(match_sref);
- case eNameMatchRegularExpression:
- {
- RegularExpression regex(match);
- return regex.Execute(name);
- }
- break;
- }
- }
+ if (name.empty() || match.empty())
return false;
+
+ switch (match_type) {
+ case eNameMatchIgnore: // This case cannot occur: tested before
+ return true;
+ case eNameMatchEquals:
+ return name == match;
+ case eNameMatchContains:
+ return name.contains(match);
+ case eNameMatchStartsWith:
+ return name.startswith(match);
+ case eNameMatchEndsWith:
+ return name.endswith(match);
+ case eNameMatchRegularExpression: {
+ RegularExpression regex(match);
+ return regex.Execute(name);
+ } break;
+ }
+ return false;
}
diff --git a/source/Utility/PseudoTerminal.cpp b/source/Utility/PseudoTerminal.cpp
index bc3cfee226f88..4d99a568b65e0 100644
--- a/source/Utility/PseudoTerminal.cpp
+++ b/source/Utility/PseudoTerminal.cpp
@@ -7,33 +7,20 @@
//
//===----------------------------------------------------------------------===//
-#include "lldb/Host/Config.h"
#include "lldb/Utility/PseudoTerminal.h"
+#include "lldb/Host/Config.h"
#include <errno.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
#if defined(TIOCSCTTY)
#include <sys/ioctl.h>
#endif
-#ifdef _WIN32
-#include "lldb/Host/windows/win32.h"
-typedef uint32_t pid_t;
-// 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; }
+#include "lldb/Host/PosixApi.h"
-pid_t fork(void) { return 0; }
-pid_t setsid(void) { return 0; }
-#elif defined(__ANDROID_NDK__)
-#include "lldb/Host/android/Android.h"
+#if defined(__ANDROID__)
int posix_openpt(int flags);
#endif
@@ -42,11 +29,8 @@ using namespace lldb_utility;
//----------------------------------------------------------------------
// PseudoTerminal constructor
//----------------------------------------------------------------------
-PseudoTerminal::PseudoTerminal () :
- m_master_fd(invalid_fd),
- m_slave_fd(invalid_fd)
-{
-}
+PseudoTerminal::PseudoTerminal()
+ : m_master_fd(invalid_fd), m_slave_fd(invalid_fd) {}
//----------------------------------------------------------------------
// Destructor
@@ -56,40 +40,29 @@ PseudoTerminal::PseudoTerminal () :
// ReleaseMasterFileDescriptor() or the ReleaseSaveFileDescriptor()
// member functions.
//----------------------------------------------------------------------
-PseudoTerminal::~PseudoTerminal ()
-{
- CloseMasterFileDescriptor();
- CloseSlaveFileDescriptor();
+PseudoTerminal::~PseudoTerminal() {
+ CloseMasterFileDescriptor();
+ CloseSlaveFileDescriptor();
}
//----------------------------------------------------------------------
// Close the master file descriptor if it is valid.
//----------------------------------------------------------------------
-void
-PseudoTerminal::CloseMasterFileDescriptor ()
-{
- if (m_master_fd >= 0)
- {
- // Don't call 'close' on m_master_fd for Windows as a dummy implementation of
- // posix_openpt above always gives it a 0 value.
-#ifndef _WIN32
- ::close (m_master_fd);
-#endif
- m_master_fd = invalid_fd;
- }
+void PseudoTerminal::CloseMasterFileDescriptor() {
+ if (m_master_fd >= 0) {
+ ::close(m_master_fd);
+ m_master_fd = invalid_fd;
+ }
}
//----------------------------------------------------------------------
// Close the slave file descriptor if it is valid.
//----------------------------------------------------------------------
-void
-PseudoTerminal::CloseSlaveFileDescriptor ()
-{
- if (m_slave_fd >= 0)
- {
- ::close (m_slave_fd);
- m_slave_fd = invalid_fd;
- }
+void PseudoTerminal::CloseSlaveFileDescriptor() {
+ if (m_slave_fd >= 0) {
+ ::close(m_slave_fd);
+ m_slave_fd = invalid_fd;
+ }
}
//----------------------------------------------------------------------
@@ -104,42 +77,45 @@ PseudoTerminal::CloseSlaveFileDescriptor ()
// file descriptor after this object is out of scope or destroyed.
//
// RETURNS:
-// Zero when successful, non-zero indicating an error occurred.
+// True when successful, false indicating an error occurred.
//----------------------------------------------------------------------
-bool
-PseudoTerminal::OpenFirstAvailableMaster (int oflag, char *error_str, size_t error_len)
-{
- if (error_str)
- error_str[0] = '\0';
-
- // Open the master side of a pseudo terminal
- m_master_fd = ::posix_openpt (oflag);
- if (m_master_fd < 0)
- {
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- return false;
- }
+bool PseudoTerminal::OpenFirstAvailableMaster(int oflag, char *error_str,
+ size_t error_len) {
+ if (error_str)
+ error_str[0] = '\0';
- // Grant access to the slave pseudo terminal
- if (::grantpt (m_master_fd) < 0)
- {
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- CloseMasterFileDescriptor ();
- return false;
- }
+#if !defined(LLDB_DISABLE_POSIX)
+ // Open the master side of a pseudo terminal
+ m_master_fd = ::posix_openpt(oflag);
+ if (m_master_fd < 0) {
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ return false;
+ }
- // Clear the lock flag on the slave pseudo terminal
- if (::unlockpt (m_master_fd) < 0)
- {
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- CloseMasterFileDescriptor ();
- return false;
- }
+ // Grant access to the slave pseudo terminal
+ if (::grantpt(m_master_fd) < 0) {
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ CloseMasterFileDescriptor();
+ return false;
+ }
- return true;
+ // Clear the lock flag on the slave pseudo terminal
+ if (::unlockpt(m_master_fd) < 0) {
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ CloseMasterFileDescriptor();
+ return false;
+ }
+
+ return true;
+#else
+ if (error_str)
+ ::snprintf(error_str, error_len, "%s",
+ "pseudo terminal not supported");
+ return false;
+#endif
}
//----------------------------------------------------------------------
@@ -151,36 +127,31 @@ PseudoTerminal::OpenFirstAvailableMaster (int oflag, char *error_str, size_t err
// ReleaseSlaveFileDescriptor() member function.
//
// RETURNS:
-// Zero when successful, non-zero indicating an error occurred.
+// True when successful, false indicating an error occurred.
//----------------------------------------------------------------------
-bool
-PseudoTerminal::OpenSlave (int oflag, char *error_str, size_t error_len)
-{
- if (error_str)
- error_str[0] = '\0';
+bool PseudoTerminal::OpenSlave(int oflag, char *error_str, size_t error_len) {
+ if (error_str)
+ error_str[0] = '\0';
- CloseSlaveFileDescriptor();
+ CloseSlaveFileDescriptor();
- // Open the master side of a pseudo terminal
- const char *slave_name = GetSlaveName (error_str, error_len);
+ // Open the master side of a pseudo terminal
+ const char *slave_name = GetSlaveName(error_str, error_len);
- if (slave_name == nullptr)
- return false;
+ if (slave_name == nullptr)
+ return false;
- m_slave_fd = ::open (slave_name, oflag);
+ m_slave_fd = ::open(slave_name, oflag);
- if (m_slave_fd < 0)
- {
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- return false;
- }
+ if (m_slave_fd < 0) {
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ return false;
+ }
- return true;
+ return true;
}
-
-
//----------------------------------------------------------------------
// Get the name of the slave pseudo terminal. A master pseudo terminal
// should already be valid prior to calling this function (see
@@ -192,27 +163,25 @@ PseudoTerminal::OpenSlave (int oflag, char *error_str, size_t error_len)
// that comes from static memory, so a copy of the string should be
// made as subsequent calls can change this value.
//----------------------------------------------------------------------
-const char*
-PseudoTerminal::GetSlaveName (char *error_str, size_t error_len) const
-{
- if (error_str)
- error_str[0] = '\0';
+const char *PseudoTerminal::GetSlaveName(char *error_str,
+ size_t error_len) const {
+ if (error_str)
+ error_str[0] = '\0';
- if (m_master_fd < 0)
- {
- if (error_str)
- ::snprintf (error_str, error_len, "%s", "master file descriptor is invalid");
- return nullptr;
- }
- const char *slave_name = ::ptsname (m_master_fd);
+ if (m_master_fd < 0) {
+ if (error_str)
+ ::snprintf(error_str, error_len, "%s",
+ "master file descriptor is invalid");
+ return nullptr;
+ }
+ const char *slave_name = ::ptsname(m_master_fd);
- if (error_str && slave_name == nullptr)
- ::strerror_r (errno, error_str, error_len);
+ if (error_str && slave_name == nullptr)
+ ::strerror_r(errno, error_str, error_len);
- return slave_name;
+ return slave_name;
}
-
//----------------------------------------------------------------------
// Fork a child process and have its stdio routed to a pseudo terminal.
//
@@ -234,74 +203,62 @@ PseudoTerminal::GetSlaveName (char *error_str, size_t error_len) const
// in the parent process: the pid of the child, or -1 if fork fails
// in the child process: zero
//----------------------------------------------------------------------
-lldb::pid_t
-PseudoTerminal::Fork (char *error_str, size_t error_len)
-{
- if (error_str)
- error_str[0] = '\0';
- pid_t pid = LLDB_INVALID_PROCESS_ID;
+lldb::pid_t PseudoTerminal::Fork(char *error_str, size_t error_len) {
+ if (error_str)
+ error_str[0] = '\0';
+ pid_t pid = LLDB_INVALID_PROCESS_ID;
#if !defined(LLDB_DISABLE_POSIX)
- int flags = O_RDWR;
- flags |= O_CLOEXEC;
- if (OpenFirstAvailableMaster (flags, error_str, error_len))
- {
- // Successfully opened our master pseudo terminal
-
- pid = ::fork ();
- if (pid < 0)
- {
- // Fork failed
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- }
- else if (pid == 0)
- {
- // Child Process
- ::setsid();
-
- if (OpenSlave (O_RDWR, error_str, error_len))
- {
- // Successfully opened slave
-
- // Master FD should have O_CLOEXEC set, but let's close it just in case...
- CloseMasterFileDescriptor ();
+ int flags = O_RDWR;
+ flags |= O_CLOEXEC;
+ if (OpenFirstAvailableMaster(flags, error_str, error_len)) {
+ // Successfully opened our master pseudo terminal
+
+ pid = ::fork();
+ if (pid < 0) {
+ // Fork failed
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ } else if (pid == 0) {
+ // Child Process
+ ::setsid();
+
+ if (OpenSlave(O_RDWR, error_str, error_len)) {
+ // Successfully opened slave
+
+ // Master FD should have O_CLOEXEC set, but let's close it just in
+ // case...
+ CloseMasterFileDescriptor();
#if defined(TIOCSCTTY)
- // Acquire the controlling terminal
- if (::ioctl (m_slave_fd, TIOCSCTTY, (char *)0) < 0)
- {
- if (error_str)
- ::strerror_r (errno, error_str, error_len);
- }
+ // Acquire the controlling terminal
+ if (::ioctl(m_slave_fd, TIOCSCTTY, (char *)0) < 0) {
+ if (error_str)
+ ::strerror_r(errno, error_str, error_len);
+ }
#endif
- // Duplicate all stdio file descriptors to the slave pseudo terminal
- if (::dup2 (m_slave_fd, STDIN_FILENO) != STDIN_FILENO)
- {
- if (error_str && !error_str[0])
- ::strerror_r (errno, error_str, error_len);
- }
-
- if (::dup2 (m_slave_fd, STDOUT_FILENO) != STDOUT_FILENO)
- {
- if (error_str && !error_str[0])
- ::strerror_r (errno, error_str, error_len);
- }
-
- if (::dup2 (m_slave_fd, STDERR_FILENO) != STDERR_FILENO)
- {
- if (error_str && !error_str[0])
- ::strerror_r (errno, error_str, error_len);
- }
- }
+ // Duplicate all stdio file descriptors to the slave pseudo terminal
+ if (::dup2(m_slave_fd, STDIN_FILENO) != STDIN_FILENO) {
+ if (error_str && !error_str[0])
+ ::strerror_r(errno, error_str, error_len);
}
- else
- {
- // Parent Process
- // Do nothing and let the pid get returned!
+
+ if (::dup2(m_slave_fd, STDOUT_FILENO) != STDOUT_FILENO) {
+ if (error_str && !error_str[0])
+ ::strerror_r(errno, error_str, error_len);
+ }
+
+ if (::dup2(m_slave_fd, STDERR_FILENO) != STDERR_FILENO) {
+ if (error_str && !error_str[0])
+ ::strerror_r(errno, error_str, error_len);
}
+ }
+ } else {
+ // Parent Process
+ // Do nothing and let the pid get returned!
}
+ }
#endif
- return pid;
+ return pid;
}
//----------------------------------------------------------------------
@@ -313,11 +270,7 @@ PseudoTerminal::Fork (char *error_str, size_t error_len)
// Returns the master file descriptor, or -1 if the master file
// descriptor is not currently valid.
//----------------------------------------------------------------------
-int
-PseudoTerminal::GetMasterFileDescriptor () const
-{
- return m_master_fd;
-}
+int PseudoTerminal::GetMasterFileDescriptor() const { return m_master_fd; }
//----------------------------------------------------------------------
// The slave file descriptor accessor.
@@ -325,11 +278,7 @@ PseudoTerminal::GetMasterFileDescriptor () const
// Returns the slave file descriptor, or -1 if the slave file
// descriptor is not currently valid.
//----------------------------------------------------------------------
-int
-PseudoTerminal::GetSlaveFileDescriptor () const
-{
- return m_slave_fd;
-}
+int PseudoTerminal::GetSlaveFileDescriptor() const { return m_slave_fd; }
//----------------------------------------------------------------------
// Release ownership of the master pseudo terminal file descriptor
@@ -337,15 +286,13 @@ PseudoTerminal::GetSlaveFileDescriptor () const
// master file descriptor if the ownership isn't released using this
// call and the master file descriptor has been opened.
//----------------------------------------------------------------------
-int
-PseudoTerminal::ReleaseMasterFileDescriptor ()
-{
- // Release ownership of the master pseudo terminal file
- // descriptor without closing it. (the destructor for this
- // class will close it otherwise!)
- int fd = m_master_fd;
- m_master_fd = invalid_fd;
- return fd;
+int PseudoTerminal::ReleaseMasterFileDescriptor() {
+ // Release ownership of the master pseudo terminal file
+ // descriptor without closing it. (the destructor for this
+ // class will close it otherwise!)
+ int fd = m_master_fd;
+ m_master_fd = invalid_fd;
+ return fd;
}
//----------------------------------------------------------------------
@@ -354,14 +301,11 @@ PseudoTerminal::ReleaseMasterFileDescriptor ()
// slave file descriptor if the ownership isn't released using this
// call and the slave file descriptor has been opened.
//----------------------------------------------------------------------
-int
-PseudoTerminal::ReleaseSlaveFileDescriptor ()
-{
- // Release ownership of the slave pseudo terminal file
- // descriptor without closing it (the destructor for this
- // class will close it otherwise!)
- int fd = m_slave_fd;
- m_slave_fd = invalid_fd;
- return fd;
+int PseudoTerminal::ReleaseSlaveFileDescriptor() {
+ // Release ownership of the slave pseudo terminal file
+ // descriptor without closing it (the destructor for this
+ // class will close it otherwise!)
+ int fd = m_slave_fd;
+ m_slave_fd = invalid_fd;
+ return fd;
}
-
diff --git a/source/Utility/Range.cpp b/source/Utility/Range.cpp
index 158d1e729d48e..95f00e5c75999 100644
--- a/source/Utility/Range.cpp
+++ b/source/Utility/Range.cpp
@@ -1,4 +1,5 @@
-//===--------------------- Range.cpp -----------------------------*- C++ -*-===//
+//===--------------------- Range.cpp -----------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -11,93 +12,63 @@
using namespace lldb_utility;
-Range::Range (const Range& rng) :
-m_low(rng.m_low),
-m_high(rng.m_high)
-{
- InitRange();
+Range::Range(const Range &rng) : m_low(rng.m_low), m_high(rng.m_high) {
+ InitRange();
}
-Range::Range (Range::ValueType low,
- Range::ValueType high) :
-m_low(low),
-m_high(high)
-{
- InitRange();
+Range::Range(Range::ValueType low, Range::ValueType high)
+ : m_low(low), m_high(high) {
+ InitRange();
}
-void
-Range::InitRange ()
-{
- if (m_low == OPEN_END)
- {
- if (m_high == OPEN_END)
- m_low = 0;
- else
- {
- // make an empty range
- m_low = 1;
- m_high = 0;
- }
+void Range::InitRange() {
+ if (m_low == OPEN_END) {
+ if (m_high == OPEN_END)
+ m_low = 0;
+ else {
+ // make an empty range
+ m_low = 1;
+ m_high = 0;
}
+ }
}
-Range&
-Range::operator = (const Range& rhs)
-{
- if (&rhs != this)
- {
- this->m_low = rhs.m_low;
- this->m_high = rhs.m_high;
- }
- return *this;
+Range &Range::operator=(const Range &rhs) {
+ if (&rhs != this) {
+ this->m_low = rhs.m_low;
+ this->m_high = rhs.m_high;
+ }
+ return *this;
}
-void
-Range::Flip ()
-{
- std::swap(m_high, m_low);
-}
+void Range::Flip() { std::swap(m_high, m_low); }
-void
-Range::Intersection (const Range& other)
-{
- m_low = std::max(m_low,other.m_low);
- m_high = std::min(m_high,other.m_high);
+void Range::Intersection(const Range &other) {
+ m_low = std::max(m_low, other.m_low);
+ m_high = std::min(m_high, other.m_high);
}
-void
-Range::Union (const Range& other)
-{
- m_low = std::min(m_low,other.m_low);
- m_high = std::max(m_high,other.m_high);
+void Range::Union(const Range &other) {
+ m_low = std::min(m_low, other.m_low);
+ m_high = std::max(m_high, other.m_high);
}
-void
-Range::Iterate (RangeCallback callback)
-{
- ValueType counter = m_low;
- while (counter <= m_high)
- {
- bool should_continue = callback(counter);
- if (!should_continue)
- return;
- counter++;
- }
+void Range::Iterate(RangeCallback callback) {
+ ValueType counter = m_low;
+ while (counter <= m_high) {
+ bool should_continue = callback(counter);
+ if (!should_continue)
+ return;
+ counter++;
+ }
}
-bool
-Range::IsEmpty ()
-{
- return (m_low > m_high);
-}
+bool Range::IsEmpty() { return (m_low > m_high); }
-Range::ValueType
-Range::GetSize ()
-{
- if (m_high == OPEN_END)
- return OPEN_END;
- if (m_high >= m_low)
- return m_high - m_low + 1;
- return 0;
+Range::ValueType Range::GetSize() {
+ if (m_high == OPEN_END)
+ return OPEN_END;
+ if (m_high >= m_low)
+ return m_high - m_low + 1;
+ return 0;
}
diff --git a/source/Utility/RegisterNumber.cpp b/source/Utility/RegisterNumber.cpp
index 8116cda10fe5a..07dd223f63092 100644
--- a/source/Utility/RegisterNumber.cpp
+++ b/source/Utility/RegisterNumber.cpp
@@ -8,150 +8,112 @@
//===----------------------------------------------------------------------===//
#include "lldb/Utility/RegisterNumber.h"
-#include "lldb/Target/Thread.h"
#include "lldb/Target/RegisterContext.h"
+#include "lldb/Target/Thread.h"
using namespace lldb_private;
-
-RegisterNumber::RegisterNumber (lldb_private::Thread &thread, lldb::RegisterKind kind, uint32_t num) :
- m_reg_ctx_sp (thread.GetRegisterContext()),
- m_regnum (num),
- m_kind (kind),
- m_kind_regnum_map (),
- m_name ("")
-{
- if (m_reg_ctx_sp.get())
- {
- const lldb_private::RegisterInfo *reginfo = m_reg_ctx_sp->GetRegisterInfoAtIndex (GetAsKind (lldb::eRegisterKindLLDB));
- if (reginfo && reginfo->name)
- {
- m_name = reginfo->name;
- }
+RegisterNumber::RegisterNumber(lldb_private::Thread &thread,
+ lldb::RegisterKind kind, uint32_t num)
+ : m_reg_ctx_sp(thread.GetRegisterContext()), m_regnum(num), m_kind(kind),
+ m_kind_regnum_map(), m_name("") {
+ if (m_reg_ctx_sp.get()) {
+ const lldb_private::RegisterInfo *reginfo =
+ m_reg_ctx_sp->GetRegisterInfoAtIndex(
+ GetAsKind(lldb::eRegisterKindLLDB));
+ if (reginfo && reginfo->name) {
+ m_name = reginfo->name;
}
+ }
}
-RegisterNumber::RegisterNumber () :
- m_reg_ctx_sp(),
- m_regnum (LLDB_INVALID_REGNUM),
- m_kind (lldb::kNumRegisterKinds),
- m_kind_regnum_map (),
- m_name (nullptr)
-{
-}
-
-void
-RegisterNumber::init (lldb_private::Thread &thread, lldb::RegisterKind kind, uint32_t num)
-{
- m_reg_ctx_sp = thread.GetRegisterContext();
- m_regnum = num;
- m_kind = kind;
- if (m_reg_ctx_sp.get())
- {
- const lldb_private::RegisterInfo *reginfo = m_reg_ctx_sp->GetRegisterInfoAtIndex (GetAsKind (lldb::eRegisterKindLLDB));
- if (reginfo && reginfo->name)
- {
- m_name = reginfo->name;
- }
+RegisterNumber::RegisterNumber()
+ : m_reg_ctx_sp(), m_regnum(LLDB_INVALID_REGNUM),
+ m_kind(lldb::kNumRegisterKinds), m_kind_regnum_map(), m_name(nullptr) {}
+
+void RegisterNumber::init(lldb_private::Thread &thread, lldb::RegisterKind kind,
+ uint32_t num) {
+ m_reg_ctx_sp = thread.GetRegisterContext();
+ m_regnum = num;
+ m_kind = kind;
+ if (m_reg_ctx_sp.get()) {
+ const lldb_private::RegisterInfo *reginfo =
+ m_reg_ctx_sp->GetRegisterInfoAtIndex(
+ GetAsKind(lldb::eRegisterKindLLDB));
+ if (reginfo && reginfo->name) {
+ m_name = reginfo->name;
}
+ }
}
-const RegisterNumber &
-RegisterNumber::operator = (const RegisterNumber &rhs)
-{
- m_reg_ctx_sp = rhs.m_reg_ctx_sp;
- m_regnum = rhs.m_regnum;
- m_kind = rhs.m_kind;
- for (auto it : rhs.m_kind_regnum_map)
- m_kind_regnum_map[it.first] = it.second;
- m_name = rhs.m_name;
- return *this;
+const RegisterNumber &RegisterNumber::operator=(const RegisterNumber &rhs) {
+ m_reg_ctx_sp = rhs.m_reg_ctx_sp;
+ m_regnum = rhs.m_regnum;
+ m_kind = rhs.m_kind;
+ for (auto it : rhs.m_kind_regnum_map)
+ m_kind_regnum_map[it.first] = it.second;
+ m_name = rhs.m_name;
+ return *this;
}
-bool
-RegisterNumber::operator == (RegisterNumber &rhs)
-{
- if (IsValid() != rhs.IsValid())
- return false;
-
- if (m_kind == rhs.m_kind)
- {
- if (m_regnum == rhs.m_regnum)
- return true;
- else
- return false;
- }
-
- uint32_t rhs_regnum = rhs.GetAsKind (m_kind);
- if (rhs_regnum != LLDB_INVALID_REGNUM)
- {
- if (m_regnum == rhs_regnum)
- return true;
- else
- return false;
- }
- uint32_t lhs_regnum = GetAsKind (rhs.m_kind);
- {
- if (lhs_regnum == rhs.m_regnum)
- return true;
- else
- return false;
- }
+bool RegisterNumber::operator==(RegisterNumber &rhs) {
+ if (IsValid() != rhs.IsValid())
return false;
-}
-bool
-RegisterNumber::operator != (RegisterNumber &rhs)
-{
- return !(*this == rhs);
+ if (m_kind == rhs.m_kind) {
+ if (m_regnum == rhs.m_regnum)
+ return true;
+ else
+ return false;
+ }
+
+ uint32_t rhs_regnum = rhs.GetAsKind(m_kind);
+ if (rhs_regnum != LLDB_INVALID_REGNUM) {
+ if (m_regnum == rhs_regnum)
+ return true;
+ else
+ return false;
+ }
+ uint32_t lhs_regnum = GetAsKind(rhs.m_kind);
+ {
+ if (lhs_regnum == rhs.m_regnum)
+ return true;
+ else
+ return false;
+ }
+ return false;
}
-bool
-RegisterNumber::IsValid () const
-{
- return m_reg_ctx_sp.get()
- && m_kind != lldb::kNumRegisterKinds
- && m_regnum != LLDB_INVALID_REGNUM;
+bool RegisterNumber::operator!=(RegisterNumber &rhs) { return !(*this == rhs); }
+
+bool RegisterNumber::IsValid() const {
+ return m_reg_ctx_sp.get() && m_kind != lldb::kNumRegisterKinds &&
+ m_regnum != LLDB_INVALID_REGNUM;
}
-uint32_t
-RegisterNumber::GetAsKind (lldb::RegisterKind kind)
-{
- if (m_regnum == LLDB_INVALID_REGNUM)
- return LLDB_INVALID_REGNUM;
+uint32_t RegisterNumber::GetAsKind(lldb::RegisterKind kind) {
+ if (m_regnum == LLDB_INVALID_REGNUM)
+ return LLDB_INVALID_REGNUM;
- if (kind == m_kind)
- return m_regnum;
+ if (kind == m_kind)
+ return m_regnum;
- Collection::iterator iter = m_kind_regnum_map.find (kind);
- if (iter != m_kind_regnum_map.end())
- {
- return iter->second;
- }
- uint32_t output_regnum = LLDB_INVALID_REGNUM;
- if (m_reg_ctx_sp
- && m_reg_ctx_sp->ConvertBetweenRegisterKinds (m_kind, m_regnum, kind, output_regnum)
- && output_regnum != LLDB_INVALID_REGNUM)
- {
- m_kind_regnum_map[kind] = output_regnum;
- }
- return output_regnum;
+ Collection::iterator iter = m_kind_regnum_map.find(kind);
+ if (iter != m_kind_regnum_map.end()) {
+ return iter->second;
+ }
+ uint32_t output_regnum = LLDB_INVALID_REGNUM;
+ if (m_reg_ctx_sp &&
+ m_reg_ctx_sp->ConvertBetweenRegisterKinds(m_kind, m_regnum, kind,
+ output_regnum) &&
+ output_regnum != LLDB_INVALID_REGNUM) {
+ m_kind_regnum_map[kind] = output_regnum;
+ }
+ return output_regnum;
}
-uint32_t
-RegisterNumber::GetRegisterNumber () const
-{
- return m_regnum;
-}
+uint32_t RegisterNumber::GetRegisterNumber() const { return m_regnum; }
-lldb::RegisterKind
-RegisterNumber::GetRegisterKind () const
-{
- return m_kind;
-}
+lldb::RegisterKind RegisterNumber::GetRegisterKind() const { return m_kind; }
-const char *
-RegisterNumber::GetName ()
-{
- return m_name;
-}
+const char *RegisterNumber::GetName() { return m_name; }
diff --git a/source/Utility/SelectHelper.cpp b/source/Utility/SelectHelper.cpp
new file mode 100644
index 0000000000000..805bcf2c7950a
--- /dev/null
+++ b/source/Utility/SelectHelper.cpp
@@ -0,0 +1,260 @@
+//===-- SelectHelper.cpp ----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#if defined(__APPLE__)
+// Enable this special support for Apple builds where we can have unlimited
+// select bounds. We tried switching to poll() and kqueue and we were panicing
+// the kernel, so we have to stick with select for now.
+#define _DARWIN_UNLIMITED_SELECT
+#endif
+
+// C Includes
+#include <errno.h>
+#if defined(_WIN32)
+// Define NOMINMAX to avoid macros that conflict with std::min and std::max
+#define NOMINMAX
+#include <winsock2.h>
+#else
+#include <sys/select.h>
+#endif
+
+// C++ Includes
+#include <algorithm>
+
+// Other libraries and framework includes
+#include "llvm/ADT/SmallVector.h"
+
+// Project includes
+#include "lldb/Core/Error.h"
+#include "lldb/Utility/LLDBAssert.h"
+#include "lldb/Utility/SelectHelper.h"
+
+SelectHelper::SelectHelper()
+ : m_fd_map(), m_end_time() // Infinite timeout unless
+ // SelectHelper::SetTimeout() gets called
+{}
+
+void SelectHelper::SetTimeout(const std::chrono::microseconds &timeout) {
+ using namespace std::chrono;
+ m_end_time = steady_clock::time_point(steady_clock::now() + timeout);
+}
+
+void SelectHelper::FDSetRead(lldb::socket_t fd) {
+ m_fd_map[fd].read_set = true;
+}
+
+void SelectHelper::FDSetWrite(lldb::socket_t fd) {
+ m_fd_map[fd].write_set = true;
+}
+
+void SelectHelper::FDSetError(lldb::socket_t fd) {
+ m_fd_map[fd].error_set = true;
+}
+
+bool SelectHelper::FDIsSetRead(lldb::socket_t fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.read_is_set;
+ else
+ return false;
+}
+
+bool SelectHelper::FDIsSetWrite(lldb::socket_t fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.write_is_set;
+ else
+ return false;
+}
+
+bool SelectHelper::FDIsSetError(lldb::socket_t fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.error_is_set;
+ else
+ return false;
+}
+
+static void updateMaxFd(llvm::Optional<lldb::socket_t> &vold,
+ lldb::socket_t vnew) {
+ if (!vold.hasValue())
+ vold = vnew;
+ else
+ vold = std::max(*vold, vnew);
+}
+
+lldb_private::Error SelectHelper::Select() {
+ lldb_private::Error error;
+#ifdef _MSC_VER
+ // On windows FD_SETSIZE limits the number of file descriptors, not their
+ // numeric value.
+ lldbassert(m_fd_map.size() <= FD_SETSIZE);
+ if (m_fd_map.size() > FD_SETSIZE)
+ return lldb_private::Error("Too many file descriptors for select()");
+#endif
+
+ llvm::Optional<lldb::socket_t> max_read_fd;
+ llvm::Optional<lldb::socket_t> max_write_fd;
+ llvm::Optional<lldb::socket_t> max_error_fd;
+ llvm::Optional<lldb::socket_t> max_fd;
+ for (auto &pair : m_fd_map) {
+ pair.second.PrepareForSelect();
+ const lldb::socket_t fd = pair.first;
+#if !defined(__APPLE__) && !defined(_MSC_VER)
+ lldbassert(fd < FD_SETSIZE);
+ if (fd >= FD_SETSIZE) {
+ error.SetErrorStringWithFormat("%i is too large for select()", fd);
+ return error;
+ }
+#endif
+ if (pair.second.read_set)
+ updateMaxFd(max_read_fd, fd);
+ if (pair.second.write_set)
+ updateMaxFd(max_write_fd, fd);
+ if (pair.second.error_set)
+ updateMaxFd(max_error_fd, fd);
+ updateMaxFd(max_fd, fd);
+ }
+
+ if (!max_fd.hasValue()) {
+ error.SetErrorString("no valid file descriptors");
+ return error;
+ }
+
+ const unsigned nfds = static_cast<unsigned>(*max_fd) + 1;
+ fd_set *read_fdset_ptr = nullptr;
+ fd_set *write_fdset_ptr = nullptr;
+ fd_set *error_fdset_ptr = nullptr;
+//----------------------------------------------------------------------
+// Initialize and zero out the fdsets
+//----------------------------------------------------------------------
+#if defined(__APPLE__)
+ llvm::SmallVector<fd_set, 1> read_fdset;
+ llvm::SmallVector<fd_set, 1> write_fdset;
+ llvm::SmallVector<fd_set, 1> error_fdset;
+
+ if (max_read_fd.hasValue()) {
+ read_fdset.resize((nfds / FD_SETSIZE) + 1);
+ read_fdset_ptr = read_fdset.data();
+ }
+ if (max_write_fd.hasValue()) {
+ write_fdset.resize((nfds / FD_SETSIZE) + 1);
+ write_fdset_ptr = write_fdset.data();
+ }
+ if (max_error_fd.hasValue()) {
+ error_fdset.resize((nfds / FD_SETSIZE) + 1);
+ error_fdset_ptr = error_fdset.data();
+ }
+ for (auto &fd_set : read_fdset)
+ FD_ZERO(&fd_set);
+ for (auto &fd_set : write_fdset)
+ FD_ZERO(&fd_set);
+ for (auto &fd_set : error_fdset)
+ FD_ZERO(&fd_set);
+#else
+ fd_set read_fdset;
+ fd_set write_fdset;
+ fd_set error_fdset;
+
+ if (max_read_fd.hasValue()) {
+ FD_ZERO(&read_fdset);
+ read_fdset_ptr = &read_fdset;
+ }
+ if (max_write_fd.hasValue()) {
+ FD_ZERO(&write_fdset);
+ write_fdset_ptr = &write_fdset;
+ }
+ if (max_error_fd.hasValue()) {
+ FD_ZERO(&error_fdset);
+ error_fdset_ptr = &error_fdset;
+ }
+#endif
+ //----------------------------------------------------------------------
+ // Set the FD bits in the fdsets for read/write/error
+ //----------------------------------------------------------------------
+ for (auto &pair : m_fd_map) {
+ const lldb::socket_t fd = pair.first;
+
+ if (pair.second.read_set)
+ FD_SET(fd, read_fdset_ptr);
+
+ if (pair.second.write_set)
+ FD_SET(fd, write_fdset_ptr);
+
+ if (pair.second.error_set)
+ FD_SET(fd, error_fdset_ptr);
+ }
+
+ //----------------------------------------------------------------------
+ // Setup our timeout time value if needed
+ //----------------------------------------------------------------------
+ struct timeval *tv_ptr = nullptr;
+ struct timeval tv = {0, 0};
+
+ while (1) {
+ using namespace std::chrono;
+ //------------------------------------------------------------------
+ // Setup out relative timeout based on the end time if we have one
+ //------------------------------------------------------------------
+ if (m_end_time.hasValue()) {
+ tv_ptr = &tv;
+ const auto remaining_dur = duration_cast<microseconds>(
+ m_end_time.getValue() - steady_clock::now());
+ if (remaining_dur.count() > 0) {
+ // Wait for a specific amount of time
+ const auto dur_secs = duration_cast<seconds>(remaining_dur);
+ const auto dur_usecs = remaining_dur % seconds(1);
+ tv.tv_sec = dur_secs.count();
+ tv.tv_usec = dur_usecs.count();
+ } else {
+ // Just poll once with no timeout
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ }
+ }
+ const int num_set_fds = ::select(nfds, read_fdset_ptr, write_fdset_ptr,
+ error_fdset_ptr, tv_ptr);
+ if (num_set_fds < 0) {
+ // We got an error
+ error.SetErrorToErrno();
+ if (error.GetError() == EINTR) {
+ error.Clear();
+ continue; // Keep calling select if we get EINTR
+ } else
+ return error;
+ } else if (num_set_fds == 0) {
+ // Timeout
+ error.SetError(ETIMEDOUT, lldb::eErrorTypePOSIX);
+ error.SetErrorString("timed out");
+ return error;
+ } else {
+ // One or more descriptors were set, update the FDInfo::select_is_set mask
+ // so users can ask the SelectHelper class so clients can call one of:
+
+ for (auto &pair : m_fd_map) {
+ const int fd = pair.first;
+
+ if (pair.second.read_set) {
+ if (FD_ISSET(fd, read_fdset_ptr))
+ pair.second.read_is_set = true;
+ }
+ if (pair.second.write_set) {
+ if (FD_ISSET(fd, write_fdset_ptr))
+ pair.second.write_is_set = true;
+ }
+ if (pair.second.error_set) {
+ if (FD_ISSET(fd, error_fdset_ptr))
+ pair.second.error_is_set = true;
+ }
+ }
+ break;
+ }
+ }
+ return error;
+}
diff --git a/source/Utility/SharingPtr.cpp b/source/Utility/SharingPtr.cpp
index 7eedeb08afd1f..cf32b21f24a66 100644
--- a/source/Utility/SharingPtr.cpp
+++ b/source/Utility/SharingPtr.cpp
@@ -9,12 +9,12 @@
#include "lldb/Utility/SharingPtr.h"
-#if defined (ENABLE_SP_LOGGING)
+#if defined(ENABLE_SP_LOGGING)
// If ENABLE_SP_LOGGING is defined, then log all shared pointer assignments
// and allow them to be queried using a pointer by a call to:
-#include <execinfo.h>
#include <assert.h>
+#include <execinfo.h>
#include "llvm/ADT/STLExtras.h"
@@ -22,147 +22,114 @@
#include <mutex>
#include <vector>
-class Backtrace
-{
+class Backtrace {
public:
- Backtrace ();
-
- ~Backtrace ();
-
- void
- GetFrames ();
-
- void
- Dump () const;
-
+ Backtrace();
+
+ ~Backtrace();
+
+ void GetFrames();
+
+ void Dump() const;
+
private:
- void *m_sp_this;
- std::vector<void *> m_frames;
+ void *m_sp_this;
+ std::vector<void *> m_frames;
};
+Backtrace::Backtrace() : m_frames() {}
-Backtrace::Backtrace () : m_frames()
-{
-}
-
-Backtrace::~Backtrace ()
-{
-}
+Backtrace::~Backtrace() {}
-void
-Backtrace::GetFrames ()
-{
- void *frames[1024];
- const int count = ::backtrace (frames, llvm::array_lengthof(frames));
- if (count > 2)
- m_frames.assign (frames + 2, frames + (count - 2));
+void Backtrace::GetFrames() {
+ void *frames[1024];
+ const int count = ::backtrace(frames, llvm::array_lengthof(frames));
+ if (count > 2)
+ m_frames.assign(frames + 2, frames + (count - 2));
}
-void
-Backtrace::Dump () const
-{
- if (!m_frames.empty())
- ::backtrace_symbols_fd (m_frames.data(), m_frames.size(), STDOUT_FILENO);
- write (STDOUT_FILENO, "\n\n", 2);
+void Backtrace::Dump() const {
+ if (!m_frames.empty())
+ ::backtrace_symbols_fd(m_frames.data(), m_frames.size(), STDOUT_FILENO);
+ write(STDOUT_FILENO, "\n\n", 2);
}
-extern "C" void track_sp (void *sp_this, void *ptr, long use_count)
-{
- typedef std::pair<void *, Backtrace> PtrBacktracePair;
- typedef std::map<void *, PtrBacktracePair> PtrToBacktraceMap;
- static std::mutex g_mutex;
- std::lock_guard<std::mutex> guard(g_mutex);
- static PtrToBacktraceMap g_map;
-
- if (sp_this)
- {
- printf ("sp(%p) -> %p %lu\n", sp_this, ptr, use_count);
-
- if (ptr)
- {
- Backtrace bt;
- bt.GetFrames();
- g_map[sp_this] = std::make_pair(ptr, bt);
- }
- else
- {
- g_map.erase (sp_this);
- }
+extern "C" void track_sp(void *sp_this, void *ptr, long use_count) {
+ typedef std::pair<void *, Backtrace> PtrBacktracePair;
+ typedef std::map<void *, PtrBacktracePair> PtrToBacktraceMap;
+ static std::mutex g_mutex;
+ std::lock_guard<std::mutex> guard(g_mutex);
+ static PtrToBacktraceMap g_map;
+
+ if (sp_this) {
+ printf("sp(%p) -> %p %lu\n", sp_this, ptr, use_count);
+
+ if (ptr) {
+ Backtrace bt;
+ bt.GetFrames();
+ g_map[sp_this] = std::make_pair(ptr, bt);
+ } else {
+ g_map.erase(sp_this);
}
- else
- {
- if (ptr)
- printf ("Searching for shared pointers that are tracking %p: ", ptr);
- else
- printf ("Dump all live shared pointres: ");
-
- uint32_t matches = 0;
- PtrToBacktraceMap::iterator pos, end = g_map.end();
- for (pos = g_map.begin(); pos != end; ++pos)
- {
- if (ptr == NULL || pos->second.first == ptr)
- {
- ++matches;
- printf ("\nsp(%p): %p\n", pos->first, pos->second.first);
- pos->second.second.Dump();
- }
- }
- if (matches == 0)
- {
- printf ("none.\n");
- }
+ } else {
+ if (ptr)
+ printf("Searching for shared pointers that are tracking %p: ", ptr);
+ else
+ printf("Dump all live shared pointres: ");
+
+ uint32_t matches = 0;
+ PtrToBacktraceMap::iterator pos, end = g_map.end();
+ for (pos = g_map.begin(); pos != end; ++pos) {
+ if (ptr == NULL || pos->second.first == ptr) {
+ ++matches;
+ printf("\nsp(%p): %p\n", pos->first, pos->second.first);
+ pos->second.second.Dump();
+ }
}
+ if (matches == 0) {
+ printf("none.\n");
+ }
+ }
}
-// Put dump_sp_refs in the lldb namespace to it gets through our exports lists filter in the LLDB.framework or lldb.so
+// Put dump_sp_refs in the lldb namespace to it gets through our exports lists
+// filter in the LLDB.framework or lldb.so
namespace lldb {
-
- void dump_sp_refs (void *ptr)
- {
- // Use a specially crafted call to "track_sp" which will
- // dump info on all live shared pointers that reference "ptr"
- track_sp (NULL, ptr, 0);
- }
-
+
+void dump_sp_refs(void *ptr) {
+ // Use a specially crafted call to "track_sp" which will
+ // dump info on all live shared pointers that reference "ptr"
+ track_sp(NULL, ptr, 0);
+}
}
#endif
namespace lldb_private {
-namespace imp
-{
+namespace imp {
+shared_count::~shared_count() {}
- shared_count::~shared_count()
- {
- }
-
- void
- shared_count::add_shared()
- {
+void shared_count::add_shared() {
#ifdef _MSC_VER
- _InterlockedIncrement(&shared_owners_);
+ _InterlockedIncrement(&shared_owners_);
#else
- ++shared_owners_;
+ ++shared_owners_;
#endif
- }
+}
- void
- shared_count::release_shared()
- {
+void shared_count::release_shared() {
#ifdef _MSC_VER
- if (_InterlockedDecrement(&shared_owners_) == -1)
+ if (_InterlockedDecrement(&shared_owners_) == -1)
#else
- if (--shared_owners_ == -1)
+ if (--shared_owners_ == -1)
#endif
- {
- on_zero_shared();
- delete this;
- }
- }
+ {
+ on_zero_shared();
+ delete this;
+ }
+}
} // imp
-
} // namespace lldb
-
diff --git a/source/Utility/StringExtractor.cpp b/source/Utility/StringExtractor.cpp
index 4c0029a0649b4..d8ba39710d1b5 100644
--- a/source/Utility/StringExtractor.cpp
+++ b/source/Utility/StringExtractor.cpp
@@ -13,84 +13,66 @@
#include <stdlib.h>
// C++ Includes
+#include <tuple>
// Other libraries and framework includes
// Project includes
-static inline int
-xdigit_to_sint (char ch)
-{
- if (ch >= 'a' && ch <= 'f')
- return 10 + ch - 'a';
- if (ch >= 'A' && ch <= 'F')
- return 10 + ch - 'A';
- if (ch >= '0' && ch <= '9')
- return ch - '0';
- return -1;
+static inline int xdigit_to_sint(char ch) {
+ if (ch >= 'a' && ch <= 'f')
+ return 10 + ch - 'a';
+ if (ch >= 'A' && ch <= 'F')
+ return 10 + ch - 'A';
+ if (ch >= '0' && ch <= '9')
+ return ch - '0';
+ return -1;
}
//----------------------------------------------------------------------
// StringExtractor constructor
//----------------------------------------------------------------------
-StringExtractor::StringExtractor() :
- m_packet(),
- m_index (0)
-{
-}
-
+StringExtractor::StringExtractor() : m_packet(), m_index(0) {}
-StringExtractor::StringExtractor(const char *packet_cstr) :
- m_packet(),
- m_index (0)
-{
- if (packet_cstr)
- m_packet.assign (packet_cstr);
+StringExtractor::StringExtractor(llvm::StringRef packet_str)
+ : m_packet(), m_index(0) {
+ m_packet.assign(packet_str.begin(), packet_str.end());
}
+StringExtractor::StringExtractor(const char *packet_cstr)
+ : m_packet(), m_index(0) {
+ if (packet_cstr)
+ m_packet.assign(packet_cstr);
+}
//----------------------------------------------------------------------
// StringExtractor copy constructor
//----------------------------------------------------------------------
-StringExtractor::StringExtractor(const StringExtractor& rhs) :
- m_packet (rhs.m_packet),
- m_index (rhs.m_index)
-{
-
-}
+StringExtractor::StringExtractor(const StringExtractor &rhs)
+ : m_packet(rhs.m_packet), m_index(rhs.m_index) {}
//----------------------------------------------------------------------
// StringExtractor assignment operator
//----------------------------------------------------------------------
-const StringExtractor&
-StringExtractor::operator=(const StringExtractor& rhs)
-{
- if (this != &rhs)
- {
- m_packet = rhs.m_packet;
- m_index = rhs.m_index;
-
- }
- return *this;
+const StringExtractor &StringExtractor::operator=(const StringExtractor &rhs) {
+ if (this != &rhs) {
+ m_packet = rhs.m_packet;
+ m_index = rhs.m_index;
+ }
+ return *this;
}
//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
-StringExtractor::~StringExtractor()
-{
-}
-
-
-char
-StringExtractor::GetChar (char fail_value)
-{
- if (m_index < m_packet.size())
- {
- char ch = m_packet[m_index];
- ++m_index;
- return ch;
- }
- m_index = UINT64_MAX;
- return fail_value;
+StringExtractor::~StringExtractor() {}
+
+char StringExtractor::GetChar(char fail_value) {
+ if (m_index < m_packet.size()) {
+ char ch = m_packet[m_index];
+ ++m_index;
+ return ch;
+ }
+ m_index = UINT64_MAX;
+ return fail_value;
}
//----------------------------------------------------------------------
@@ -101,274 +83,220 @@ StringExtractor::GetChar (char fail_value)
// If there is not a pair of valid hex digits at the head of the
// StringExtractor, it is left unchanged and -1 is returned
//----------------------------------------------------------------------
-int
-StringExtractor::DecodeHexU8()
-{
- SkipSpaces();
- if (GetBytesLeft() < 2)
- {
- return -1;
- }
- const int hi_nibble = xdigit_to_sint(m_packet[m_index]);
- const int lo_nibble = xdigit_to_sint(m_packet[m_index+1]);
- if (hi_nibble == -1 || lo_nibble == -1)
- {
- return -1;
- }
- m_index += 2;
- return (uint8_t)((hi_nibble << 4) + lo_nibble);
+int StringExtractor::DecodeHexU8() {
+ SkipSpaces();
+ if (GetBytesLeft() < 2) {
+ return -1;
+ }
+ const int hi_nibble = xdigit_to_sint(m_packet[m_index]);
+ const int lo_nibble = xdigit_to_sint(m_packet[m_index + 1]);
+ if (hi_nibble == -1 || lo_nibble == -1) {
+ return -1;
+ }
+ m_index += 2;
+ return (uint8_t)((hi_nibble << 4) + lo_nibble);
}
//----------------------------------------------------------------------
// Extract an unsigned character from two hex ASCII chars in the packet
// string, or return fail_value on failure
//----------------------------------------------------------------------
-uint8_t
-StringExtractor::GetHexU8 (uint8_t fail_value, bool set_eof_on_fail)
-{
- // On success, fail_value will be overwritten with the next
- // character in the stream
- GetHexU8Ex(fail_value, set_eof_on_fail);
- return fail_value;
+uint8_t StringExtractor::GetHexU8(uint8_t fail_value, bool set_eof_on_fail) {
+ // On success, fail_value will be overwritten with the next
+ // character in the stream
+ GetHexU8Ex(fail_value, set_eof_on_fail);
+ return fail_value;
}
-bool
-StringExtractor::GetHexU8Ex (uint8_t& ch, bool set_eof_on_fail)
-{
- int byte = DecodeHexU8();
- if (byte == -1)
- {
- if (set_eof_on_fail || m_index >= m_packet.size())
- m_index = UINT64_MAX;
- // ch should not be changed in case of failure
- return false;
- }
- ch = (uint8_t)byte;
- return true;
+bool StringExtractor::GetHexU8Ex(uint8_t &ch, bool set_eof_on_fail) {
+ int byte = DecodeHexU8();
+ if (byte == -1) {
+ if (set_eof_on_fail || m_index >= m_packet.size())
+ m_index = UINT64_MAX;
+ // ch should not be changed in case of failure
+ return false;
+ }
+ ch = (uint8_t)byte;
+ return true;
}
-uint32_t
-StringExtractor::GetU32 (uint32_t fail_value, int base)
-{
- if (m_index < m_packet.size())
- {
- char *end = nullptr;
- const char *start = m_packet.c_str();
- const char *cstr = start + m_index;
- uint32_t result = static_cast<uint32_t>(::strtoul (cstr, &end, base));
-
- if (end && end != cstr)
- {
- m_index = end - start;
- return result;
- }
- }
- return fail_value;
-}
+uint32_t StringExtractor::GetU32(uint32_t fail_value, int base) {
+ if (m_index < m_packet.size()) {
+ char *end = nullptr;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ uint32_t result = static_cast<uint32_t>(::strtoul(cstr, &end, base));
-int32_t
-StringExtractor::GetS32 (int32_t fail_value, int base)
-{
- if (m_index < m_packet.size())
- {
- char *end = nullptr;
- const char *start = m_packet.c_str();
- const char *cstr = start + m_index;
- int32_t result = static_cast<int32_t>(::strtol (cstr, &end, base));
-
- if (end && end != cstr)
- {
- m_index = end - start;
- return result;
- }
+ if (end && end != cstr) {
+ m_index = end - start;
+ return result;
}
- return fail_value;
+ }
+ return fail_value;
}
+int32_t StringExtractor::GetS32(int32_t fail_value, int base) {
+ if (m_index < m_packet.size()) {
+ char *end = nullptr;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ int32_t result = static_cast<int32_t>(::strtol(cstr, &end, base));
-uint64_t
-StringExtractor::GetU64 (uint64_t fail_value, int base)
-{
- if (m_index < m_packet.size())
- {
- char *end = nullptr;
- 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;
- }
+ if (end && end != cstr) {
+ m_index = end - start;
+ return result;
}
- return fail_value;
+ }
+ return fail_value;
}
-int64_t
-StringExtractor::GetS64 (int64_t fail_value, int base)
-{
- if (m_index < m_packet.size())
- {
- char *end = nullptr;
- 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;
- }
+uint64_t StringExtractor::GetU64(uint64_t fail_value, int base) {
+ if (m_index < m_packet.size()) {
+ char *end = nullptr;
+ 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;
+ }
+ return fail_value;
}
+int64_t StringExtractor::GetS64(int64_t fail_value, int base) {
+ if (m_index < m_packet.size()) {
+ char *end = nullptr;
+ const char *start = m_packet.c_str();
+ const char *cstr = start + m_index;
+ int64_t result = ::strtoll(cstr, &end, base);
-uint32_t
-StringExtractor::GetHexMaxU32 (bool little_endian, uint32_t fail_value)
-{
- uint32_t result = 0;
- uint32_t nibble_count = 0;
-
- SkipSpaces();
- if (little_endian)
- {
- uint32_t shift_amount = 0;
- while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- // Make sure we don't exceed the size of a uint32_t...
- if (nibble_count >= (sizeof(uint32_t) * 2))
- {
- m_index = UINT64_MAX;
- return fail_value;
- }
-
- uint8_t nibble_lo;
- uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]);
- ++m_index;
- if (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- nibble_lo = xdigit_to_sint (m_packet[m_index]);
- ++m_index;
- result |= ((uint32_t)nibble_hi << (shift_amount + 4));
- result |= ((uint32_t)nibble_lo << shift_amount);
- nibble_count += 2;
- shift_amount += 8;
- }
- else
- {
- result |= ((uint32_t)nibble_hi << shift_amount);
- nibble_count += 1;
- shift_amount += 4;
- }
-
- }
+ if (end && end != cstr) {
+ m_index = end - start;
+ return result;
}
- else
- {
- while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- // Make sure we don't exceed the size of a uint32_t...
- if (nibble_count >= (sizeof(uint32_t) * 2))
- {
- m_index = UINT64_MAX;
- return fail_value;
- }
-
- uint8_t nibble = xdigit_to_sint (m_packet[m_index]);
- // Big Endian
- result <<= 4;
- result |= nibble;
-
- ++m_index;
- ++nibble_count;
- }
- }
- return result;
+ }
+ return fail_value;
}
-uint64_t
-StringExtractor::GetHexMaxU64 (bool little_endian, uint64_t fail_value)
-{
- uint64_t result = 0;
- uint32_t nibble_count = 0;
-
- SkipSpaces();
- if (little_endian)
- {
- uint32_t shift_amount = 0;
- while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- // Make sure we don't exceed the size of a uint64_t...
- if (nibble_count >= (sizeof(uint64_t) * 2))
- {
- m_index = UINT64_MAX;
- return fail_value;
- }
-
- uint8_t nibble_lo;
- uint8_t nibble_hi = xdigit_to_sint (m_packet[m_index]);
- ++m_index;
- if (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- nibble_lo = xdigit_to_sint (m_packet[m_index]);
- ++m_index;
- result |= ((uint64_t)nibble_hi << (shift_amount + 4));
- result |= ((uint64_t)nibble_lo << shift_amount);
- nibble_count += 2;
- shift_amount += 8;
- }
- else
- {
- result |= ((uint64_t)nibble_hi << shift_amount);
- nibble_count += 1;
- shift_amount += 4;
- }
-
- }
+uint32_t StringExtractor::GetHexMaxU32(bool little_endian,
+ uint32_t fail_value) {
+ uint32_t result = 0;
+ uint32_t nibble_count = 0;
+
+ SkipSpaces();
+ if (little_endian) {
+ uint32_t shift_amount = 0;
+ while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ // Make sure we don't exceed the size of a uint32_t...
+ if (nibble_count >= (sizeof(uint32_t) * 2)) {
+ m_index = UINT64_MAX;
+ return fail_value;
+ }
+
+ uint8_t nibble_lo;
+ uint8_t nibble_hi = xdigit_to_sint(m_packet[m_index]);
+ ++m_index;
+ if (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ nibble_lo = xdigit_to_sint(m_packet[m_index]);
+ ++m_index;
+ result |= ((uint32_t)nibble_hi << (shift_amount + 4));
+ result |= ((uint32_t)nibble_lo << shift_amount);
+ nibble_count += 2;
+ shift_amount += 8;
+ } else {
+ result |= ((uint32_t)nibble_hi << shift_amount);
+ nibble_count += 1;
+ shift_amount += 4;
+ }
}
- else
- {
- while (m_index < m_packet.size() && ::isxdigit (m_packet[m_index]))
- {
- // Make sure we don't exceed the size of a uint64_t...
- if (nibble_count >= (sizeof(uint64_t) * 2))
- {
- m_index = UINT64_MAX;
- return fail_value;
- }
-
- uint8_t nibble = xdigit_to_sint (m_packet[m_index]);
- // Big Endian
- result <<= 4;
- result |= nibble;
-
- ++m_index;
- ++nibble_count;
- }
+ } else {
+ while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ // Make sure we don't exceed the size of a uint32_t...
+ if (nibble_count >= (sizeof(uint32_t) * 2)) {
+ m_index = UINT64_MAX;
+ return fail_value;
+ }
+
+ uint8_t nibble = xdigit_to_sint(m_packet[m_index]);
+ // Big Endian
+ result <<= 4;
+ result |= nibble;
+
+ ++m_index;
+ ++nibble_count;
}
- return result;
+ }
+ return result;
}
-size_t
-StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_value)
-{
- uint8_t *dst = (uint8_t*)dst_void;
- size_t bytes_extracted = 0;
- while (bytes_extracted < dst_len && GetBytesLeft ())
- {
- dst[bytes_extracted] = GetHexU8 (fail_fill_value);
- if (IsGood())
- ++bytes_extracted;
- else
- break;
+uint64_t StringExtractor::GetHexMaxU64(bool little_endian,
+ uint64_t fail_value) {
+ uint64_t result = 0;
+ uint32_t nibble_count = 0;
+
+ SkipSpaces();
+ if (little_endian) {
+ uint32_t shift_amount = 0;
+ while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ // Make sure we don't exceed the size of a uint64_t...
+ if (nibble_count >= (sizeof(uint64_t) * 2)) {
+ m_index = UINT64_MAX;
+ return fail_value;
+ }
+
+ uint8_t nibble_lo;
+ uint8_t nibble_hi = xdigit_to_sint(m_packet[m_index]);
+ ++m_index;
+ if (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ nibble_lo = xdigit_to_sint(m_packet[m_index]);
+ ++m_index;
+ result |= ((uint64_t)nibble_hi << (shift_amount + 4));
+ result |= ((uint64_t)nibble_lo << shift_amount);
+ nibble_count += 2;
+ shift_amount += 8;
+ } else {
+ result |= ((uint64_t)nibble_hi << shift_amount);
+ nibble_count += 1;
+ shift_amount += 4;
+ }
}
+ } else {
+ while (m_index < m_packet.size() && ::isxdigit(m_packet[m_index])) {
+ // Make sure we don't exceed the size of a uint64_t...
+ if (nibble_count >= (sizeof(uint64_t) * 2)) {
+ m_index = UINT64_MAX;
+ return fail_value;
+ }
+
+ uint8_t nibble = xdigit_to_sint(m_packet[m_index]);
+ // Big Endian
+ result <<= 4;
+ result |= nibble;
+
+ ++m_index;
+ ++nibble_count;
+ }
+ }
+ return result;
+}
- for (size_t i = bytes_extracted; i < dst_len; ++i)
- dst[i] = fail_fill_value;
-
- return bytes_extracted;
+size_t StringExtractor::GetHexBytes(llvm::MutableArrayRef<uint8_t> dest,
+ uint8_t fail_fill_value) {
+ size_t bytes_extracted = 0;
+ while (!dest.empty() && GetBytesLeft() > 0) {
+ dest[0] = GetHexU8(fail_fill_value);
+ if (!IsGood())
+ break;
+ ++bytes_extracted;
+ dest = dest.drop_front();
+ }
+
+ if (!dest.empty())
+ ::memset(dest.data(), fail_fill_value, dest.size());
+
+ return bytes_extracted;
}
//----------------------------------------------------------------------
@@ -377,125 +305,116 @@ StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_
//
// Returns the number of bytes successfully decoded
//----------------------------------------------------------------------
-size_t
-StringExtractor::GetHexBytesAvail (void *dst_void, size_t dst_len)
-{
- uint8_t *dst = (uint8_t*)dst_void;
- size_t bytes_extracted = 0;
- while (bytes_extracted < dst_len)
- {
- int decode = DecodeHexU8();
- if (decode == -1)
- {
- break;
- }
- dst[bytes_extracted++] = (uint8_t)decode;
- }
- return bytes_extracted;
+size_t StringExtractor::GetHexBytesAvail(llvm::MutableArrayRef<uint8_t> dest) {
+ size_t bytes_extracted = 0;
+ while (!dest.empty()) {
+ int decode = DecodeHexU8();
+ if (decode == -1)
+ break;
+ dest[0] = (uint8_t)decode;
+ dest = dest.drop_front();
+ ++bytes_extracted;
+ }
+ return bytes_extracted;
}
// Consume ASCII hex nibble character pairs until we have decoded byte_size
// bytes of data.
-uint64_t
-StringExtractor::GetHexWithFixedSize (uint32_t byte_size, bool little_endian, uint64_t fail_value)
-{
- if (byte_size <= 8 && GetBytesLeft() >= byte_size * 2)
- {
- uint64_t result = 0;
- uint32_t i;
- if (little_endian)
- {
- // Little Endian
- uint32_t shift_amount;
- for (i = 0, shift_amount = 0;
- i < byte_size && IsGood();
- ++i, shift_amount += 8)
- {
- result |= ((uint64_t)GetHexU8() << shift_amount);
- }
- }
- else
- {
- // Big Endian
- for (i = 0; i < byte_size && IsGood(); ++i)
- {
- result <<= 8;
- result |= GetHexU8();
- }
- }
+uint64_t StringExtractor::GetHexWithFixedSize(uint32_t byte_size,
+ bool little_endian,
+ uint64_t fail_value) {
+ if (byte_size <= 8 && GetBytesLeft() >= byte_size * 2) {
+ uint64_t result = 0;
+ uint32_t i;
+ if (little_endian) {
+ // Little Endian
+ uint32_t shift_amount;
+ for (i = 0, shift_amount = 0; i < byte_size && IsGood();
+ ++i, shift_amount += 8) {
+ result |= ((uint64_t)GetHexU8() << shift_amount);
+ }
+ } else {
+ // Big Endian
+ for (i = 0; i < byte_size && IsGood(); ++i) {
+ result <<= 8;
+ result |= GetHexU8();
+ }
}
- m_index = UINT64_MAX;
- return fail_value;
+ }
+ m_index = UINT64_MAX;
+ return fail_value;
}
-size_t
-StringExtractor::GetHexByteString (std::string &str)
-{
- str.clear();
- char ch;
- while ((ch = GetHexU8()) != '\0')
- str.append(1, ch);
- return str.size();
+size_t StringExtractor::GetHexByteString(std::string &str) {
+ str.clear();
+ str.reserve(GetBytesLeft() / 2);
+ char ch;
+ while ((ch = GetHexU8()) != '\0')
+ str.append(1, ch);
+ return str.size();
}
-size_t
-StringExtractor::GetHexByteStringFixedLength (std::string &str, uint32_t nibble_length)
-{
- str.clear();
+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)
- {}
+ 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();
+ 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();
+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();
-}
-bool
-StringExtractor::GetNameColonValue (std::string &name, std::string &value)
-{
- // Read something in the form of NNNN:VVVV; where NNNN is any character
- // that is not a colon, followed by a ':' character, then a value (one or
- // more ';' chars), followed by a ';'
- if (m_index < m_packet.size())
- {
- const size_t colon_idx = m_packet.find (':', m_index);
- if (colon_idx != std::string::npos)
- {
- const size_t semicolon_idx = m_packet.find (';', colon_idx);
- if (semicolon_idx != std::string::npos)
- {
- name.assign (m_packet, m_index, colon_idx - m_index);
- value.assign (m_packet, colon_idx + 1, semicolon_idx - (colon_idx + 1));
- m_index = semicolon_idx + 1;
- return true;
- }
- }
- }
- m_index = UINT64_MAX;
- return false;
+ str.clear();
+ return str.size();
}
-void
-StringExtractor::SkipSpaces ()
-{
- const size_t n = m_packet.size();
- while (m_index < n && isspace(m_packet[m_index]))
- ++m_index;
+bool StringExtractor::GetNameColonValue(llvm::StringRef &name,
+ llvm::StringRef &value) {
+ // Read something in the form of NNNN:VVVV; where NNNN is any character
+ // that is not a colon, followed by a ':' character, then a value (one or
+ // more ';' chars), followed by a ';'
+ if (m_index >= m_packet.size())
+ return fail();
+
+ llvm::StringRef view(m_packet);
+ if (view.empty())
+ return fail();
+
+ llvm::StringRef a, b, c, d;
+ view = view.substr(m_index);
+ std::tie(a, b) = view.split(':');
+ if (a.empty() || b.empty())
+ return fail();
+ std::tie(c, d) = b.split(';');
+ if (b == c && d.empty())
+ return fail();
+
+ name = a;
+ value = c;
+ if (d.empty())
+ m_index = m_packet.size();
+ else {
+ size_t bytes_consumed = d.data() - view.data();
+ m_index += bytes_consumed;
+ }
+ return true;
}
+void StringExtractor::SkipSpaces() {
+ const size_t n = m_packet.size();
+ while (m_index < n && isspace(m_packet[m_index]))
+ ++m_index;
+}
diff --git a/source/Utility/StringExtractorGDBRemote.cpp b/source/Utility/StringExtractorGDBRemote.cpp
index d2619afd5bfa3..dd13be9a763e6 100644
--- a/source/Utility/StringExtractorGDBRemote.cpp
+++ b/source/Utility/StringExtractorGDBRemote.cpp
@@ -16,505 +16,552 @@
#include "Utility/StringExtractorGDBRemote.h"
StringExtractorGDBRemote::ResponseType
-StringExtractorGDBRemote::GetResponseType () const
-{
- if (m_packet.empty())
- return eUnsupported;
+StringExtractorGDBRemote::GetResponseType() const {
+ if (m_packet.empty())
+ return eUnsupported;
+
+ switch (m_packet[0]) {
+ case 'E':
+ if (m_packet.size() == 3 && isxdigit(m_packet[1]) && isxdigit(m_packet[2]))
+ return eError;
+ break;
+
+ case 'O':
+ if (m_packet.size() == 2 && m_packet[1] == 'K')
+ return eOK;
+ break;
+
+ case '+':
+ if (m_packet.size() == 1)
+ return eAck;
+ break;
+
+ case '-':
+ if (m_packet.size() == 1)
+ return eNack;
+ break;
+ }
+ return eResponse;
+}
+
+StringExtractorGDBRemote::ServerPacketType
+StringExtractorGDBRemote::GetServerPacketType() const {
+#define PACKET_MATCHES(s) \
+ ((packet_size == (sizeof(s) - 1)) && (strcmp((packet_cstr), (s)) == 0))
+#define PACKET_STARTS_WITH(s) \
+ ((packet_size >= (sizeof(s) - 1)) && \
+ ::strncmp(packet_cstr, s, (sizeof(s) - 1)) == 0)
+
+ // Empty is not a supported packet...
+ if (m_packet.empty())
+ return eServerPacketType_invalid;
+
+ const size_t packet_size = m_packet.size();
+ const char *packet_cstr = m_packet.c_str();
+ switch (m_packet[0]) {
+
+ case '%':
+ return eServerPacketType_notify;
+
+ case '\x03':
+ if (packet_size == 1)
+ return eServerPacketType_interrupt;
+ break;
+
+ case '-':
+ if (packet_size == 1)
+ return eServerPacketType_nack;
+ break;
+
+ case '+':
+ if (packet_size == 1)
+ return eServerPacketType_ack;
+ break;
+
+ case 'A':
+ return eServerPacketType_A;
+
+ case 'Q':
- switch (m_packet[0])
- {
+ switch (packet_cstr[1]) {
case 'E':
- if (m_packet.size() == 3 &&
- isxdigit(m_packet[1]) &&
- isxdigit(m_packet[2]))
- return eError;
- break;
-
- case 'O':
- if (m_packet.size() == 2 && m_packet[1] == 'K')
- return eOK;
- break;
-
- case '+':
- if (m_packet.size() == 1)
- return eAck;
- break;
-
- case '-':
- if (m_packet.size() == 1)
- return eNack;
- break;
+ if (PACKET_STARTS_WITH("QEnvironment:"))
+ return eServerPacketType_QEnvironment;
+ if (PACKET_STARTS_WITH("QEnvironmentHexEncoded:"))
+ return eServerPacketType_QEnvironmentHexEncoded;
+ break;
+
+ case 'S':
+ 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;
+ if (PACKET_STARTS_WITH("QSetWorkingDir:"))
+ return eServerPacketType_QSetWorkingDir;
+ if (PACKET_STARTS_WITH("QSetLogging:"))
+ return eServerPacketType_QSetLogging;
+ if (PACKET_STARTS_WITH("QSetMaxPacketSize:"))
+ return eServerPacketType_QSetMaxPacketSize;
+ if (PACKET_STARTS_WITH("QSetMaxPayloadSize:"))
+ return eServerPacketType_QSetMaxPayloadSize;
+ if (PACKET_STARTS_WITH("QSetEnableAsyncProfiling;"))
+ return eServerPacketType_QSetEnableAsyncProfiling;
+ if (PACKET_STARTS_WITH("QSyncThreadState:"))
+ return eServerPacketType_QSyncThreadState;
+ break;
+
+ case 'L':
+ if (PACKET_STARTS_WITH("QLaunchArch:"))
+ return eServerPacketType_QLaunchArch;
+ if (PACKET_MATCHES("QListThreadsInStopReply"))
+ return eServerPacketType_QListThreadsInStopReply;
+ break;
+
+ case 'R':
+ if (PACKET_STARTS_WITH("QRestoreRegisterState:"))
+ return eServerPacketType_QRestoreRegisterState;
+ break;
+
+ case 'T':
+ if (PACKET_MATCHES("QThreadSuffixSupported"))
+ return eServerPacketType_QThreadSuffixSupported;
+ break;
}
- return eResponse;
-}
+ break;
+
+ case 'q':
+ switch (packet_cstr[1]) {
+ case 's':
+ if (PACKET_MATCHES("qsProcessInfo"))
+ return eServerPacketType_qsProcessInfo;
+ if (PACKET_MATCHES("qsThreadInfo"))
+ return eServerPacketType_qsThreadInfo;
+ break;
+
+ case 'f':
+ if (PACKET_STARTS_WITH("qfProcessInfo"))
+ return eServerPacketType_qfProcessInfo;
+ if (PACKET_STARTS_WITH("qfThreadInfo"))
+ return eServerPacketType_qfThreadInfo;
+ break;
+
+ case 'C':
+ if (packet_size == 2)
+ return eServerPacketType_qC;
+ break;
-StringExtractorGDBRemote::ServerPacketType
-StringExtractorGDBRemote::GetServerPacketType () const
-{
-#define PACKET_MATCHES(s) ((packet_size == (sizeof(s)-1)) && (strcmp((packet_cstr),(s)) == 0))
-#define PACKET_STARTS_WITH(s) ((packet_size >= (sizeof(s)-1)) && ::strncmp(packet_cstr, s, (sizeof(s)-1))==0)
-
- // Empty is not a supported packet...
- if (m_packet.empty())
- return eServerPacketType_invalid;
-
- const size_t packet_size = m_packet.size();
- const char *packet_cstr = m_packet.c_str();
- switch (m_packet[0])
- {
-
- case '%':
- return eServerPacketType_notify;
-
- case '\x03':
- if (packet_size == 1) return eServerPacketType_interrupt;
- break;
-
- case '-':
- if (packet_size == 1) return eServerPacketType_nack;
- break;
-
- case '+':
- if (packet_size == 1) return eServerPacketType_ack;
- break;
-
- case 'A':
- return eServerPacketType_A;
+ case 'E':
+ if (PACKET_STARTS_WITH("qEcho:"))
+ return eServerPacketType_qEcho;
+ break;
+
+ case 'F':
+ if (PACKET_STARTS_WITH("qFileLoadAddress:"))
+ return eServerPacketType_qFileLoadAddress;
+ break;
+
+ case 'G':
+ if (PACKET_STARTS_WITH("qGroupName:"))
+ return eServerPacketType_qGroupName;
+ if (PACKET_MATCHES("qGetWorkingDir"))
+ return eServerPacketType_qGetWorkingDir;
+ if (PACKET_MATCHES("qGetPid"))
+ return eServerPacketType_qGetPid;
+ if (PACKET_STARTS_WITH("qGetProfileData;"))
+ return eServerPacketType_qGetProfileData;
+ if (PACKET_MATCHES("qGDBServerVersion"))
+ return eServerPacketType_qGDBServerVersion;
+ break;
+
+ case 'H':
+ if (PACKET_MATCHES("qHostInfo"))
+ return eServerPacketType_qHostInfo;
+ break;
+
+ case 'K':
+ if (PACKET_STARTS_WITH("qKillSpawnedProcess"))
+ return eServerPacketType_qKillSpawnedProcess;
+ break;
+
+ case 'L':
+ if (PACKET_STARTS_WITH("qLaunchGDBServer"))
+ return eServerPacketType_qLaunchGDBServer;
+ if (PACKET_MATCHES("qLaunchSuccess"))
+ return eServerPacketType_qLaunchSuccess;
+ break;
+
+ case 'M':
+ if (PACKET_STARTS_WITH("qMemoryRegionInfo:"))
+ return eServerPacketType_qMemoryRegionInfo;
+ if (PACKET_MATCHES("qMemoryRegionInfo"))
+ return eServerPacketType_qMemoryRegionInfoSupported;
+ if (PACKET_STARTS_WITH("qModuleInfo:"))
+ return eServerPacketType_qModuleInfo;
+ break;
+
+ case 'P':
+ if (PACKET_STARTS_WITH("qProcessInfoPID:"))
+ return eServerPacketType_qProcessInfoPID;
+ if (PACKET_STARTS_WITH("qPlatform_shell:"))
+ return eServerPacketType_qPlatform_shell;
+ if (PACKET_STARTS_WITH("qPlatform_mkdir:"))
+ return eServerPacketType_qPlatform_mkdir;
+ if (PACKET_STARTS_WITH("qPlatform_chmod:"))
+ return eServerPacketType_qPlatform_chmod;
+ if (PACKET_MATCHES("qProcessInfo"))
+ return eServerPacketType_qProcessInfo;
+ break;
case 'Q':
-
- switch (packet_cstr[1])
- {
- case 'E':
- if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment;
- if (PACKET_STARTS_WITH ("QEnvironmentHexEncoded:")) return eServerPacketType_QEnvironmentHexEncoded;
- break;
-
- case 'S':
- 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;
- if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir;
- if (PACKET_STARTS_WITH ("QSetLogging:")) return eServerPacketType_QSetLogging;
- if (PACKET_STARTS_WITH ("QSetMaxPacketSize:")) return eServerPacketType_QSetMaxPacketSize;
- if (PACKET_STARTS_WITH ("QSetMaxPayloadSize:")) return eServerPacketType_QSetMaxPayloadSize;
- if (PACKET_STARTS_WITH ("QSetEnableAsyncProfiling;")) return eServerPacketType_QSetEnableAsyncProfiling;
- if (PACKET_STARTS_WITH ("QSyncThreadState:")) return eServerPacketType_QSyncThreadState;
- break;
-
- case 'L':
- if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch;
- if (PACKET_MATCHES("QListThreadsInStopReply")) return eServerPacketType_QListThreadsInStopReply;
- break;
-
- case 'R':
- if (PACKET_STARTS_WITH ("QRestoreRegisterState:")) return eServerPacketType_QRestoreRegisterState;
- break;
-
- case 'T':
- if (PACKET_MATCHES ("QThreadSuffixSupported")) return eServerPacketType_QThreadSuffixSupported;
- break;
- }
- break;
-
- case 'q':
- switch (packet_cstr[1])
- {
- case 's':
- if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo;
- if (PACKET_MATCHES ("qsThreadInfo")) return eServerPacketType_qsThreadInfo;
- break;
-
- case 'f':
- if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo;
- if (PACKET_STARTS_WITH ("qfThreadInfo")) return eServerPacketType_qfThreadInfo;
- break;
-
- case 'C':
- if (packet_size == 2) return eServerPacketType_qC;
- break;
-
- case 'E':
- if (PACKET_STARTS_WITH ("qEcho:")) return eServerPacketType_qEcho;
- break;
-
- case 'F':
- if (PACKET_STARTS_WITH ("qFileLoadAddress:")) return eServerPacketType_qFileLoadAddress;
- break;
-
- case 'G':
- if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName;
- if (PACKET_MATCHES ("qGetWorkingDir")) return eServerPacketType_qGetWorkingDir;
- if (PACKET_MATCHES ("qGetPid")) return eServerPacketType_qGetPid;
- if (PACKET_STARTS_WITH ("qGetProfileData;")) return eServerPacketType_qGetProfileData;
- if (PACKET_MATCHES ("qGDBServerVersion")) return eServerPacketType_qGDBServerVersion;
- break;
-
- case 'H':
- if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
- break;
-
- case 'K':
- if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess;
- break;
-
- case 'L':
- if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
- if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
- break;
-
- case 'M':
- if (PACKET_STARTS_WITH ("qMemoryRegionInfo:")) return eServerPacketType_qMemoryRegionInfo;
- if (PACKET_MATCHES ("qMemoryRegionInfo")) return eServerPacketType_qMemoryRegionInfoSupported;
- if (PACKET_STARTS_WITH ("qModuleInfo:")) return eServerPacketType_qModuleInfo;
- break;
-
- case 'P':
- if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
- if (PACKET_STARTS_WITH ("qPlatform_shell:")) return eServerPacketType_qPlatform_shell;
- if (PACKET_STARTS_WITH ("qPlatform_mkdir:")) return eServerPacketType_qPlatform_mkdir;
- if (PACKET_STARTS_WITH ("qPlatform_chmod:")) return eServerPacketType_qPlatform_chmod;
- if (PACKET_MATCHES ("qProcessInfo")) return eServerPacketType_qProcessInfo;
- break;
-
- case 'Q':
- if (PACKET_MATCHES ("qQueryGDBServer")) return eServerPacketType_qQueryGDBServer;
- break;
-
- case 'R':
- if (PACKET_STARTS_WITH ("qRcmd,")) return eServerPacketType_qRcmd;
- if (PACKET_STARTS_WITH ("qRegisterInfo")) return eServerPacketType_qRegisterInfo;
- break;
-
- case 'S':
- 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;
-
- case 'T':
- if (PACKET_STARTS_WITH ("qThreadExtraInfo,")) return eServerPacketType_qThreadExtraInfo;
- if (PACKET_STARTS_WITH ("qThreadStopInfo")) return eServerPacketType_qThreadStopInfo;
- break;
-
- case 'U':
- if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName;
- break;
-
- case 'V':
- if (PACKET_MATCHES ("qVAttachOrWaitSupported")) return eServerPacketType_qVAttachOrWaitSupported;
- break;
-
- case 'W':
- 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 'j':
- if (PACKET_MATCHES("jSignalsInfo")) return eServerPacketType_jSignalsInfo;
- if (PACKET_MATCHES("jThreadsInfo")) return eServerPacketType_jThreadsInfo;
- 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;
- else if (PACKET_STARTS_WITH("vFile:symlink")) return eServerPacketType_vFile_symlink;
- else if (PACKET_STARTS_WITH("vFile:unlink")) return eServerPacketType_vFile_unlink;
-
- } else {
- if (PACKET_STARTS_WITH ("vAttach;")) return eServerPacketType_vAttach;
- if (PACKET_STARTS_WITH ("vAttachWait;")) return eServerPacketType_vAttachWait;
- if (PACKET_STARTS_WITH ("vAttachOrWait;")) return eServerPacketType_vAttachOrWait;
- if (PACKET_STARTS_WITH ("vAttachName;")) return eServerPacketType_vAttachName;
- if (PACKET_STARTS_WITH("vCont;")) return eServerPacketType_vCont;
- if (PACKET_MATCHES ("vCont?")) return eServerPacketType_vCont_actions;
- }
- break;
- case '_':
- switch (packet_cstr[1])
- {
- case 'M':
- return eServerPacketType__M;
-
- case 'm':
- return eServerPacketType__m;
- }
- break;
-
- case '?':
- if (packet_size == 1) return eServerPacketType_stop_reason;
- break;
-
- case 'c':
- return eServerPacketType_c;
-
- case 'C':
- return eServerPacketType_C;
-
- case 'D':
- if (packet_size == 1) return eServerPacketType_D;
- break;
-
- case 'g':
- if (packet_size == 1) return eServerPacketType_g;
- break;
-
- case 'G':
- return eServerPacketType_G;
-
- case 'H':
- return eServerPacketType_H;
-
- case 'I':
- return eServerPacketType_I;
-
- case 'k':
- if (packet_size == 1) return eServerPacketType_k;
- break;
-
- case 'm':
- return eServerPacketType_m;
-
- case 'M':
- return eServerPacketType_M;
-
- case 'p':
- return eServerPacketType_p;
-
- case 'P':
- return eServerPacketType_P;
-
- case 's':
- if (packet_size == 1) return eServerPacketType_s;
- break;
-
- case 'S':
- return eServerPacketType_S;
-
- case 'x':
- return eServerPacketType_x;
-
- case 'X':
- return eServerPacketType_X;
-
- case 'T':
- return eServerPacketType_T;
-
- case 'z':
- if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
- return eServerPacketType_z;
- break;
-
- case 'Z':
- if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
- return eServerPacketType_Z;
- break;
+ if (PACKET_MATCHES("qQueryGDBServer"))
+ return eServerPacketType_qQueryGDBServer;
+ break;
+
+ case 'R':
+ if (PACKET_STARTS_WITH("qRcmd,"))
+ return eServerPacketType_qRcmd;
+ if (PACKET_STARTS_WITH("qRegisterInfo"))
+ return eServerPacketType_qRegisterInfo;
+ break;
+
+ case 'S':
+ 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;
+
+ case 'T':
+ if (PACKET_STARTS_WITH("qThreadExtraInfo,"))
+ return eServerPacketType_qThreadExtraInfo;
+ if (PACKET_STARTS_WITH("qThreadStopInfo"))
+ return eServerPacketType_qThreadStopInfo;
+ break;
+
+ case 'U':
+ if (PACKET_STARTS_WITH("qUserName:"))
+ return eServerPacketType_qUserName;
+ break;
+
+ case 'V':
+ if (PACKET_MATCHES("qVAttachOrWaitSupported"))
+ return eServerPacketType_qVAttachOrWaitSupported;
+ break;
+
+ case 'W':
+ 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;
}
- return eServerPacketType_unimplemented;
-}
+ break;
+
+ case 'j':
+ if (PACKET_STARTS_WITH("jModulesInfo:"))
+ return eServerPacketType_jModulesInfo;
+ if (PACKET_MATCHES("jSignalsInfo"))
+ return eServerPacketType_jSignalsInfo;
+ if (PACKET_MATCHES("jThreadsInfo"))
+ return eServerPacketType_jThreadsInfo;
+ 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;
+ else if (PACKET_STARTS_WITH("vFile:symlink"))
+ return eServerPacketType_vFile_symlink;
+ else if (PACKET_STARTS_WITH("vFile:unlink"))
+ return eServerPacketType_vFile_unlink;
+
+ } else {
+ if (PACKET_STARTS_WITH("vAttach;"))
+ return eServerPacketType_vAttach;
+ if (PACKET_STARTS_WITH("vAttachWait;"))
+ return eServerPacketType_vAttachWait;
+ if (PACKET_STARTS_WITH("vAttachOrWait;"))
+ return eServerPacketType_vAttachOrWait;
+ if (PACKET_STARTS_WITH("vAttachName;"))
+ return eServerPacketType_vAttachName;
+ if (PACKET_STARTS_WITH("vCont;"))
+ return eServerPacketType_vCont;
+ if (PACKET_MATCHES("vCont?"))
+ return eServerPacketType_vCont_actions;
+ }
+ break;
+ case '_':
+ switch (packet_cstr[1]) {
+ case 'M':
+ return eServerPacketType__M;
+
+ case 'm':
+ return eServerPacketType__m;
+ }
+ break;
+
+ case '?':
+ if (packet_size == 1)
+ return eServerPacketType_stop_reason;
+ break;
+
+ case 'c':
+ return eServerPacketType_c;
+
+ case 'C':
+ return eServerPacketType_C;
+
+ case 'D':
+ if (packet_size == 1)
+ return eServerPacketType_D;
+ break;
-bool
-StringExtractorGDBRemote::IsOKResponse() const
-{
- return GetResponseType () == eOK;
+ case 'g':
+ if (packet_size == 1)
+ return eServerPacketType_g;
+ break;
+
+ case 'G':
+ return eServerPacketType_G;
+
+ case 'H':
+ return eServerPacketType_H;
+
+ case 'I':
+ return eServerPacketType_I;
+
+ case 'k':
+ if (packet_size == 1)
+ return eServerPacketType_k;
+ break;
+
+ case 'm':
+ return eServerPacketType_m;
+
+ case 'M':
+ return eServerPacketType_M;
+
+ case 'p':
+ return eServerPacketType_p;
+
+ case 'P':
+ return eServerPacketType_P;
+
+ case 's':
+ if (packet_size == 1)
+ return eServerPacketType_s;
+ break;
+
+ case 'S':
+ return eServerPacketType_S;
+
+ case 'x':
+ return eServerPacketType_x;
+
+ case 'X':
+ return eServerPacketType_X;
+
+ case 'T':
+ return eServerPacketType_T;
+
+ case 'z':
+ if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
+ return eServerPacketType_z;
+ break;
+
+ case 'Z':
+ if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
+ return eServerPacketType_Z;
+ break;
+ }
+ return eServerPacketType_unimplemented;
}
+bool StringExtractorGDBRemote::IsOKResponse() const {
+ return GetResponseType() == eOK;
+}
-bool
-StringExtractorGDBRemote::IsUnsupportedResponse() const
-{
- return GetResponseType () == eUnsupported;
+bool StringExtractorGDBRemote::IsUnsupportedResponse() const {
+ return GetResponseType() == eUnsupported;
}
-bool
-StringExtractorGDBRemote::IsNormalResponse() const
-{
- return GetResponseType () == eResponse;
+bool StringExtractorGDBRemote::IsNormalResponse() const {
+ return GetResponseType() == eResponse;
}
-bool
-StringExtractorGDBRemote::IsErrorResponse() const
-{
- return GetResponseType () == eError &&
- m_packet.size() == 3 &&
- isxdigit(m_packet[1]) &&
- isxdigit(m_packet[2]);
+bool StringExtractorGDBRemote::IsErrorResponse() const {
+ return GetResponseType() == eError && m_packet.size() == 3 &&
+ isxdigit(m_packet[1]) && isxdigit(m_packet[2]);
}
-uint8_t
-StringExtractorGDBRemote::GetError ()
-{
- if (GetResponseType() == eError)
- {
- SetFilePos(1);
- return GetHexU8(255);
- }
- return 0;
+uint8_t StringExtractorGDBRemote::GetError() {
+ if (GetResponseType() == eError) {
+ SetFilePos(1);
+ return GetHexU8(255);
+ }
+ return 0;
}
-size_t
-StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str)
-{
- // Just get the data bytes in the string as GDBRemoteCommunication::CheckForPacket()
- // already removes any 0x7d escaped characters. If any 0x7d characters are left in
- // the packet, then they are supposed to be there...
- str.clear();
- const size_t bytes_left = GetBytesLeft();
- if (bytes_left > 0)
- {
- str.assign(m_packet, m_index, bytes_left);
- m_index += bytes_left;
- }
- return str.size();
+size_t StringExtractorGDBRemote::GetEscapedBinaryData(std::string &str) {
+ // Just get the data bytes in the string as
+ // GDBRemoteCommunication::CheckForPacket()
+ // already removes any 0x7d escaped characters. If any 0x7d characters are
+ // left in
+ // the packet, then they are supposed to be there...
+ str.clear();
+ const size_t bytes_left = GetBytesLeft();
+ if (bytes_left > 0) {
+ str.assign(m_packet, m_index, bytes_left);
+ m_index += bytes_left;
+ }
+ return str.size();
}
static bool
-OKErrorNotSupportedResponseValidator(void *, const StringExtractorGDBRemote &response)
-{
- switch (response.GetResponseType())
- {
- case StringExtractorGDBRemote::eOK:
- case StringExtractorGDBRemote::eError:
- case StringExtractorGDBRemote::eUnsupported:
- return true;
-
- case StringExtractorGDBRemote::eAck:
- case StringExtractorGDBRemote::eNack:
- case StringExtractorGDBRemote::eResponse:
- break;
- }
- return false;
+OKErrorNotSupportedResponseValidator(void *,
+ const StringExtractorGDBRemote &response) {
+ switch (response.GetResponseType()) {
+ case StringExtractorGDBRemote::eOK:
+ case StringExtractorGDBRemote::eError:
+ case StringExtractorGDBRemote::eUnsupported:
+ return true;
+
+ case StringExtractorGDBRemote::eAck:
+ case StringExtractorGDBRemote::eNack:
+ case StringExtractorGDBRemote::eResponse:
+ break;
+ }
+ return false;
}
-static bool
-JSONResponseValidator(void *, const StringExtractorGDBRemote &response)
-{
- switch (response.GetResponseType())
- {
- case StringExtractorGDBRemote::eUnsupported:
- case StringExtractorGDBRemote::eError:
- return true; // Accept unsupported or EXX as valid responses
-
- case StringExtractorGDBRemote::eOK:
- case StringExtractorGDBRemote::eAck:
- case StringExtractorGDBRemote::eNack:
- break;
-
- case StringExtractorGDBRemote::eResponse:
- // JSON that is returned in from JSON query packets is currently always
- // either a dictionary which starts with a '{', or an array which
- // starts with a '['. This is a quick validator to just make sure the
- // response could be valid JSON without having to validate all of the
- // JSON content.
- switch (response.GetStringRef()[0])
- {
- case '{': return true;
- case '[': return true;
- default:
- break;
- }
- break;
+static bool JSONResponseValidator(void *,
+ const StringExtractorGDBRemote &response) {
+ switch (response.GetResponseType()) {
+ case StringExtractorGDBRemote::eUnsupported:
+ case StringExtractorGDBRemote::eError:
+ return true; // Accept unsupported or EXX as valid responses
+
+ case StringExtractorGDBRemote::eOK:
+ case StringExtractorGDBRemote::eAck:
+ case StringExtractorGDBRemote::eNack:
+ break;
+
+ case StringExtractorGDBRemote::eResponse:
+ // JSON that is returned in from JSON query packets is currently always
+ // either a dictionary which starts with a '{', or an array which
+ // starts with a '['. This is a quick validator to just make sure the
+ // response could be valid JSON without having to validate all of the
+ // JSON content.
+ switch (response.GetStringRef()[0]) {
+ case '{':
+ return true;
+ case '[':
+ return true;
+ default:
+ break;
}
- return false;
+ break;
+ }
+ return false;
}
static bool
-ASCIIHexBytesResponseValidator(void *, const StringExtractorGDBRemote &response)
-{
- switch (response.GetResponseType())
- {
- case StringExtractorGDBRemote::eUnsupported:
- case StringExtractorGDBRemote::eError:
- return true; // Accept unsupported or EXX as valid responses
-
- case StringExtractorGDBRemote::eOK:
- case StringExtractorGDBRemote::eAck:
- case StringExtractorGDBRemote::eNack:
- break;
-
- case StringExtractorGDBRemote::eResponse:
- {
- uint32_t valid_count = 0;
- for (const char ch : response.GetStringRef())
- {
- if (!isxdigit(ch))
- {
- return false;
- }
- if (++valid_count >= 16)
- break; // Don't validate all the characters in case the packet is very large
- }
- return true;
- }
- break;
+ASCIIHexBytesResponseValidator(void *,
+ const StringExtractorGDBRemote &response) {
+ switch (response.GetResponseType()) {
+ case StringExtractorGDBRemote::eUnsupported:
+ case StringExtractorGDBRemote::eError:
+ return true; // Accept unsupported or EXX as valid responses
+
+ case StringExtractorGDBRemote::eOK:
+ case StringExtractorGDBRemote::eAck:
+ case StringExtractorGDBRemote::eNack:
+ break;
+
+ case StringExtractorGDBRemote::eResponse: {
+ uint32_t valid_count = 0;
+ for (const char ch : response.GetStringRef()) {
+ if (!isxdigit(ch)) {
+ return false;
+ }
+ if (++valid_count >= 16)
+ break; // Don't validate all the characters in case the packet is very
+ // large
}
- return false;
+ return true;
+ } break;
+ }
+ return false;
}
-void
-StringExtractorGDBRemote::CopyResponseValidator(const StringExtractorGDBRemote& rhs)
-{
- m_validator = rhs.m_validator;
- m_validator_baton = rhs.m_validator_baton;
+void StringExtractorGDBRemote::CopyResponseValidator(
+ const StringExtractorGDBRemote &rhs) {
+ m_validator = rhs.m_validator;
+ m_validator_baton = rhs.m_validator_baton;
}
-void
-StringExtractorGDBRemote::SetResponseValidator(ResponseValidatorCallback callback, void *baton)
-{
- m_validator = callback;
- m_validator_baton = baton;
+void StringExtractorGDBRemote::SetResponseValidator(
+ ResponseValidatorCallback callback, void *baton) {
+ m_validator = callback;
+ m_validator_baton = baton;
}
-void
-StringExtractorGDBRemote::SetResponseValidatorToOKErrorNotSupported()
-{
- m_validator = OKErrorNotSupportedResponseValidator;
- m_validator_baton = nullptr;
+void StringExtractorGDBRemote::SetResponseValidatorToOKErrorNotSupported() {
+ m_validator = OKErrorNotSupportedResponseValidator;
+ m_validator_baton = nullptr;
}
-void
-StringExtractorGDBRemote::SetResponseValidatorToASCIIHexBytes()
-{
- m_validator = ASCIIHexBytesResponseValidator;
- m_validator_baton = nullptr;
+void StringExtractorGDBRemote::SetResponseValidatorToASCIIHexBytes() {
+ m_validator = ASCIIHexBytesResponseValidator;
+ m_validator_baton = nullptr;
}
-void
-StringExtractorGDBRemote::SetResponseValidatorToJSON()
-{
- m_validator = JSONResponseValidator;
- m_validator_baton = nullptr;
+void StringExtractorGDBRemote::SetResponseValidatorToJSON() {
+ m_validator = JSONResponseValidator;
+ m_validator_baton = nullptr;
}
-bool
-StringExtractorGDBRemote::ValidateResponse() const
-{
- // If we have a validator callback, try to validate the callback
- if (m_validator)
- return m_validator(m_validator_baton, *this);
- else
- return true; // No validator, so response is valid
+bool StringExtractorGDBRemote::ValidateResponse() const {
+ // If we have a validator callback, try to validate the callback
+ if (m_validator)
+ return m_validator(m_validator_baton, *this);
+ else
+ return true; // No validator, so response is valid
}
-
-
diff --git a/source/Utility/StringExtractorGDBRemote.h b/source/Utility/StringExtractorGDBRemote.h
index ade0edbbb7aed..ce12660f0d359 100644
--- a/source/Utility/StringExtractorGDBRemote.h
+++ b/source/Utility/StringExtractorGDBRemote.h
@@ -17,207 +17,176 @@
// Project includes
#include "lldb/Utility/StringExtractor.h"
-class StringExtractorGDBRemote : public StringExtractor
-{
+class StringExtractorGDBRemote : public StringExtractor {
public:
- typedef bool (*ResponseValidatorCallback)(void * baton, const StringExtractorGDBRemote &response);
-
- StringExtractorGDBRemote() :
- StringExtractor(),
- m_validator(nullptr)
- {
- }
-
- StringExtractorGDBRemote(const char *cstr) :
- StringExtractor(cstr),
- m_validator(nullptr)
- {
- }
-
- StringExtractorGDBRemote(const StringExtractorGDBRemote& rhs) :
- StringExtractor(rhs),
- m_validator(rhs.m_validator)
- {
- }
-
- virtual ~StringExtractorGDBRemote()
- {
- }
-
- bool
- ValidateResponse() const;
-
- void
- CopyResponseValidator(const StringExtractorGDBRemote& rhs);
-
- void
- SetResponseValidator(ResponseValidatorCallback callback, void *baton);
-
- void
- SetResponseValidatorToOKErrorNotSupported();
-
- void
- SetResponseValidatorToASCIIHexBytes();
-
- void
- SetResponseValidatorToJSON();
-
- enum ServerPacketType
- {
- eServerPacketType_nack = 0,
- eServerPacketType_ack,
- eServerPacketType_invalid,
- eServerPacketType_unimplemented,
- eServerPacketType_interrupt, // CTRL+c packet or "\x03"
- eServerPacketType_A, // Program arguments packet
- eServerPacketType_qfProcessInfo,
- eServerPacketType_qsProcessInfo,
- eServerPacketType_qC,
- eServerPacketType_qEcho,
- eServerPacketType_qGroupName,
- eServerPacketType_qHostInfo,
- eServerPacketType_qLaunchGDBServer,
- eServerPacketType_qQueryGDBServer,
- eServerPacketType_qKillSpawnedProcess,
- eServerPacketType_qLaunchSuccess,
- eServerPacketType_qModuleInfo,
- eServerPacketType_qProcessInfoPID,
- eServerPacketType_qSpeedTest,
- eServerPacketType_qUserName,
- eServerPacketType_qGetWorkingDir,
- eServerPacketType_qFileLoadAddress,
- eServerPacketType_QEnvironment,
- eServerPacketType_QLaunchArch,
- eServerPacketType_QSetDisableASLR,
- eServerPacketType_QSetDetachOnError,
- eServerPacketType_QSetSTDIN,
- eServerPacketType_QSetSTDOUT,
- eServerPacketType_QSetSTDERR,
- eServerPacketType_QSetWorkingDir,
- eServerPacketType_QStartNoAckMode,
- eServerPacketType_qPlatform_shell,
- eServerPacketType_qPlatform_mkdir,
- eServerPacketType_qPlatform_chmod,
- 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,
- eServerPacketType_vFile_symlink,
- eServerPacketType_vFile_unlink,
- // debug server packages
- eServerPacketType_QEnvironmentHexEncoded,
- eServerPacketType_QListThreadsInStopReply,
- eServerPacketType_QRestoreRegisterState,
- eServerPacketType_QSaveRegisterState,
- eServerPacketType_QSetLogging,
- eServerPacketType_QSetMaxPacketSize,
- eServerPacketType_QSetMaxPayloadSize,
- eServerPacketType_QSetEnableAsyncProfiling,
- eServerPacketType_QSyncThreadState,
- eServerPacketType_QThreadSuffixSupported,
-
- eServerPacketType_jThreadsInfo,
- eServerPacketType_qsThreadInfo,
- eServerPacketType_qfThreadInfo,
- eServerPacketType_qGetPid,
- eServerPacketType_qGetProfileData,
- eServerPacketType_qGDBServerVersion,
- eServerPacketType_qMemoryRegionInfo,
- eServerPacketType_qMemoryRegionInfoSupported,
- eServerPacketType_qProcessInfo,
- eServerPacketType_qRcmd,
- 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_jSignalsInfo,
-
- eServerPacketType_vAttach,
- eServerPacketType_vAttachWait,
- eServerPacketType_vAttachOrWait,
- eServerPacketType_vAttachName,
- eServerPacketType_vCont,
- eServerPacketType_vCont_actions, // vCont?
-
- eServerPacketType_stop_reason, // '?'
-
- eServerPacketType_c,
- eServerPacketType_C,
- eServerPacketType_D,
- eServerPacketType_g,
- eServerPacketType_G,
- eServerPacketType_H,
- eServerPacketType_I, // stdin notification
- eServerPacketType_k,
- eServerPacketType_m,
- eServerPacketType_M,
- eServerPacketType_p,
- eServerPacketType_P,
- eServerPacketType_s,
- eServerPacketType_S,
- eServerPacketType_T,
- eServerPacketType_x,
- eServerPacketType_X,
- eServerPacketType_Z,
- eServerPacketType_z,
-
- eServerPacketType__M,
- eServerPacketType__m,
- eServerPacketType_notify, // '%' notification
- };
-
- ServerPacketType
- GetServerPacketType () const;
-
- enum ResponseType
- {
- eUnsupported = 0,
- eAck,
- eNack,
- eError,
- eOK,
- eResponse
- };
-
- ResponseType
- GetResponseType () const;
-
- bool
- IsOKResponse() const;
-
- bool
- IsUnsupportedResponse() const;
-
- bool
- IsNormalResponse () const;
-
- bool
- IsErrorResponse() const;
-
- // Returns zero if the packet isn't a EXX packet where XX are two hex
- // digits. Otherwise the error encoded in XX is returned.
- uint8_t
- GetError();
-
- size_t
- GetEscapedBinaryData (std::string &str);
+ typedef bool (*ResponseValidatorCallback)(
+ void *baton, const StringExtractorGDBRemote &response);
+
+ StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {}
+
+ StringExtractorGDBRemote(llvm::StringRef str)
+ : StringExtractor(str), m_validator(nullptr) {}
+
+ StringExtractorGDBRemote(const char *cstr)
+ : StringExtractor(cstr), m_validator(nullptr) {}
+
+ StringExtractorGDBRemote(const StringExtractorGDBRemote &rhs)
+ : StringExtractor(rhs), m_validator(rhs.m_validator) {}
+
+ virtual ~StringExtractorGDBRemote() {}
+
+ bool ValidateResponse() const;
+
+ void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
+
+ void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
+
+ void SetResponseValidatorToOKErrorNotSupported();
+
+ void SetResponseValidatorToASCIIHexBytes();
+
+ void SetResponseValidatorToJSON();
+
+ enum ServerPacketType {
+ eServerPacketType_nack = 0,
+ eServerPacketType_ack,
+ eServerPacketType_invalid,
+ eServerPacketType_unimplemented,
+ eServerPacketType_interrupt, // CTRL+c packet or "\x03"
+ eServerPacketType_A, // Program arguments packet
+ eServerPacketType_qfProcessInfo,
+ eServerPacketType_qsProcessInfo,
+ eServerPacketType_qC,
+ eServerPacketType_qEcho,
+ eServerPacketType_qGroupName,
+ eServerPacketType_qHostInfo,
+ eServerPacketType_qLaunchGDBServer,
+ eServerPacketType_qQueryGDBServer,
+ eServerPacketType_qKillSpawnedProcess,
+ eServerPacketType_qLaunchSuccess,
+ eServerPacketType_qModuleInfo,
+ eServerPacketType_qProcessInfoPID,
+ eServerPacketType_qSpeedTest,
+ eServerPacketType_qUserName,
+ eServerPacketType_qGetWorkingDir,
+ eServerPacketType_qFileLoadAddress,
+ eServerPacketType_QEnvironment,
+ eServerPacketType_QLaunchArch,
+ eServerPacketType_QSetDisableASLR,
+ eServerPacketType_QSetDetachOnError,
+ eServerPacketType_QSetSTDIN,
+ eServerPacketType_QSetSTDOUT,
+ eServerPacketType_QSetSTDERR,
+ eServerPacketType_QSetWorkingDir,
+ eServerPacketType_QStartNoAckMode,
+ eServerPacketType_qPlatform_shell,
+ eServerPacketType_qPlatform_mkdir,
+ eServerPacketType_qPlatform_chmod,
+ 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,
+ eServerPacketType_vFile_symlink,
+ eServerPacketType_vFile_unlink,
+ // debug server packages
+ eServerPacketType_QEnvironmentHexEncoded,
+ eServerPacketType_QListThreadsInStopReply,
+ eServerPacketType_QRestoreRegisterState,
+ eServerPacketType_QSaveRegisterState,
+ eServerPacketType_QSetLogging,
+ eServerPacketType_QSetMaxPacketSize,
+ eServerPacketType_QSetMaxPayloadSize,
+ eServerPacketType_QSetEnableAsyncProfiling,
+ eServerPacketType_QSyncThreadState,
+ eServerPacketType_QThreadSuffixSupported,
+
+ eServerPacketType_jThreadsInfo,
+ eServerPacketType_qsThreadInfo,
+ eServerPacketType_qfThreadInfo,
+ eServerPacketType_qGetPid,
+ eServerPacketType_qGetProfileData,
+ eServerPacketType_qGDBServerVersion,
+ eServerPacketType_qMemoryRegionInfo,
+ eServerPacketType_qMemoryRegionInfoSupported,
+ eServerPacketType_qProcessInfo,
+ eServerPacketType_qRcmd,
+ 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_jSignalsInfo,
+ eServerPacketType_jModulesInfo,
+
+ eServerPacketType_vAttach,
+ eServerPacketType_vAttachWait,
+ eServerPacketType_vAttachOrWait,
+ eServerPacketType_vAttachName,
+ eServerPacketType_vCont,
+ eServerPacketType_vCont_actions, // vCont?
+
+ eServerPacketType_stop_reason, // '?'
+
+ eServerPacketType_c,
+ eServerPacketType_C,
+ eServerPacketType_D,
+ eServerPacketType_g,
+ eServerPacketType_G,
+ eServerPacketType_H,
+ eServerPacketType_I, // stdin notification
+ eServerPacketType_k,
+ eServerPacketType_m,
+ eServerPacketType_M,
+ eServerPacketType_p,
+ eServerPacketType_P,
+ eServerPacketType_s,
+ eServerPacketType_S,
+ eServerPacketType_T,
+ eServerPacketType_x,
+ eServerPacketType_X,
+ eServerPacketType_Z,
+ eServerPacketType_z,
+
+ eServerPacketType__M,
+ eServerPacketType__m,
+ eServerPacketType_notify, // '%' notification
+ };
+
+ ServerPacketType GetServerPacketType() const;
+
+ enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
+
+ ResponseType GetResponseType() const;
+
+ bool IsOKResponse() const;
+
+ bool IsUnsupportedResponse() const;
+
+ bool IsNormalResponse() const;
+
+ bool IsErrorResponse() const;
+
+ // Returns zero if the packet isn't a EXX packet where XX are two hex
+ // digits. Otherwise the error encoded in XX is returned.
+ uint8_t GetError();
+
+ size_t GetEscapedBinaryData(std::string &str);
protected:
- ResponseValidatorCallback m_validator;
- void *m_validator_baton;
+ ResponseValidatorCallback m_validator;
+ void *m_validator_baton;
};
-#endif // utility_StringExtractorGDBRemote_h_
+#endif // utility_StringExtractorGDBRemote_h_
diff --git a/source/Utility/StringLexer.cpp b/source/Utility/StringLexer.cpp
index 2f62d2cedb401..ec18f049476e5 100644
--- a/source/Utility/StringLexer.cpp
+++ b/source/Utility/StringLexer.cpp
@@ -1,4 +1,5 @@
-//===--------------------- StringLexer.cpp -----------------------*- C++ -*-===//
+//===--------------------- StringLexer.cpp -----------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -14,116 +15,79 @@
using namespace lldb_utility;
-StringLexer::StringLexer (std::string s) :
- m_data(s),
- m_position(0)
-{ }
+StringLexer::StringLexer(std::string s) : m_data(s), m_position(0) {}
-StringLexer::StringLexer (const StringLexer& rhs) :
- m_data(rhs.m_data),
- m_position(rhs.m_position)
-{ }
+StringLexer::StringLexer(const StringLexer &rhs)
+ : m_data(rhs.m_data), m_position(rhs.m_position) {}
-StringLexer::Character
-StringLexer::Peek ()
-{
- return m_data[m_position];
-}
+StringLexer::Character StringLexer::Peek() { return m_data[m_position]; }
-bool
-StringLexer::NextIf (Character c)
-{
- auto val = Peek();
- if (val == c)
- {
- Next();
- return true;
- }
- return false;
+bool StringLexer::NextIf(Character c) {
+ auto val = Peek();
+ if (val == c) {
+ Next();
+ return true;
+ }
+ return false;
}
std::pair<bool, StringLexer::Character>
-StringLexer::NextIf (std::initializer_list<Character> cs)
-{
- auto val = Peek();
- for (auto c : cs)
- {
- if (val == c)
- {
- Next();
- return {true,c};
- }
+StringLexer::NextIf(std::initializer_list<Character> cs) {
+ auto val = Peek();
+ for (auto c : cs) {
+ if (val == c) {
+ Next();
+ return {true, c};
}
- return {false,0};
+ }
+ return {false, 0};
}
-bool
-StringLexer::AdvanceIf (const std::string& token)
-{
- auto pos = m_position;
- bool matches = true;
- for (auto c : token)
- {
- if (!NextIf(c))
- {
- matches = false;
- break;
- }
- }
- if (!matches)
- {
- m_position = pos;
- return false;
+bool StringLexer::AdvanceIf(const std::string &token) {
+ auto pos = m_position;
+ bool matches = true;
+ for (auto c : token) {
+ if (!NextIf(c)) {
+ matches = false;
+ break;
}
- return true;
+ }
+ if (!matches) {
+ m_position = pos;
+ return false;
+ }
+ return true;
}
-StringLexer::Character
-StringLexer::Next ()
-{
- auto val = Peek();
- Consume();
- return val;
+StringLexer::Character StringLexer::Next() {
+ auto val = Peek();
+ Consume();
+ return val;
}
-bool
-StringLexer::HasAtLeast (Size s)
-{
- return (m_data.size() - m_position) >= s;
+bool StringLexer::HasAtLeast(Size s) {
+ return (m_data.size() - m_position) >= s;
}
-void
-StringLexer::PutBack (Size s)
-{
- assert (m_position >= s);
- m_position -= s;
+void StringLexer::PutBack(Size s) {
+ assert(m_position >= s);
+ m_position -= s;
}
-bool
-StringLexer::HasAny (Character c)
-{
- return m_data.find(c, m_position) != std::string::npos;
+bool StringLexer::HasAny(Character c) {
+ return m_data.find(c, m_position) != std::string::npos;
}
-std::string
-StringLexer::GetUnlexed ()
-{
- return std::string(m_data, m_position);
+std::string StringLexer::GetUnlexed() {
+ return std::string(m_data, m_position);
}
-void
-StringLexer::Consume()
-{
- m_position++;
-}
+void StringLexer::Consume() { m_position++; }
-StringLexer&
-StringLexer::operator = (const StringLexer& rhs)
-{
- if (this != &rhs)
- {
- m_data = rhs.m_data;
- m_position = rhs.m_position;
- }
- return *this;
+StringLexer &StringLexer::operator=(const StringLexer &rhs) {
+ if (this != &rhs) {
+ m_data = rhs.m_data;
+ m_position = rhs.m_position;
+ }
+ return *this;
}
diff --git a/source/Utility/TaskPool.cpp b/source/Utility/TaskPool.cpp
index c5c63a20cebca..f66f7bf9170d8 100644
--- a/source/Utility/TaskPool.cpp
+++ b/source/Utility/TaskPool.cpp
@@ -9,81 +9,63 @@
#include "lldb/Utility/TaskPool.h"
-namespace
-{
- class TaskPoolImpl
- {
- public:
- static TaskPoolImpl&
- GetInstance();
+namespace {
+class TaskPoolImpl {
+public:
+ static TaskPoolImpl &GetInstance();
- void
- AddTask(std::function<void()>&& task_fn);
+ void AddTask(std::function<void()> &&task_fn);
- private:
- TaskPoolImpl();
+private:
+ TaskPoolImpl();
- static void
- Worker(TaskPoolImpl* pool);
+ static void Worker(TaskPoolImpl *pool);
- std::queue<std::function<void()>> m_tasks;
- std::mutex m_tasks_mutex;
- uint32_t m_thread_count;
- };
+ std::queue<std::function<void()>> m_tasks;
+ std::mutex m_tasks_mutex;
+ uint32_t m_thread_count;
+};
} // end of anonymous namespace
-TaskPoolImpl&
-TaskPoolImpl::GetInstance()
-{
- static TaskPoolImpl g_task_pool_impl;
- return g_task_pool_impl;
+TaskPoolImpl &TaskPoolImpl::GetInstance() {
+ static TaskPoolImpl g_task_pool_impl;
+ return g_task_pool_impl;
}
-void
-TaskPool::AddTaskImpl(std::function<void()>&& task_fn)
-{
- TaskPoolImpl::GetInstance().AddTask(std::move(task_fn));
+void TaskPool::AddTaskImpl(std::function<void()> &&task_fn) {
+ TaskPoolImpl::GetInstance().AddTask(std::move(task_fn));
}
-TaskPoolImpl::TaskPoolImpl() :
- m_thread_count(0)
-{
-}
+TaskPoolImpl::TaskPoolImpl() : m_thread_count(0) {}
-void
-TaskPoolImpl::AddTask(std::function<void()>&& task_fn)
-{
- static const uint32_t max_threads = std::thread::hardware_concurrency();
+void TaskPoolImpl::AddTask(std::function<void()> &&task_fn) {
+ static const uint32_t max_threads = std::thread::hardware_concurrency();
- std::unique_lock<std::mutex> lock(m_tasks_mutex);
- m_tasks.emplace(std::move(task_fn));
- if (m_thread_count < max_threads)
- {
- m_thread_count++;
- // Note that this detach call needs to happen with the m_tasks_mutex held. This prevents the thread
- // from exiting prematurely and triggering a linux libc bug
- // (https://sourceware.org/bugzilla/show_bug.cgi?id=19951).
- std::thread (Worker, this).detach();
- }
+ std::unique_lock<std::mutex> lock(m_tasks_mutex);
+ m_tasks.emplace(std::move(task_fn));
+ if (m_thread_count < max_threads) {
+ m_thread_count++;
+ // Note that this detach call needs to happen with the m_tasks_mutex held.
+ // This prevents the thread
+ // from exiting prematurely and triggering a linux libc bug
+ // (https://sourceware.org/bugzilla/show_bug.cgi?id=19951).
+ std::thread(Worker, this).detach();
+ }
}
-void
-TaskPoolImpl::Worker(TaskPoolImpl* pool)
-{
- while (true)
- {
- std::unique_lock<std::mutex> lock(pool->m_tasks_mutex);
- if (pool->m_tasks.empty())
- {
- pool->m_thread_count--;
- break;
- }
+void TaskPoolImpl::Worker(TaskPoolImpl *pool) {
+ while (true) {
+ std::unique_lock<std::mutex> lock(pool->m_tasks_mutex);
+ if (pool->m_tasks.empty()) {
+ pool->m_thread_count--;
+ break;
+ }
- std::function<void()> f = pool->m_tasks.front();
- pool->m_tasks.pop();
- lock.unlock();
+ std::function<void()> f = pool->m_tasks.front();
+ pool->m_tasks.pop();
+ lock.unlock();
- f();
- }
+ f();
+ }
}
diff --git a/source/Utility/TimeSpecTimeout.cpp b/source/Utility/TimeSpecTimeout.cpp
deleted file mode 100644
index 33b3b4e6c3911..0000000000000
--- a/source/Utility/TimeSpecTimeout.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-//===--------------------- TimeSpecTimeout.cpp ------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "TimeSpecTimeout.h"
-
-using namespace lldb_private;
-
-const struct timespec *
-TimeSpecTimeout::SetAbsoluteTimeoutMircoSeconds32 (uint32_t timeout_usec)
-{
- if (timeout_usec == UINT32_MAX)
- {
- m_infinite = true;
- }
- else
- {
- m_infinite = false;
- TimeValue time_value(TimeValue::Now());
- time_value.OffsetWithMicroSeconds(timeout_usec);
- m_timespec = time_value.GetAsTimeSpec();
- }
- return GetTimeSpecPtr ();
-}
-
-const struct timespec *
-TimeSpecTimeout::SetRelativeTimeoutMircoSeconds32 (uint32_t timeout_usec)
-{
- if (timeout_usec == UINT32_MAX)
- {
- m_infinite = true;
- }
- else
- {
- m_infinite = false;
- TimeValue time_value;
- time_value.OffsetWithMicroSeconds(timeout_usec);
- m_timespec = time_value.GetAsTimeSpec();
- }
- return GetTimeSpecPtr ();
-}
-
-
diff --git a/source/Utility/TimeSpecTimeout.h b/source/Utility/TimeSpecTimeout.h
deleted file mode 100644
index 388ccc179c171..0000000000000
--- a/source/Utility/TimeSpecTimeout.h
+++ /dev/null
@@ -1,90 +0,0 @@
-//===--------------------- TimeSpecTimeout.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_TimeSpecTimeout_h_
-#define utility_TimeSpecTimeout_h_
-
-#include "lldb/Host/TimeValue.h"
-
-namespace lldb_private {
-
-class TimeSpecTimeout
-{
-public:
- TimeSpecTimeout() :
- m_infinite (false)
- {
- m_timespec.tv_sec = 0;
- m_timespec.tv_nsec = 0;
- }
- ~TimeSpecTimeout()
- {
- }
-
- //----------------------------------------------------------------------
- /// Sets the timespec pointer correctly given a timeout relative to the
- /// current time. This function should be called immediately prior to
- /// calling the function you will use this timeout with since time can
- /// elapse between when this function is called and when the timeout is
- /// used.
- ///
- /// @param[in] timeout_usec
- /// The timeout in micro seconds. If timeout_usec is UINT32_MAX, the
- /// timeout should be set to INFINITE. Otherwise the current time is
- /// filled into the timespec and \a timeout_usec is added to the
- /// current time.
- ///
- /// @return
- /// If the timeout is INFINITE, then return NULL, otherwise return
- /// a pointer to the timespec with the appropriate timeout value.
- //----------------------------------------------------------------------
- const struct timespec *
- SetAbsoluteTimeoutMircoSeconds32 (uint32_t timeout_usec);
-
- //----------------------------------------------------------------------
- /// Sets the timespec pointer correctly given a relative time in micro
- /// seconds.
- ///
- /// @param[in] timeout_usec
- /// The timeout in micro seconds. If timeout_usec is UINT32_MAX, the
- /// timeout should be set to INFINITE. Otherwise \a timeout_usec
- /// is correctly placed into the timespec.
- ///
- /// @return
- /// If the timeout is INFINITE, then return NULL, otherwise return
- /// a pointer to the timespec with the appropriate timeout value.
- //----------------------------------------------------------------------
- const struct timespec *
- SetRelativeTimeoutMircoSeconds32 (uint32_t timeout_usec);
-
- //----------------------------------------------------------------------
- /// Gets the timespec pointer that is appropriate for the timeout
- /// specified. This function should only be used after a call to
- /// SetRelativeTimeoutXXX() functions.
- ///
- /// @return
- /// If the timeout is INFINITE, then return NULL, otherwise return
- /// a pointer to the timespec with the appropriate timeout value.
- //----------------------------------------------------------------------
- const struct timespec *
- GetTimeSpecPtr () const
- {
- if (m_infinite)
- return nullptr;
- return &m_timespec;
- }
-
-protected:
- struct timespec m_timespec;
- bool m_infinite;
-};
-
-} // namespace lldb_private
-
-#endif // #ifndef utility_TimeSpecTimeout_h_
diff --git a/source/Utility/UriParser.cpp b/source/Utility/UriParser.cpp
index 77e16b02aaedf..a1d6e4c3d8595 100644
--- a/source/Utility/UriParser.cpp
+++ b/source/Utility/UriParser.cpp
@@ -23,72 +23,55 @@ using namespace lldb_private;
//----------------------------------------------------------------------
// UriParser::Parse
//----------------------------------------------------------------------
-bool
-UriParser::Parse(const std::string& uri,
- std::string& scheme,
- std::string& hostname,
- int& port,
- std::string& path)
-{
- std::string tmp_scheme, tmp_hostname, tmp_port, tmp_path;
+bool UriParser::Parse(llvm::StringRef uri, llvm::StringRef &scheme,
+ llvm::StringRef &hostname, int &port,
+ llvm::StringRef &path) {
+ llvm::StringRef tmp_scheme, tmp_hostname, tmp_port, tmp_path;
- static const char* kSchemeSep = "://";
- auto pos = uri.find(kSchemeSep);
- if (pos == std::string::npos)
- return false;
+ const llvm::StringRef kSchemeSep("://");
+ auto pos = uri.find(kSchemeSep);
+ if (pos == std::string::npos)
+ return false;
- // Extract path.
- tmp_scheme = uri.substr(0, pos);
- auto host_pos = pos + strlen(kSchemeSep);
- auto path_pos = uri.find('/', host_pos);
- if (path_pos != std::string::npos)
- tmp_path = uri.substr(path_pos);
- else
- tmp_path = "/";
+ // Extract path.
+ tmp_scheme = uri.substr(0, pos);
+ auto host_pos = pos + kSchemeSep.size();
+ auto path_pos = uri.find('/', host_pos);
+ if (path_pos != std::string::npos)
+ tmp_path = uri.substr(path_pos);
+ else
+ tmp_path = "/";
- auto host_port = uri.substr(
- host_pos, ((path_pos != std::string::npos) ? path_pos : uri.size()) - host_pos);
+ auto host_port = uri.substr(
+ host_pos,
+ ((path_pos != std::string::npos) ? path_pos : uri.size()) - host_pos);
- // Extract hostname
- if (host_port[0] == '[')
- {
- // hostname is enclosed with square brackets.
- pos = host_port.find(']');
- if (pos == std::string::npos)
- return false;
+ // Extract hostname
+ if (host_port[0] == '[') {
+ // hostname is enclosed with square brackets.
+ pos = host_port.find(']');
+ if (pos == std::string::npos)
+ return false;
- tmp_hostname = host_port.substr(1, pos - 1);
- host_port.erase(0, pos + 1);
- }
- else
- {
- pos = host_port.find(':');
- tmp_hostname = host_port.substr(0, (pos != std::string::npos) ? pos : host_port.size());
- host_port.erase(0, (pos != std::string::npos) ? pos : host_port.size());
- }
+ tmp_hostname = host_port.substr(1, pos - 1);
+ host_port = host_port.drop_front(pos + 1);
+ if (!host_port.empty() && !host_port.consume_front(":"))
+ return false;
+ } else {
+ std::tie(tmp_hostname, host_port) = host_port.split(':');
+ }
- // Extract port
- tmp_port = host_port;
- if (!tmp_port.empty())
- {
- if (tmp_port[0] != ':')
- return false;
- tmp_port = tmp_port.substr(1);
- bool success = false;
- auto port_tmp = StringConvert::ToUInt32(tmp_port.c_str(), UINT32_MAX, 10, &success);
- if (!success || port_tmp > 65535)
- {
- // there are invalid characters in port_buf
- return false;
- }
- port = port_tmp;
- }
- else
- port = -1;
+ // Extract port
+ if (!host_port.empty()) {
+ uint16_t port_value = 0;
+ if (host_port.getAsInteger(0, port_value))
+ return false;
+ port = port_value;
+ } else
+ port = -1;
- scheme = tmp_scheme;
- hostname = tmp_hostname;
- path = tmp_path;
- return true;
+ scheme = tmp_scheme;
+ hostname = tmp_hostname;
+ path = tmp_path;
+ return true;
}
-
diff --git a/source/Utility/UriParser.h b/source/Utility/UriParser.h
index 8cbaaeab18cdd..7ebf76f89cade 100644
--- a/source/Utility/UriParser.h
+++ b/source/Utility/UriParser.h
@@ -12,28 +12,25 @@
// C Includes
// C++ Includes
-#include <string>
// Other libraries and framework includes
+#include "llvm/ADT/StringRef.h"
+
// Project includes
-class UriParser
-{
+class UriParser {
public:
- // Parses
- // RETURN VALUE
- // if url is valid, function returns true and
- // scheme/hostname/port/path are set to the parsed values
- // port it set to -1 if it is not included in the URL
- //
- // if the url is invalid, function returns false and
- // output parameters remain unchanged
- static bool
- Parse(const std::string& uri,
- std::string& scheme,
- std::string& hostname,
- int& port,
- std::string& path);
+ // Parses
+ // RETURN VALUE
+ // if url is valid, function returns true and
+ // scheme/hostname/port/path are set to the parsed values
+ // port it set to -1 if it is not included in the URL
+ //
+ // if the url is invalid, function returns false and
+ // output parameters remain unchanged
+ static bool Parse(llvm::StringRef uri, llvm::StringRef &scheme,
+ llvm::StringRef &hostname, int &port,
+ llvm::StringRef &path);
};
-#endif // utility_UriParser_h_
+#endif // utility_UriParser_h_